From: Andrew Wesie Subject: [v2 1/2] wined3d: Fix mapping of SV_VertexID to gl_VertexID. Message-Id: <1479445611-11329-1-git-send-email-awesie@gmail.com> Date: Thu, 17 Nov 2016 23:06:50 -0600 Signed-off-by: Andrew Wesie --- 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