[v2 1/2] wined3d: Fix mapping of SV_VertexID to gl_VertexID.
Andrew Wesie
awesie at gmail.com
Thu Nov 17 23:06:50 CST 2016
Signed-off-by: Andrew Wesie <awesie at gmail.com>
---
dlls/wined3d/cs.c | 3 +++
dlls/wined3d/glsl_shader.c | 13 ++++++++++++-
dlls/wined3d/state.c | 7 ++++++-
dlls/wined3d/wined3d_private.h | 1 +
4 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 7af0b81..098c3af 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -424,6 +424,9 @@ static void wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data)
device_invalidate_state(cs->device, STATE_BASEVERTEXINDEX);
}
+ state->base_vertex_index = op->indexed ? op->base_vertex_idx : op->start_idx;
+ device_invalidate_state(cs->device, STATE_BASEVERTEXINDEX);
+
draw_primitive(cs->device, state, op->base_vertex_idx, op->start_idx,
op->index_count, op->start_instance, op->instance_count, op->indexed);
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 9e9c83b..f136536 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -122,6 +122,7 @@ struct glsl_vs_program
GLint uniform_i_locations[WINED3D_MAX_CONSTS_I];
GLint uniform_b_locations[WINED3D_MAX_CONSTS_B];
GLint pos_fixup_location;
+ GLint base_vertex_location;
GLint modelview_matrix_location[MAX_VERTEX_BLENDS];
GLint projection_matrix_location;
@@ -1424,6 +1425,12 @@ static void shader_glsl_load_constants(void *shader_priv, struct wined3d_context
checkGLcall("glUniform4fv");
}
+ if (update_mask & WINED3D_SHADER_CONST_BASE_VERTEX)
+ {
+ GL_EXTCALL(glUniform1i(prog->vs.base_vertex_location, state->base_vertex_index));
+ checkGLcall("glUniform1i");
+ }
+
if (update_mask & WINED3D_SHADER_CONST_FFP_MODELVIEW)
{
struct wined3d_matrix mat;
@@ -1793,7 +1800,8 @@ static void shader_glsl_declare_generic_vertex_attribute(struct wined3d_string_b
if (e->sysval_semantic == WINED3D_SV_VERTEX_ID)
{
- shader_addline(buffer, "vec4 vs_in%u = vec4(intBitsToFloat(gl_VertexID), 0.0, 0.0, 0.0);\n",
+ shader_addline(buffer, "uniform int base_vertex;\n");
+ shader_addline(buffer, "vec4 vs_in%u = vec4(intBitsToFloat(gl_VertexID - base_vertex), 0.0, 0.0, 0.0);\n",
index);
return;
}
@@ -7544,6 +7552,7 @@ static void shader_glsl_init_vs_uniform_locations(const struct wined3d_gl_info *
}
vs->pos_fixup_location = GL_EXTCALL(glGetUniformLocation(program_id, "pos_fixup"));
+ vs->base_vertex_location = GL_EXTCALL(glGetUniformLocation(program_id, "base_vertex"));
for (i = 0; i < MAX_VERTEX_BLENDS; ++i)
{
@@ -7964,6 +7973,8 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const
entry->constant_update_mask |= WINED3D_SHADER_CONST_VS_B;
if (entry->vs.pos_fixup_location != -1)
entry->constant_update_mask |= WINED3D_SHADER_CONST_POS_FIXUP;
+ if (entry->vs.base_vertex_location != -1)
+ entry->constant_update_mask |= WINED3D_SHADER_CONST_BASE_VERTEX;
shader_glsl_init_uniform_block_bindings(gl_info, priv, program_id, &vshader->reg_maps);
shader_glsl_load_icb(gl_info, priv, program_id, &vshader->reg_maps);
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index cd3763c..0121764 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -4956,6 +4956,11 @@ static void state_cb_warn(struct wined3d_context *context, const struct wined3d_
WARN("Constant buffers (%s) no supported.\n", debug_d3dstate(state_id));
}
+static void state_basevertex(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
+{
+ context->constant_update_mask |= WINED3D_SHADER_CONST_BASE_VERTEX;
+}
+
static void state_shader_resource_binding(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id)
{
@@ -5158,7 +5163,7 @@ const struct StateEntryTemplate misc_state_template[] =
{ STATE_SAMPLER(17), /* Vertex sampler 1 */ { STATE_SAMPLER(17), sampler }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(18), /* Vertex sampler 2 */ { STATE_SAMPLER(18), sampler }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(19), /* Vertex sampler 3 */ { STATE_SAMPLER(19), sampler }, WINED3D_GL_EXT_NONE },
- { STATE_BASEVERTEXINDEX, { STATE_BASEVERTEXINDEX, state_nop, }, ARB_DRAW_ELEMENTS_BASE_VERTEX },
+ { STATE_BASEVERTEXINDEX, { STATE_BASEVERTEXINDEX, state_basevertex, }, ARB_DRAW_ELEMENTS_BASE_VERTEX },
{ STATE_BASEVERTEXINDEX, { STATE_STREAMSRC, NULL, }, WINED3D_GL_EXT_NONE },
{ STATE_FRAMEBUFFER, { STATE_FRAMEBUFFER, context_state_fb }, WINED3D_GL_EXT_NONE },
{ STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), { STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), context_state_drawbuf},WINED3D_GL_EXT_NONE },
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index a363103..7638401 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -346,6 +346,7 @@ enum wined3d_shader_resource_type
#define WINED3D_SHADER_CONST_FFP_LIGHTS 0x00080000
#define WINED3D_SHADER_CONST_FFP_PS 0x00100000
#define WINED3D_SHADER_CONST_FFP_COLOR_KEY 0x00200000
+#define WINED3D_SHADER_CONST_BASE_VERTEX 0x00400000
enum wined3d_shader_register_type
{
--
2.7.4
More information about the wine-patches
mailing list