summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2015-11-30 14:44:30 +1000
committerDave Airlie <airlied@redhat.com>2015-12-04 02:58:12 +0000
commit6d846e8277b31bf3be2136ff38030471eac6128b (patch)
treed9d2f744f3c08e0c703435b79029ebadd801e239
parent608cccb6bd59786cf560e3a89e5d74d52f069953 (diff)
r600: workout bitmask for the used tcs inputs/outputs.
This is used later to setup the constants to be given to the tessellation shaders. Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--src/gallium/drivers/r600/r600_pipe.h3
-rw-r--r--src/gallium/drivers/r600/r600_state_common.c25
2 files changed, 28 insertions, 0 deletions
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index 068e2f8a302..ac06d1f51b6 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -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;
};
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index 023332552a3..ac0b9fd862d 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -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;