r600: workout bitmask for the used tcs inputs/outputs.
authorDave Airlie <airlied@redhat.com>
Mon, 30 Nov 2015 04:44:30 +0000 (14:44 +1000)
committerDave Airlie <airlied@redhat.com>
Sun, 6 Dec 2015 23:59:00 +0000 (09:59 +1000)
This is used later to setup the constants to be given
to the tessellation shaders.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_state_common.c

index 068e2f8..ac06d1f 100644 (file)
@@ -330,6 +330,9 @@ struct r600_pipe_shader_selector {
        unsigned        gs_max_out_vertices;
        unsigned        gs_num_invocations;
 
+       /* TCS/VS */
+       uint64_t        lds_patch_outputs_written_mask;
+       uint64_t        lds_outputs_written_mask;
        unsigned        nr_ps_max_color_exports;
 };
 
index ab8a2c1..0c8ed52 100644 (file)
@@ -855,6 +855,7 @@ static void *r600_create_shader_state(struct pipe_context *ctx,
                               unsigned pipe_shader_type)
 {
        struct r600_pipe_shader_selector *sel = CALLOC_STRUCT(r600_pipe_shader_selector);
+       int i;
 
        sel->type = pipe_shader_type;
        sel->tokens = tgsi_dup_tokens(state->tokens);
@@ -870,6 +871,30 @@ static void *r600_create_shader_state(struct pipe_context *ctx,
                sel->gs_num_invocations =
                        sel->info.properties[TGSI_PROPERTY_GS_INVOCATIONS];
                break;
+       case PIPE_SHADER_VERTEX:
+       case PIPE_SHADER_TESS_CTRL:
+               sel->lds_patch_outputs_written_mask = 0;
+               sel->lds_outputs_written_mask = 0;
+
+               for (i = 0; i < sel->info.num_outputs; i++) {
+                       unsigned name = sel->info.output_semantic_name[i];
+                       unsigned index = sel->info.output_semantic_index[i];
+
+                       switch (name) {
+                       case TGSI_SEMANTIC_TESSINNER:
+                       case TGSI_SEMANTIC_TESSOUTER:
+                       case TGSI_SEMANTIC_PATCH:
+                               sel->lds_patch_outputs_written_mask |=
+                                       1llu << r600_get_lds_unique_index(name, index);
+                               break;
+                       default:
+                               sel->lds_outputs_written_mask |=
+                                       1llu << r600_get_lds_unique_index(name, index);
+                       }
+               }
+               break;
+       default:
+               break;
        }
 
        return sel;