diff options
author | Edward O'Callaghan <[email protected]> | 2015-08-29 18:31:08 +1000 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2015-08-30 11:41:00 +0200 |
commit | 3eed81a97b2fa1f98a2ae577b8b6e04cb144f31a (patch) | |
tree | b64b9a673f7b1d6b0a7063076cdcef4b6adf960b /src/gallium/drivers/r600 | |
parent | b4dee1b6360a91117c7a754ed70f359f6000a0de (diff) |
r600g: Set geometry properties in r600_create_shader_state()
The selector is shared by all shader variants, so the
individual shaders shouldn't change it. Use tgsi_shader_scan()
results to set geometry properties within a
r600_create_shader_state() call and treat said propertices in
the selector as read-only within r600_shader_from_tgsi().
Signed-off-by: Edward O'Callaghan <[email protected]>
Signed-off-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/gallium/drivers/r600')
-rw-r--r-- | src/gallium/drivers/r600/r600_pipe.h | 3 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_shader.c | 31 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_state_common.c | 14 |
3 files changed, 23 insertions, 25 deletions
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index eb7036048e5..4bd3d7cf75b 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -36,6 +36,8 @@ #include "util/list.h" #include "util/u_transfer.h" +#include "tgsi/tgsi_scan.h" + #define R600_NUM_ATOMS 75 #define R600_MAX_VIEWPORTS 16 @@ -305,6 +307,7 @@ struct r600_pipe_shader_selector { struct tgsi_token *tokens; struct pipe_stream_output_info so; + struct tgsi_shader_info info; unsigned num_shaders; diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index f0b794c809e..a265fb81225 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -1809,7 +1809,6 @@ static int r600_shader_from_tgsi(struct r600_context *rctx, struct tgsi_token *tokens = pipeshader->selector->tokens; struct pipe_stream_output_info so = pipeshader->selector->so; struct tgsi_full_immediate *immediate; - struct tgsi_full_property *property; struct r600_shader_ctx ctx; struct r600_bytecode_output output[32]; unsigned output_done, noutput; @@ -1968,6 +1967,12 @@ static int r600_shader_from_tgsi(struct r600_context *rctx, ctx.nliterals = 0; ctx.literals = NULL; shader->fs_write_all = FALSE; + if (ctx.info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS]) + shader->fs_write_all = TRUE; + + shader->vs_position_window_space = FALSE; + if (ctx.info.properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION]) + shader->vs_position_window_space = TRUE; if (shader->vs_as_gs_a) vs_add_primid_output(&ctx, key.vs.prim_id_out); @@ -1994,31 +1999,7 @@ static int r600_shader_from_tgsi(struct r600_context *rctx, goto out_err; break; case TGSI_TOKEN_TYPE_INSTRUCTION: - break; case TGSI_TOKEN_TYPE_PROPERTY: - property = &ctx.parse.FullToken.FullProperty; - switch (property->Property.PropertyName) { - case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: - if (property->u[0].Data == 1) - shader->fs_write_all = TRUE; - break; - case TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION: - if (property->u[0].Data == 1) - shader->vs_position_window_space = TRUE; - break; - case TGSI_PROPERTY_VS_PROHIBIT_UCPS: - /* we don't need this one */ - break; - case TGSI_PROPERTY_GS_OUTPUT_PRIM: - pipeshader->selector->gs_output_prim = property->u[0].Data; - break; - case TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES: - pipeshader->selector->gs_max_out_vertices = property->u[0].Data; - break; - case TGSI_PROPERTY_GS_INVOCATIONS: - pipeshader->selector->gs_num_invocations = property->u[0].Data; - break; - } break; default: R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index 63746b55502..d9cf736b043 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -34,6 +34,7 @@ #include "util/u_upload_mgr.h" #include "util/u_math.h" #include "tgsi/tgsi_parse.h" +#include "tgsi/tgsi_scan.h" void r600_init_command_buffer(struct r600_command_buffer *cb, unsigned num_dw) { @@ -818,6 +819,19 @@ static void *r600_create_shader_state(struct pipe_context *ctx, sel->type = pipe_shader_type; sel->tokens = tgsi_dup_tokens(state->tokens); sel->so = state->stream_output; + tgsi_scan_shader(state->tokens, &sel->info); + + switch (pipe_shader_type) { + case PIPE_SHADER_GEOMETRY: + sel->gs_output_prim = + sel->info.properties[TGSI_PROPERTY_GS_OUTPUT_PRIM]; + sel->gs_max_out_vertices = + sel->info.properties[TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES]; + sel->gs_num_invocations = + sel->info.properties[TGSI_PROPERTY_GS_INVOCATIONS]; + break; + } + return sel; } |