Module: wine Branch: master Commit: 76c6e36b90a5415df75d50a2579e55652dfce57f URL: https://gitlab.winehq.org/wine/wine/-/commit/76c6e36b90a5415df75d50a2579e556...
Author: Elizabeth Figura zfigura@codeweavers.com Date: Sun Jun 9 12:50:25 2024 -0500
wined3d: Feed WINED3D_RS_AMBIENT through a push constant buffer.
---
dlls/wined3d/cs.c | 1 + dlls/wined3d/ffp_gl.c | 2 +- dlls/wined3d/glsl_shader.c | 19 ++++++------------- dlls/wined3d/shader_spirv.c | 1 - dlls/wined3d/stateblock.c | 12 +++++++++++- dlls/wined3d/wined3d_private.h | 9 +++++++++ 6 files changed, 28 insertions(+), 16 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index cc6153ce257..275941dd183 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -2148,6 +2148,7 @@ wined3d_cs_push_constant_info[] = [WINED3D_PUSH_CONSTANTS_PS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER}, [WINED3D_PUSH_CONSTANTS_VS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, [WINED3D_PUSH_CONSTANTS_PS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_VS_FFP] = {1, sizeof(struct wined3d_ffp_vs_constants), WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, [WINED3D_PUSH_CONSTANTS_PS_FFP] = {1, sizeof(struct wined3d_ffp_ps_constants), WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, };
diff --git a/dlls/wined3d/ffp_gl.c b/dlls/wined3d/ffp_gl.c index ddb461bb56f..d0d82181c1e 100644 --- a/dlls/wined3d/ffp_gl.c +++ b/dlls/wined3d/ffp_gl.c @@ -1679,7 +1679,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table) { 39, 40}, { 42, 47}, { 49, 135}, - {138, 138}, + {138, 139}, {144, 144}, {149, 150}, {153, 153}, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 118ea7c926d..c0d75897857 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1535,17 +1535,6 @@ static void shader_glsl_ffp_vertex_material_uniform(const struct wined3d_context checkGLcall("setting FFP material uniforms"); }
-static void shader_glsl_ffp_vertex_lightambient_uniform(const struct wined3d_context_gl *context_gl, - const struct wined3d_state *state, struct glsl_shader_prog_link *prog) -{ - const struct wined3d_gl_info *gl_info = context_gl->gl_info; - struct wined3d_color color; - - wined3d_color_from_d3dcolor(&color, state->render_states[WINED3D_RS_AMBIENT]); - GL_EXTCALL(glUniform3fv(prog->vs.light_ambient_location, 1, &color.r)); - checkGLcall("glUniform3fv"); -} - static void shader_glsl_ffp_vertex_light_uniform(const struct wined3d_context_gl *context_gl, const struct wined3d_state *state, unsigned int light, const struct wined3d_light_info *light_info, struct glsl_shader_prog_link *prog) @@ -1780,10 +1769,13 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv, if (update_mask & WINED3D_SHADER_CONST_FFP_LIGHTS) { unsigned int point_idx, spot_idx, directional_idx, parallel_point_idx; + const struct wined3d_ffp_vs_constants *constants; DWORD point_count = 0; DWORD spot_count = 0; DWORD directional_count = 0;
+ constants = wined3d_buffer_load_sysmem(context->device->push_constants[WINED3D_PUSH_CONSTANTS_VS_FFP], context); + for (i = 0; i < WINED3D_MAX_ACTIVE_LIGHTS; ++i) { if (!state->light_state.lights[i]) @@ -1812,7 +1804,9 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv, directional_idx = spot_idx + spot_count; parallel_point_idx = directional_idx + directional_count;
- shader_glsl_ffp_vertex_lightambient_uniform(context_gl, state, prog); + GL_EXTCALL(glUniform3fv(prog->vs.light_ambient_location, 1, &constants->light.ambient.r)); + checkGLcall("glUniform3fv"); + for (i = 0; i < WINED3D_MAX_ACTIVE_LIGHTS; ++i) { const struct wined3d_light_info *light_info = state->light_state.lights[i]; @@ -12066,7 +12060,6 @@ static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = {STATE_RENDER(WINED3D_RS_CLIPPING), {STATE_RENDER(WINED3D_RS_CLIPPING), state_clipping }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_CLIPPLANEENABLE), {STATE_RENDER(WINED3D_RS_CLIPPING), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_LIGHTING), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_AMBIENT), {STATE_RENDER(WINED3D_RS_AMBIENT), glsl_vertex_pipe_light }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_COLORVERTEX), {STATE_RENDER(WINED3D_RS_COLORVERTEX), glsl_vertex_pipe_shader}, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_LOCALVIEWER), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_NORMALIZENORMALS), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index dc1c3a13131..a4b311ae8d2 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -1160,7 +1160,6 @@ static const struct wined3d_state_entry_template spirv_vertex_pipe_vk_vp_states[ {STATE_RENDER(WINED3D_RS_RANGEFOGENABLE), {STATE_RENDER(WINED3D_RS_RANGEFOGENABLE), state_nop}}, {STATE_RENDER(WINED3D_RS_CLIPPING), {STATE_RENDER(WINED3D_RS_CLIPPING), state_nop}}, {STATE_RENDER(WINED3D_RS_LIGHTING), {STATE_RENDER(WINED3D_RS_LIGHTING), state_nop}}, - {STATE_RENDER(WINED3D_RS_AMBIENT), {STATE_RENDER(WINED3D_RS_AMBIENT), state_nop}}, {STATE_RENDER(WINED3D_RS_COLORVERTEX), {STATE_RENDER(WINED3D_RS_COLORVERTEX), state_nop}}, {STATE_RENDER(WINED3D_RS_LOCALVIEWER), {STATE_RENDER(WINED3D_RS_LOCALVIEWER), state_nop}}, {STATE_RENDER(WINED3D_RS_NORMALIZENORMALS), {STATE_RENDER(WINED3D_RS_NORMALIZENORMALS), state_nop}}, diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 11276ffd419..548bf9aa477 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -2200,6 +2200,7 @@ static void wined3d_stateblock_state_init(struct wined3d_stateblock_state *state static void wined3d_stateblock_invalidate_push_constants(struct wined3d_stateblock *stateblock) { stateblock->changed.ffp_ps_constants = 1; + stateblock->changed.lights = 1; }
static HRESULT stateblock_init(struct wined3d_stateblock *stateblock, const struct wined3d_stateblock *device_state, @@ -2682,8 +2683,8 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, bool set_blend_state = false, set_depth_stencil_state = false, set_rasterizer_state = false;
const struct wined3d_stateblock_state *state = &stateblock->stateblock_state; - const struct wined3d_saved_states *changed = &stateblock->changed; const unsigned int word_bit_count = sizeof(DWORD) * CHAR_BIT; + struct wined3d_saved_states *changed = &stateblock->changed; struct wined3d_device_context *context = &device->cs->c; unsigned int i, j, start, idx; bool set_depth_bounds = false; @@ -2810,6 +2811,10 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, set_depth_bounds = true; break;
+ case WINED3D_RS_AMBIENT: + changed->lights = 1; + break; + case WINED3D_RS_ADAPTIVETESS_Y: case WINED3D_RS_TEXTUREFACTOR: break; @@ -3326,6 +3331,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
if (changed->lights) { + struct wined3d_ffp_light_constants constants; struct wined3d_light_info *light, *cursor;
LIST_FOR_EACH_ENTRY_SAFE(light, cursor, &changed->changed_lights, struct wined3d_light_info, changed_entry) @@ -3335,6 +3341,10 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, list_remove(&light->changed_entry); light->changed = false; } + + wined3d_color_from_d3dcolor(&constants.ambient, state->rs[WINED3D_RS_AMBIENT]); + wined3d_device_context_push_constants(context, WINED3D_PUSH_CONSTANTS_VS_FFP, WINED3D_SHADER_CONST_FFP_LIGHTS, + offsetof(struct wined3d_ffp_vs_constants, light), sizeof(constants), &constants); }
if (changed->ffp_ps_constants) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index f6adc96887d..9ad1d0f8ba5 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2764,6 +2764,14 @@ BOOL wined3d_get_app_name(char *app_name, unsigned int app_name_size); * i.e. only used when shaders are disabled. */
+struct wined3d_ffp_vs_constants +{ + struct wined3d_ffp_light_constants + { + struct wined3d_color ambient; + } light; +}; + struct wined3d_ffp_ps_constants { struct wined3d_color texture_constants[WINED3D_MAX_FFP_TEXTURES]; @@ -2782,6 +2790,7 @@ enum wined3d_push_constants WINED3D_PUSH_CONSTANTS_PS_I, WINED3D_PUSH_CONSTANTS_VS_B, WINED3D_PUSH_CONSTANTS_PS_B, + WINED3D_PUSH_CONSTANTS_VS_FFP, WINED3D_PUSH_CONSTANTS_PS_FFP, WINED3D_PUSH_CONSTANTS_COUNT, };