r600g: Store the chip class in r600_pipe_context.
authorHenri Verbeet <hverbeet@gmail.com>
Sat, 9 Jul 2011 15:18:59 +0000 (17:18 +0200)
committerHenri Verbeet <hverbeet@gmail.com>
Sat, 9 Jul 2011 16:12:50 +0000 (18:12 +0200)
Signed-off-by: Henri Verbeet <hverbeet@gmail.com>
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/r600_asm.c
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_state.c
src/gallium/drivers/r600/r600_state_common.c

index 887f52e67db41ec753258d9253ae79e6c3380d74..97f10ce77b90c4bc117b4f8f25571955c8a6053c 100644 (file)
@@ -657,13 +657,11 @@ static void *evergreen_create_blend_state(struct pipe_context *ctx,
        u32 color_control, target_mask;
        /* FIXME there is more then 8 framebuffer */
        unsigned blend_cntl[8];
-       enum radeon_family family;
 
        if (blend == NULL) {
                return NULL;
        }
 
-       family = r600_get_family(rctx->radeon);
        rstate = &blend->rstate;
 
        rstate->id = R600_PIPE_STATE_BLEND;
@@ -690,7 +688,7 @@ static void *evergreen_create_blend_state(struct pipe_context *ctx,
        r600_pipe_state_add_reg(rstate, R_028808_CB_COLOR_CONTROL,
                                color_control, 0xFFFFFFFD, NULL);
 
-       if (family != CHIP_CAYMAN)
+       if (rctx->chip_class != CAYMAN)
                r600_pipe_state_add_reg(rstate, R_028C3C_PA_SC_AA_MASK, 0xFFFFFFFF, 0xFFFFFFFF, NULL);
        else {
                r600_pipe_state_add_reg(rstate, CM_R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, 0xFFFFFFFF, 0xFFFFFFFF, NULL);
@@ -827,9 +825,6 @@ static void *evergreen_create_rs_state(struct pipe_context *ctx,
        unsigned tmp;
        unsigned prov_vtx = 1, polygon_dual_mode;
        unsigned clip_rule;
-       enum radeon_family family;
-
-       family = r600_get_family(rctx->radeon);
 
        if (rs == NULL) {
                return NULL;
@@ -888,7 +883,7 @@ static void *evergreen_create_rs_state(struct pipe_context *ctx,
        tmp = (unsigned)state->line_width * 8;
        r600_pipe_state_add_reg(rstate, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp), 0xFFFFFFFF, NULL);
 
-       if (family == CHIP_CAYMAN) {
+       if (rctx->chip_class == CAYMAN) {
                r600_pipe_state_add_reg(rstate, CM_R_028BDC_PA_SC_LINE_CNTL, 0x00000400, 0xFFFFFFFF, NULL);
                r600_pipe_state_add_reg(rstate, CM_R_028BE4_PA_SU_VTX_CNTL,
                                        S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules),
@@ -1447,14 +1442,11 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
        struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
        struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
        u32 shader_mask, tl, br, target_mask;
-       enum radeon_family family;
        int tl_x, tl_y, br_x, br_y;
 
        if (rstate == NULL)
                return;
 
-       family = r600_get_family(rctx->radeon);
-
        evergreen_context_flush_dest_caches(&rctx->ctx);
        rctx->ctx.num_dest_buffers = state->nr_cbufs;
 
@@ -1491,7 +1483,7 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
        if (br_y == 0)
                tl_y = 1;
        /* cayman hw workaround */
-       if (family == CHIP_CAYMAN) {
+       if (rctx->chip_class == CAYMAN) {
                if (br_x == 1 && br_y == 1)
                        br_x = 2;
        }
@@ -1535,7 +1527,7 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
                                shader_mask, 0xFFFFFFFF, NULL);
 
 
-       if (family == CHIP_CAYMAN) {
+       if (rctx->chip_class == CAYMAN) {
                r600_pipe_state_add_reg(rstate, CM_R_028BE0_PA_SC_AA_CONFIG,
                                        0x00000000, 0xFFFFFFFF, NULL);
        } else {
@@ -1722,9 +1714,9 @@ void evergreen_init_config(struct r600_pipe_context *rctx)
        enum radeon_family family;
        unsigned tmp;
 
-       family = r600_get_family(rctx->radeon);
+       family = rctx->family;
 
-       if (family == CHIP_CAYMAN) {
+       if (rctx->chip_class == CAYMAN) {
                cayman_init_config(rctx);
                return;
        }
index 065f955ebcbf26556c355e295858d8bf182ef92a..cd4984e389a2b63a9871e7a43cededf76b9d9a84 100644 (file)
@@ -2162,7 +2162,7 @@ int r600_vertex_elements_build_fetch_shader(struct r600_pipe_context *rctx, stru
        struct r600_bc_vtx vtx;
        struct pipe_vertex_element *elements = ve->elements;
        const struct util_format_description *desc;
-       unsigned fetch_resource_start = rctx->family >= CHIP_CEDAR ? 0 : 160;
+       unsigned fetch_resource_start = rctx->chip_class >= EVERGREEN ? 0 : 160;
        unsigned format, num_format, format_comp, endian;
        u32 *bytecode;
        int i, r;
@@ -2287,7 +2287,7 @@ int r600_vertex_elements_build_fetch_shader(struct r600_pipe_context *rctx, stru
        r600_bo_unmap(rctx->radeon, ve->fetch_shader);
        r600_bc_clear(&bc);
 
-       if (rctx->family >= CHIP_CEDAR)
+       if (rctx->chip_class >= EVERGREEN)
                evergreen_fetch_shader(&rctx->context, ve);
        else
                r600_fetch_shader(&rctx->context, ve);
index d512268f63fb848feff57e053c423359eed3bb5e..a3df4f571a0d9a2ebe46de8006ebef60b28fffb0 100644 (file)
@@ -194,7 +194,6 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
 {
        struct r600_pipe_context *rctx = CALLOC_STRUCT(r600_pipe_context);
        struct r600_screen* rscreen = (struct r600_screen *)screen;
-       enum chip_class class;
 
        if (rctx == NULL)
                return NULL;
@@ -211,6 +210,7 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
        rctx->screen = rscreen;
        rctx->radeon = rscreen->radeon;
        rctx->family = r600_get_family(rctx->radeon);
+       rctx->chip_class = r600_get_family_class(rctx->radeon);
 
        rctx->fences.bo = NULL;
        rctx->fences.data = NULL;
@@ -224,47 +224,29 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
        r600_init_surface_functions(rctx);
        rctx->context.draw_vbo = r600_draw_vbo;
 
-       switch (r600_get_family(rctx->radeon)) {
-       case CHIP_R600:
-       case CHIP_RV610:
-       case CHIP_RV630:
-       case CHIP_RV670:
-       case CHIP_RV620:
-       case CHIP_RV635:
-       case CHIP_RS780:
-       case CHIP_RS880:
-       case CHIP_RV770:
-       case CHIP_RV730:
-       case CHIP_RV710:
-       case CHIP_RV740:
+       switch (rctx->chip_class) {
+       case R600:
+       case R700:
                r600_init_state_functions(rctx);
                if (r600_context_init(&rctx->ctx, rctx->radeon)) {
                        r600_destroy_context(&rctx->context);
                        return NULL;
                }
                r600_init_config(rctx);
+               rctx->custom_dsa_flush = r600_create_db_flush_dsa(rctx);
                break;
-       case CHIP_CEDAR:
-       case CHIP_REDWOOD:
-       case CHIP_JUNIPER:
-       case CHIP_CYPRESS:
-       case CHIP_HEMLOCK:
-       case CHIP_PALM:
-       case CHIP_SUMO:
-       case CHIP_SUMO2:
-       case CHIP_BARTS:
-       case CHIP_TURKS:
-       case CHIP_CAICOS:
-       case CHIP_CAYMAN:
+       case EVERGREEN:
+       case CAYMAN:
                evergreen_init_state_functions(rctx);
                if (evergreen_context_init(&rctx->ctx, rctx->radeon)) {
                        r600_destroy_context(&rctx->context);
                        return NULL;
                }
                evergreen_init_config(rctx);
+               rctx->custom_dsa_flush = evergreen_create_db_flush_dsa(rctx);
                break;
        default:
-               R600_ERR("unsupported family %d\n", r600_get_family(rctx->radeon));
+               R600_ERR("Unsupported chip class %d.\n", rctx->chip_class);
                r600_destroy_context(&rctx->context);
                return NULL;
        }
@@ -289,12 +271,6 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
                return NULL;
        }
 
-       class = r600_get_family_class(rctx->radeon);
-       if (class == R600 || class == R700)
-               rctx->custom_dsa_flush = r600_create_db_flush_dsa(rctx);
-       else
-               rctx->custom_dsa_flush = evergreen_create_db_flush_dsa(rctx);
-
        return &rctx->context;
 }
 
index b51fa24dfb25ecada5901405d71df2228b84880a..6f399ed43b0b29baf004033078793d3ee899401d 100644 (file)
@@ -176,6 +176,7 @@ struct r600_pipe_context {
        struct pipe_context             context;
        struct blitter_context          *blitter;
        enum radeon_family              family;
+       enum chip_class                 chip_class;
        void                            *custom_dsa_flush;
        struct r600_screen              *screen;
        struct radeon                   *radeon;
index 3085cd9a87a7c9856b431ebc45f1a523b10c7a9d..8a684e63c01c8a35584ebff80671a99a751f5de3 100644 (file)
@@ -1399,7 +1399,7 @@ static void r600_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta
        /* EXPORT_NORM is an optimzation that can be enabled for better
         * performance in certain cases
         */
-       if (rctx->family < CHIP_RV770) {
+       if (rctx->chip_class == R600) {
                /* EXPORT_NORM can be enabled if:
                 * - 11-bit or smaller UNORM/SNORM/SRGB
                 * - BLEND_CLAMP is enabled
@@ -1559,7 +1559,7 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx,
        r600_pipe_state_add_reg(rstate,
                                R_028200_PA_SC_WINDOW_OFFSET, 0x00000000,
                                0xFFFFFFFF, NULL);
-       if (rctx->family >= CHIP_RV770) {
+       if (rctx->chip_class >= R700) {
                r600_pipe_state_add_reg(rstate,
                                        R_028230_PA_SC_EDGERULE, 0xAAAAAAAA,
                                        0xFFFFFFFF, NULL);
@@ -1653,16 +1653,13 @@ void r600_init_state_functions(struct r600_pipe_context *rctx)
 
 void r600_adjust_gprs(struct r600_pipe_context *rctx)
 {
-       enum radeon_family family;
        struct r600_pipe_state rstate;
        unsigned num_ps_gprs = rctx->default_ps_gprs;
        unsigned num_vs_gprs = rctx->default_vs_gprs;
        unsigned tmp;
        int diff;
 
-       family = r600_get_family(rctx->radeon);
-
-       if (family >= CHIP_CEDAR)
+       if (rctx->chip_class >= EVERGREEN)
                return;
 
        if (!rctx->ps_shader && !rctx->vs_shader)
@@ -1714,7 +1711,7 @@ void r600_init_config(struct r600_pipe_context *rctx)
        struct r600_pipe_state *rstate = &rctx->config;
        u32 tmp;
 
-       family = r600_get_family(rctx->radeon);
+       family = rctx->family;
        ps_prio = 0;
        vs_prio = 1;
        gs_prio = 2;
@@ -1895,7 +1892,7 @@ void r600_init_config(struct r600_pipe_context *rctx)
        r600_pipe_state_add_reg(rstate, R_009714_VC_ENHANCE, 0x00000000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R_028350_SX_MISC, 0x00000000, 0xFFFFFFFF, NULL);
 
-       if (family >= CHIP_RV770) {
+       if (rctx->chip_class >= R700) {
                r600_pipe_state_add_reg(rstate, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0x00004000, 0xFFFFFFFF, NULL);
                r600_pipe_state_add_reg(rstate, R_009508_TA_CNTL_AUX,
                                        S_009508_DISABLE_CUBE_ANISO(1) |
index d9140403e5a52a8e76b2462715dba146698cfe26..408eaed491b2c79dcb1177a00f67c0c4d1909c8e 100644 (file)
@@ -109,7 +109,7 @@ void r600_bind_rs_state(struct pipe_context *ctx, void *state)
        rctx->states[rs->rstate.id] = &rs->rstate;
        r600_context_pipe_state_set(&rctx->ctx, &rs->rstate);
 
-       if (rctx->family >= CHIP_CEDAR) {
+       if (rctx->chip_class >= EVERGREEN) {
                evergreen_polygon_offset_update(rctx);
        } else {
                r600_polygon_offset_update(rctx);
@@ -212,7 +212,7 @@ void r600_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
        /* Zero states. */
        for (i = 0; i < count; i++) {
                if (!buffers[i].buffer) {
-                       if (rctx->family >= CHIP_CEDAR) {
+                       if (rctx->chip_class >= EVERGREEN) {
                                evergreen_context_pipe_state_set_fs_resource(&rctx->ctx, NULL, i);
                        } else {
                                r600_context_pipe_state_set_fs_resource(&rctx->ctx, NULL, i);
@@ -220,7 +220,7 @@ void r600_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
                }
        }
        for (; i < rctx->vbuf_mgr->nr_real_vertex_buffers; i++) {
-               if (rctx->family >= CHIP_CEDAR) {
+               if (rctx->chip_class >= EVERGREEN) {
                        evergreen_context_pipe_state_set_fs_resource(&rctx->ctx, NULL, i);
                } else {
                        r600_context_pipe_state_set_fs_resource(&rctx->ctx, NULL, i);
@@ -367,7 +367,7 @@ static void r600_spi_update(struct r600_pipe_context *rctx)
        for (i = 0; i < rshader->ninput; i++) {
                if (rshader->input[i].name == TGSI_SEMANTIC_POSITION ||
                    rshader->input[i].name == TGSI_SEMANTIC_FACE)
-                       if (rctx->family >= CHIP_CEDAR)
+                       if (rctx->chip_class >= EVERGREEN)
                                continue;
                        else
                                sid=0;
@@ -387,7 +387,7 @@ static void r600_spi_update(struct r600_pipe_context *rctx)
                        tmp |= S_028644_PT_SPRITE_TEX(1);
                }
 
-               if (rctx->family < CHIP_CEDAR) {
+               if (rctx->chip_class < EVERGREEN) {
                        if (rshader->input[i].centroid)
                                tmp |= S_028644_SEL_CENTROID(1);
 
@@ -434,14 +434,14 @@ void r600_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index,
 
                rstate = &rctx->vs_const_buffer_resource[index];
                if (!rstate->id) {
-                       if (rctx->family >= CHIP_CEDAR) {
+                       if (rctx->chip_class >= EVERGREEN) {
                                evergreen_pipe_init_buffer_resource(rctx, rstate);
                        } else {
                                r600_pipe_init_buffer_resource(rctx, rstate);
                        }
                }
 
-               if (rctx->family >= CHIP_CEDAR) {
+               if (rctx->chip_class >= EVERGREEN) {
                        evergreen_pipe_mod_buffer_resource(rstate, &rbuffer->r, offset, 16);
                        evergreen_context_pipe_state_set_vs_resource(&rctx->ctx, rstate, index);
                } else {
@@ -462,13 +462,13 @@ void r600_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index,
 
                rstate = &rctx->ps_const_buffer_resource[index];
                if (!rstate->id) {
-                       if (rctx->family >= CHIP_CEDAR) {
+                       if (rctx->chip_class >= EVERGREEN) {
                                evergreen_pipe_init_buffer_resource(rctx, rstate);
                        } else {
                                r600_pipe_init_buffer_resource(rctx, rstate);
                        }
                }
-               if (rctx->family >= CHIP_CEDAR) {
+               if (rctx->chip_class >= EVERGREEN) {
                        evergreen_pipe_mod_buffer_resource(rstate, &rbuffer->r, offset, 16);
                        evergreen_context_pipe_state_set_ps_resource(&rctx->ctx, rstate, index);
                } else {
@@ -521,14 +521,14 @@ static void r600_vertex_buffer_update(struct r600_pipe_context *rctx)
                offset += vertex_buffer->buffer_offset + r600_bo_offset(rbuffer->bo);
 
                if (!rstate->id) {
-                       if (rctx->family >= CHIP_CEDAR) {
+                       if (rctx->chip_class >= EVERGREEN) {
                                evergreen_pipe_init_buffer_resource(rctx, rstate);
                        } else {
                                r600_pipe_init_buffer_resource(rctx, rstate);
                        }
                }
 
-               if (rctx->family >= CHIP_CEDAR) {
+               if (rctx->chip_class >= EVERGREEN) {
                        evergreen_pipe_mod_buffer_resource(rstate, rbuffer, offset, vertex_buffer->stride);
                        evergreen_context_pipe_state_set_fs_resource(&rctx->ctx, rstate, i);
                } else {
@@ -600,7 +600,7 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
                r600_shader_rebuild(ctx, rctx->vs_shader);
 
        if ((rctx->ps_shader->shader.clamp_color != rctx->clamp_fragment_color) ||
-           ((rctx->family >= CHIP_CEDAR) && rctx->ps_shader->shader.fs_write_all &&
+           ((rctx->chip_class >= EVERGREEN) && rctx->ps_shader->shader.fs_write_all &&
             (rctx->ps_shader->shader.nr_cbufs != rctx->nr_cbufs)))
                r600_shader_rebuild(ctx, rctx->ps_shader);
 
@@ -655,7 +655,7 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
                rdraw.indices_bo_offset = draw.index_buffer_offset;
        }
 
-       if (rctx->family >= CHIP_CEDAR) {
+       if (rctx->chip_class >= EVERGREEN) {
                evergreen_context_draw(&rctx->ctx, &rdraw);
        } else {
                r600_context_draw(&rctx->ctx, &rdraw);