diff options
author | Marek Olšák <[email protected]> | 2012-09-10 05:43:12 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2012-09-13 20:18:44 +0200 |
commit | 263045afbc731fe669b43013a32c6dfa457e46ad (patch) | |
tree | bae7a84ccd5348220862877ae75b46f990fc1c41 /src/gallium/drivers/r600/r600_state.c | |
parent | f2eac1423a92ba47981ba50a4af22e6596059cf4 (diff) |
r600g: add support for geometry shader samplers and constant buffers
Reviewed-by: Jerome Glisse <[email protected]>
Diffstat (limited to 'src/gallium/drivers/r600/r600_state.c')
-rw-r--r-- | src/gallium/drivers/r600/r600_state.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index 05271e20132..abe886c5e2a 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -1879,6 +1879,13 @@ static void r600_emit_vs_constant_buffers(struct r600_context *rctx, struct r600 R_028980_ALU_CONST_CACHE_VS_0); } +static void r600_emit_gs_constant_buffers(struct r600_context *rctx, struct r600_atom *atom) +{ + r600_emit_constant_buffers(rctx, &rctx->constbuf_state[PIPE_SHADER_GEOMETRY], 336, + R_0281C0_ALU_CONST_BUFFER_SIZE_GS_0, + R_0289C0_ALU_CONST_CACHE_GS_0); +} + static void r600_emit_ps_constant_buffers(struct r600_context *rctx, struct r600_atom *atom) { r600_emit_constant_buffers(rctx, &rctx->constbuf_state[PIPE_SHADER_FRAGMENT], 0, @@ -1916,11 +1923,23 @@ static void r600_emit_sampler_views(struct r600_context *rctx, state->dirty_mask = 0; } +/* Resource IDs: + * PS: 0 .. +160 + * VS: 160 .. +160 + * FS: 320 .. +16 + * GS: 336 .. +160 + */ + static void r600_emit_vs_sampler_views(struct r600_context *rctx, struct r600_atom *atom) { r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].views, 160 + R600_MAX_CONST_BUFFERS); } +static void r600_emit_gs_sampler_views(struct r600_context *rctx, struct r600_atom *atom) +{ + r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].views, 336 + R600_MAX_CONST_BUFFERS); +} + static void r600_emit_ps_sampler_views(struct r600_context *rctx, struct r600_atom *atom) { r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].views, R600_MAX_CONST_BUFFERS); @@ -1980,6 +1999,11 @@ static void r600_emit_vs_sampler_states(struct r600_context *rctx, struct r600_a r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_VERTEX], 18, R_00A600_TD_VS_SAMPLER0_BORDER_RED); } +static void r600_emit_gs_sampler_states(struct r600_context *rctx, struct r600_atom *atom) +{ + r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY], 36, R_00A800_TD_GS_SAMPLER0_BORDER_RED); +} + static void r600_emit_ps_sampler_states(struct r600_context *rctx, struct r600_atom *atom) { r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT], 0, R_00A400_TD_PS_SAMPLER0_BORDER_RED); @@ -2025,15 +2049,18 @@ void r600_init_state_functions(struct r600_context *rctx) /* shader const */ r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_VERTEX].atom, id++, r600_emit_vs_constant_buffers, 0); + r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_GEOMETRY].atom, id++, r600_emit_gs_constant_buffers, 0); r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_FRAGMENT].atom, id++, r600_emit_ps_constant_buffers, 0); /* sampler must be emited before TA_CNTL_AUX otherwise DISABLE_CUBE_WRAP change * does not take effect (TA_CNTL_AUX emited by r600_emit_seamless_cube_map) */ r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].states.atom, id++, r600_emit_vs_sampler_states, 0); + r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].states.atom, id++, r600_emit_gs_sampler_states, 0); r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].states.atom, id++, r600_emit_ps_sampler_states, 0); /* resource */ r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].views.atom, id++, r600_emit_vs_sampler_views, 0); + r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].views.atom, id++, r600_emit_gs_sampler_views, 0); r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].views.atom, id++, r600_emit_ps_sampler_views, 0); r600_init_atom(rctx, &rctx->vertex_buffer_state.atom, id++, r600_emit_vertex_buffers, 0); |