r600g: calculate correct cut value
authorDave Airlie <airlied@redhat.com>
Fri, 24 Jan 2014 07:14:26 +0000 (17:14 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 5 Feb 2014 00:49:41 +0000 (10:49 +1000)
This selects the cut value depending on the shader selected.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
src/gallium/drivers/r600/evergreen_state.c

index 2828a75078389ef6a4224e267e0e01264732bbe1..e23f434e671fd19dc80ac5eaba4ff4cf1594eb95 100644 (file)
@@ -2728,12 +2728,22 @@ static void evergreen_emit_shader_stages(struct r600_context *rctx, struct r600_
        uint32_t v = 0, v2 = 0, primid = 0;
 
        if (state->geom_enable) {
+               uint32_t cut_val;
+
+               if (rctx->gs_shader->current->shader.gs_max_out_vertices <= 128)
+                       cut_val = V_028A40_GS_CUT_128;
+               else if (rctx->gs_shader->current->shader.gs_max_out_vertices <= 256)
+                       cut_val = V_028A40_GS_CUT_256;
+               else if (rctx->gs_shader->current->shader.gs_max_out_vertices <= 512)
+                       cut_val = V_028A40_GS_CUT_512;
+               else
+                       cut_val = V_028A40_GS_CUT_1024;
                v = S_028B54_ES_EN(V_028B54_ES_STAGE_REAL) |
                        S_028B54_GS_EN(1) |
                        S_028B54_VS_EN(V_028B54_VS_STAGE_COPY_SHADER);
 
                v2 = S_028A40_MODE(V_028A40_GS_SCENARIO_G) |
-                       S_028A40_CUT_MODE(V_028A40_GS_CUT_128);
+                       S_028A40_CUT_MODE(cut_val);
 
                if (rctx->gs_shader->current->shader.gs_prim_id_input)
                        primid = 1;