summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2013-09-16 12:24:39 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2013-09-16 12:52:07 +0200
commit6de53cddb04c7d48790a56eaf621831e79d48624 (patch)
tree7149633833d0938658b49956bd5fa6b102151b56
parentf954279b2497ad76a98ae14b5f8968ee341be2d9 (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.h6
-rw-r--r--native/driver/etna_pipe.c7
-rw-r--r--native/driver/etna_rasterizer.c2
-rw-r--r--native/driver/etna_shader.c13
-rw-r--r--tools/data/viv_gallium_state.txt1
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