diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2013-09-16 12:24:39 +0200 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2013-09-16 12:52:07 +0200 |
commit | 6de53cddb04c7d48790a56eaf621831e79d48624 (patch) | |
tree | 7149633833d0938658b49956bd5fa6b102151b56 | |
parent | f954279b2497ad76a98ae14b5f8968ee341be2d9 (diff) |
driver: don't add pointsize output if shader doesn't set point size
Don't add pointsize output to vertex shader if that shader doesn't
assign the point size. Even if point_size_per_vertex is enabled in
rasterizer configuration. This is done because Mesa *always* sets
point_size_per_vertex to enabled with OpenGL ES, no matter what
the shader does or whether points or other primitives are rendered.
-rw-r--r-- | native/driver/etna_internal.h | 6 | ||||
-rw-r--r-- | native/driver/etna_pipe.c | 7 | ||||
-rw-r--r-- | native/driver/etna_rasterizer.c | 2 | ||||
-rw-r--r-- | native/driver/etna_shader.c | 13 | ||||
-rw-r--r-- | tools/data/viv_gallium_state.txt | 1 |
5 files changed, 23 insertions, 6 deletions
diff --git a/native/driver/etna_internal.h b/native/driver/etna_internal.h index f23e889..7e534a1 100644 --- a/native/driver/etna_internal.h +++ b/native/driver/etna_internal.h @@ -102,7 +102,7 @@ struct compiled_rasterizer_state uint32_t SE_DEPTH_SCALE; uint32_t SE_DEPTH_BIAS; uint32_t SE_CONFIG; - uint32_t VS_OUTPUT_COUNT; /* # outs added by rasterizer -- 0 or 1 */ + bool point_size_per_vertex; bool scissor; }; @@ -251,9 +251,11 @@ struct compiled_shader_state { uint32_t RA_CONTROL; uint32_t PA_ATTRIBUTE_ELEMENT_COUNT; + uint32_t PA_CONFIG; uint32_t PA_SHADER_ATTRIBUTES[VIVS_PA_SHADER_ATTRIBUTES__LEN]; uint32_t VS_END_PC; - uint32_t VS_OUTPUT_COUNT; + uint32_t VS_OUTPUT_COUNT; /* number of outputs if point size per vertex disabled */ + uint32_t VS_OUTPUT_COUNT_PSIZE; /* number of outputs of point size per vertex enabled */ uint32_t VS_INPUT_COUNT; uint32_t VS_TEMP_REGISTER_CONTROL; uint32_t VS_OUTPUT[4]; diff --git a/native/driver/etna_pipe.c b/native/driver/etna_pipe.c index adb1b70..2e69c56 100644 --- a/native/driver/etna_pipe.c +++ b/native/driver/etna_pipe.c @@ -425,7 +425,8 @@ static void sync_context(struct pipe_context *restrict pipe) } if(unlikely(dirty & (ETNA_STATE_SHADER | ETNA_STATE_RASTERIZER))) { - /*00804*/ EMIT_STATE(VS_OUTPUT_COUNT, VS_OUTPUT_COUNT, e->shader_state.VS_OUTPUT_COUNT + e->rasterizer.VS_OUTPUT_COUNT); + /*00804*/ EMIT_STATE(VS_OUTPUT_COUNT, VS_OUTPUT_COUNT, + e->rasterizer.point_size_per_vertex ? e->shader_state.VS_OUTPUT_COUNT_PSIZE : e->shader_state.VS_OUTPUT_COUNT); } if(unlikely(dirty & (ETNA_STATE_VERTEX_ELEMENTS | ETNA_STATE_SHADER))) { @@ -468,9 +469,9 @@ static void sync_context(struct pipe_context *restrict pipe) { /*00A30*/ EMIT_STATE(PA_ATTRIBUTE_ELEMENT_COUNT, PA_ATTRIBUTE_ELEMENT_COUNT, e->shader_state.PA_ATTRIBUTE_ELEMENT_COUNT); } - if(unlikely(dirty & (ETNA_STATE_RASTERIZER))) + if(unlikely(dirty & (ETNA_STATE_RASTERIZER | ETNA_STATE_SHADER))) { - /*00A34*/ EMIT_STATE(PA_CONFIG, PA_CONFIG, e->rasterizer.PA_CONFIG); + /*00A34*/ EMIT_STATE(PA_CONFIG, PA_CONFIG, e->rasterizer.PA_CONFIG & e->shader_state.PA_CONFIG); } if(unlikely(dirty & (ETNA_STATE_SHADER))) { diff --git a/native/driver/etna_rasterizer.c b/native/driver/etna_rasterizer.c index 00de924..7eeac34 100644 --- a/native/driver/etna_rasterizer.c +++ b/native/driver/etna_rasterizer.c @@ -62,7 +62,7 @@ static void *etna_pipe_create_rasterizer_state(struct pipe_context *pipe, /* rs->scissor overrides the scissor, defaulting to the whole framebuffer, with the scissor state */ cs->scissor = rs->scissor; /* point size per vertex adds a vertex shader output */ - cs->VS_OUTPUT_COUNT = rs->point_size_per_vertex; + cs->point_size_per_vertex = rs->point_size_per_vertex; assert(!rs->clip_halfz); /* could be supported with shader magic, actually D3D z is default on older gc */ return cs; diff --git a/native/driver/etna_shader.c b/native/driver/etna_shader.c index efe7425..47cf003 100644 --- a/native/driver/etna_shader.c +++ b/native/driver/etna_shader.c @@ -99,6 +99,19 @@ void etna_link_shaders(struct pipe_context *pipe, (vs_output[idx*4+2] << 16) | (vs_output[idx*4+3] << 24); } + if(vs->vs_pointsize_out_reg != -1) + { + /* vertex shader outputs point coordinate, provide extra output and make sure PA config is + * not masked */ + cs->PA_CONFIG = ~0; + cs->VS_OUTPUT_COUNT_PSIZE = cs->VS_OUTPUT_COUNT + 1; + } else { + /* vertex shader does not output point coordinate, make sure thate POINT_SIZE_ENABLE is masked + * and no extra output is given */ + cs->PA_CONFIG = ~VIVS_PA_CONFIG_POINT_SIZE_ENABLE; + cs->VS_OUTPUT_COUNT_PSIZE = cs->VS_OUTPUT_COUNT; + } + /* vs inputs (attributes) */ uint32_t vs_input[4] = {0}; for(int idx=0; idx<vs->num_inputs; ++idx) diff --git a/tools/data/viv_gallium_state.txt b/tools/data/viv_gallium_state.txt index b0b2488..b0dada9 100644 --- a/tools/data/viv_gallium_state.txt +++ b/tools/data/viv_gallium_state.txt @@ -123,6 +123,7 @@ set_index_buffer index_buffer. ETNA_STATE_INDEX_BUFFER shader_state shader_state. ETNA_STATE_SHADER RA.CONTROL PA.ATTRIBUTE_ELEMENT_COUNT + PA.CONFIG PA.SHADER_ATTRIBUTES VS.END_PC VS.OUTPUT_COUNT |