This is the last part of this series.
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/glsl_shader.c | 4 ++-- dlls/wined3d/utils.c | 11 ++++------- dlls/wined3d/wined3d_private.h | 8 ++++---- 3 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 78926739310..efe4c3016c2 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -10397,7 +10397,7 @@ static void set_glsl_shader_program(const struct wined3d_context_gl *context_gl, struct glsl_ffp_vertex_shader *ffp_shader; struct wined3d_ffp_vs_settings settings;
- wined3d_ffp_get_vs_settings(&context_gl->c, state, &settings); + wined3d_ffp_get_vs_settings(state, &context_gl->c.stream_info, d3d_info, &settings); ffp_shader = shader_glsl_find_ffp_vertex_shader(priv, gl_info, &settings); vs_id = ffp_shader->id; vs_list = &ffp_shader->linked_programs; @@ -10464,7 +10464,7 @@ static void set_glsl_shader_program(const struct wined3d_context_gl *context_gl, struct glsl_ffp_fragment_shader *ffp_shader; struct ffp_frag_settings settings;
- wined3d_ffp_get_fs_settings(&context_gl->c, state, &settings); + wined3d_ffp_get_fs_settings(state, d3d_info, &settings); ffp_shader = shader_glsl_find_ffp_fragment_shader(priv, &settings, context_gl); ps_id = ffp_shader->id; ps_list = &ffp_shader->linked_programs; diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 20e7fd05e2c..fb732929799 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -6164,8 +6164,8 @@ void multiply_matrix(struct wined3d_matrix *dst, const struct wined3d_matrix *sr *dst = tmp; }
-void wined3d_ffp_get_fs_settings(const struct wined3d_context *context, - const struct wined3d_state *state, struct ffp_frag_settings *settings) +void wined3d_ffp_get_fs_settings(const struct wined3d_state *state, + const struct wined3d_d3d_info *d3d_info, struct ffp_frag_settings *settings) { #define ARG1 0x01 #define ARG2 0x02 @@ -6203,7 +6203,6 @@ void wined3d_ffp_get_fs_settings(const struct wined3d_context *context, unsigned int i; DWORD ttff; DWORD cop, aop, carg0, carg1, carg2, aarg0, aarg1, aarg2; - const struct wined3d_d3d_info *d3d_info = context->d3d_info; struct wined3d_texture *texture;
settings->padding = 0; @@ -6468,13 +6467,11 @@ int wined3d_ffp_frag_program_key_compare(const void *key, const struct wine_rb_e return memcmp(ka, kb, sizeof(*ka)); }
-void wined3d_ffp_get_vs_settings(const struct wined3d_context *context, - const struct wined3d_state *state, struct wined3d_ffp_vs_settings *settings) +void wined3d_ffp_get_vs_settings(const struct wined3d_state *state, const struct wined3d_stream_info *si, + const struct wined3d_d3d_info *d3d_info, struct wined3d_ffp_vs_settings *settings) { enum wined3d_material_color_source diffuse_source, emissive_source, ambient_source, specular_source; const struct wined3d_vertex_declaration *vdecl = state->vertex_declaration; - const struct wined3d_stream_info *si = &context->stream_info; - const struct wined3d_d3d_info *d3d_info = context->d3d_info; unsigned int coord_idx, i;
memset(settings, 0, sizeof(*settings)); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 191894bf95a..6cc1daa7164 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2677,8 +2677,8 @@ int wined3d_ffp_vertex_program_key_compare(const void *key, const struct wine_rb
extern const struct wined3d_parent_ops wined3d_null_parent_ops;
-void wined3d_ffp_get_fs_settings(const struct wined3d_context *context, - const struct wined3d_state *state, struct ffp_frag_settings *settings); +void wined3d_ffp_get_fs_settings(const struct wined3d_state *state, + const struct wined3d_d3d_info *d3d_info, struct ffp_frag_settings *settings); const struct ffp_frag_desc *find_ffp_frag_shader(const struct wine_rb_tree *fragment_shaders, const struct ffp_frag_settings *settings); void add_ffp_frag_shader(struct wine_rb_tree *shaders, struct ffp_frag_desc *desc); @@ -2737,8 +2737,8 @@ struct wined3d_ffp_vs_desc struct wined3d_ffp_vs_settings settings; };
-void wined3d_ffp_get_vs_settings(const struct wined3d_context *context, - const struct wined3d_state *state, struct wined3d_ffp_vs_settings *settings); +void wined3d_ffp_get_vs_settings(const struct wined3d_state *state, const struct wined3d_stream_info *si, + const struct wined3d_d3d_info *d3d_info, struct wined3d_ffp_vs_settings *settings);
struct wined3d {
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/glsl_shader.c | 11 ++++------- dlls/wined3d/stateblock.c | 27 +++++++++++++++++---------- dlls/wined3d/wined3d_private.h | 10 +++++++++- 3 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index efe4c3016c2..49b641d0635 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1566,15 +1566,12 @@ static void shader_glsl_ffp_vertex_normalmatrix_uniform(const struct wined3d_con const struct wined3d_ffp_vs_constants *constants, struct glsl_shader_prog_link *prog) { const struct wined3d_gl_info *gl_info = context_gl->gl_info; - float mat[3 * 3];
if (prog->vs.normal_matrix_location == -1) return;
- compute_normal_matrix(mat, context_gl->c.d3d_info->wined3d_creation_flags & WINED3D_LEGACY_FFP_LIGHTING, - &constants->modelview_matrices[0]); - - GL_EXTCALL(glUniformMatrix3fv(prog->vs.normal_matrix_location, 1, FALSE, mat)); + GL_EXTCALL(glUniformMatrix3fv(prog->vs.normal_matrix_location, + 1, FALSE, constants->modelview.not_blended.normal_matrix)); checkGLcall("glUniformMatrix3fv"); }
@@ -1792,7 +1789,7 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv, constants = wined3d_buffer_load_sysmem(context->device->push_constants[WINED3D_PUSH_CONSTANTS_VS_FFP], context);
GL_EXTCALL(glUniformMatrix4fv(prog->vs.modelview_matrix_location[0], 1, - FALSE, &constants->modelview_matrices[0]._11)); + FALSE, &constants->modelview.modelview_matrices[0]._11)); checkGLcall("glUniformMatrix4fv");
shader_glsl_ffp_vertex_normalmatrix_uniform(context_gl, constants, prog); @@ -1810,7 +1807,7 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv, break;
GL_EXTCALL(glUniformMatrix4fv(prog->vs.modelview_matrix_location[i], - 1, FALSE, &constants->modelview_matrices[i]._11)); + 1, FALSE, &constants->modelview.modelview_matrices[i]._11)); checkGLcall("glUniformMatrix4fv"); } } diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index d32e95e98fa..3a5ac83883b 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -3530,21 +3530,28 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
if (changed->modelview_matrices) { - struct wined3d_matrix matrices[MAX_VERTEX_BLENDS]; + union wined3d_ffp_vs_modelview_matrices matrices;
- get_modelview_matrix(state, 0, &matrices[0]); - wined3d_device_context_push_constants(context, - WINED3D_PUSH_CONSTANTS_VS_FFP, WINED3D_SHADER_CONST_FFP_MODELVIEW, - offsetof(struct wined3d_ffp_vs_constants, modelview_matrices[0]), sizeof(matrices[0]), &matrices[0]); + get_modelview_matrix(state, 0, &matrices.modelview_matrices[0]);
if (state->rs[WINED3D_RS_VERTEXBLEND]) { for (i = 1; i < MAX_VERTEX_BLENDS; ++i) - get_modelview_matrix(state, i, &matrices[i]); - wined3d_device_context_push_constants(context, - WINED3D_PUSH_CONSTANTS_VS_FFP, WINED3D_SHADER_CONST_FFP_VERTEXBLEND, - offsetof(struct wined3d_ffp_vs_constants, modelview_matrices[1]), - sizeof(matrices) - sizeof(matrices[0]), &matrices[1]); + get_modelview_matrix(state, i, &matrices.modelview_matrices[i]); + + wined3d_device_context_push_constants(context, WINED3D_PUSH_CONSTANTS_VS_FFP, + WINED3D_SHADER_CONST_FFP_MODELVIEW | WINED3D_SHADER_CONST_FFP_VERTEXBLEND, + offsetof(struct wined3d_ffp_vs_constants, modelview), sizeof(matrices), &matrices); + } + else + { + compute_normal_matrix(matrices.not_blended.normal_matrix, + device->adapter->d3d_info.wined3d_creation_flags & WINED3D_LEGACY_FFP_LIGHTING, + &matrices.not_blended.modelview_matrix); + + wined3d_device_context_push_constants(context, WINED3D_PUSH_CONSTANTS_VS_FFP, + WINED3D_SHADER_CONST_FFP_MODELVIEW, + offsetof(struct wined3d_ffp_vs_constants, modelview), sizeof(matrices.not_blended), &matrices); } }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 6cc1daa7164..84cf8f51f26 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2768,7 +2768,15 @@ BOOL wined3d_get_app_name(char *app_name, unsigned int app_name_size);
struct wined3d_ffp_vs_constants { - struct wined3d_matrix modelview_matrices[MAX_VERTEX_BLENDS]; + union wined3d_ffp_vs_modelview_matrices + { + struct wined3d_matrix modelview_matrices[MAX_VERTEX_BLENDS]; + struct + { + struct wined3d_matrix modelview_matrix; + float normal_matrix[9]; + } not_blended; + } modelview; struct wined3d_matrix projection_matrix; struct wined3d_matrix texture_matrices[WINED3D_MAX_FFP_TEXTURES]; struct wined3d_material material;
From: Elizabeth Figura zfigura@codeweavers.com
Pass it to GLSL as a 4x4 matrix, and truncate it before use.
This will be necessary for the HLSL backend, which pads matrices to 4xn. --- dlls/wined3d/device.c | 13 +++---------- dlls/wined3d/glsl_shader.c | 10 +++++----- dlls/wined3d/stateblock.c | 2 +- dlls/wined3d/utils.c | 16 +++++++++++----- dlls/wined3d/wined3d_private.h | 4 ++-- 5 files changed, 22 insertions(+), 23 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 47469027ba7..0fb71108b27 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -34,13 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); WINE_DECLARE_DEBUG_CHANNEL(d3d_perf); WINE_DECLARE_DEBUG_CHANNEL(winediag);
-struct wined3d_matrix_3x3 -{ - float _11, _12, _13; - float _21, _22, _23; - float _31, _32, _33; -}; - struct light_transformed { struct wined3d_color diffuse, specular, ambient; @@ -54,7 +47,7 @@ struct lights_settings struct light_transformed lights[WINED3D_MAX_SOFTWARE_ACTIVE_LIGHTS]; struct wined3d_color ambient_light; struct wined3d_matrix modelview_matrix; - struct wined3d_matrix_3x3 normal_matrix; + struct wined3d_matrix normal_matrix; struct wined3d_vec4 position_transformed;
float fog_start, fog_end, fog_density; @@ -2894,7 +2887,7 @@ static void wined3d_vec3_normalise(struct wined3d_vec3 *v) }
static void wined3d_vec3_transform(struct wined3d_vec3 *dst, - const struct wined3d_vec3 *v, const struct wined3d_matrix_3x3 *m) + const struct wined3d_vec3 *v, const struct wined3d_matrix *m) { struct wined3d_vec3 tmp;
@@ -2951,7 +2944,7 @@ static void init_transformed_lights(struct lights_settings *ls, if (!compute_lighting) return;
- compute_normal_matrix(&ls->normal_matrix._11, legacy_lighting, &ls->modelview_matrix); + compute_normal_matrix(&ls->normal_matrix, legacy_lighting, &ls->modelview_matrix);
wined3d_color_from_d3dcolor(&ls->ambient_light, state->rs[WINED3D_RS_AMBIENT]); ls->legacy_lighting = !!legacy_lighting; diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 49b641d0635..7c85739e32b 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1570,9 +1570,9 @@ static void shader_glsl_ffp_vertex_normalmatrix_uniform(const struct wined3d_con if (prog->vs.normal_matrix_location == -1) return;
- GL_EXTCALL(glUniformMatrix3fv(prog->vs.normal_matrix_location, - 1, FALSE, constants->modelview.not_blended.normal_matrix)); - checkGLcall("glUniformMatrix3fv"); + GL_EXTCALL(glUniformMatrix4fv(prog->vs.normal_matrix_location, + 1, FALSE, &constants->modelview.not_blended.normal_matrix._11)); + checkGLcall("glUniformMatrix4fv"); }
static void shader_glsl_ffp_vertex_texmatrix_uniform(const struct wined3d_context_gl *context_gl, @@ -9144,7 +9144,7 @@ static GLuint shader_glsl_generate_ffp_vertex_shader(struct shader_glsl_priv *pr
shader_addline(buffer, "uniform mat4 ffp_modelview_matrix[%u];\n", MAX_VERTEX_BLENDS); shader_addline(buffer, "uniform mat4 ffp_projection_matrix;\n"); - shader_addline(buffer, "uniform mat3 ffp_normal_matrix;\n"); + shader_addline(buffer, "uniform mat4 ffp_normal_matrix;\n"); shader_addline(buffer, "uniform mat4 ffp_texture_matrix[%u];\n", WINED3D_MAX_FFP_TEXTURES);
shader_addline(buffer, "uniform struct\n{\n"); @@ -9261,7 +9261,7 @@ static GLuint shader_glsl_generate_ffp_vertex_shader(struct shader_glsl_priv *pr if (settings->transformed) shader_addline(buffer, "normal = ffp_attrib_normal;\n"); else - shader_addline(buffer, "normal = ffp_normal_matrix * ffp_attrib_normal;\n"); + shader_addline(buffer, "normal = mat3(ffp_normal_matrix) * ffp_attrib_normal;\n"); } else { diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 3a5ac83883b..54bea64afcc 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -3545,7 +3545,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, } else { - compute_normal_matrix(matrices.not_blended.normal_matrix, + compute_normal_matrix(&matrices.not_blended.normal_matrix, device->adapter->d3d_info.wined3d_creation_flags & WINED3D_LEGACY_FFP_LIGHTING, &matrices.not_blended.modelview_matrix);
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index fb732929799..3a13045f625 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -7065,11 +7065,10 @@ static BOOL invert_matrix_3d(struct wined3d_matrix *out, const struct wined3d_ma return TRUE; }
-void compute_normal_matrix(float *normal_matrix, BOOL legacy_lighting, +void compute_normal_matrix(struct wined3d_matrix *normal_matrix, BOOL legacy_lighting, const struct wined3d_matrix *modelview) { struct wined3d_matrix mv; - unsigned int i, j;
mv = *modelview; if (legacy_lighting) @@ -7079,9 +7078,16 @@ void compute_normal_matrix(float *normal_matrix, BOOL legacy_lighting, /* Tests show that singular modelview matrices are used unchanged as normal * matrices on D3D3 and older. There seems to be no clearly consistent * behavior on newer D3D versions so always follow older ddraw behavior. */ - for (i = 0; i < 3; ++i) - for (j = 0; j < 3; ++j) - normal_matrix[i * 3 + j] = (&mv._11)[j * 4 + i]; + + normal_matrix->_11 = mv._11; + normal_matrix->_12 = mv._21; + normal_matrix->_13 = mv._31; + normal_matrix->_21 = mv._12; + normal_matrix->_22 = mv._22; + normal_matrix->_23 = mv._32; + normal_matrix->_31 = mv._13; + normal_matrix->_32 = mv._23; + normal_matrix->_33 = mv._33; }
static void wined3d_allocator_release_block(struct wined3d_allocator *allocator, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 84cf8f51f26..7de83d3b1cd 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2774,7 +2774,7 @@ struct wined3d_ffp_vs_constants struct { struct wined3d_matrix modelview_matrix; - float normal_matrix[9]; + struct wined3d_matrix normal_matrix; } not_blended; } modelview; struct wined3d_matrix projection_matrix; @@ -4722,7 +4722,7 @@ static inline void wined3d_vec4_transform(struct wined3d_vec4 *dst,
BOOL invert_matrix(struct wined3d_matrix *out, const struct wined3d_matrix *m);
-void compute_normal_matrix(float *normal_matrix, BOOL legacy_lighting, +void compute_normal_matrix(struct wined3d_matrix *normal_matrix, BOOL legacy_lighting, const struct wined3d_matrix *modelview);
static inline struct wined3d_context *context_acquire(struct wined3d_device *device,
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/glsl_shader.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 7c85739e32b..237733ec738 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -8107,7 +8107,12 @@ static void shader_glsl_generate_vs_epilogue(const struct wined3d_gl_info *gl_in }
if (args->point_size && !args->per_vertex_point_size) - shader_addline(buffer, "gl_PointSize = clamp(ffp_point.size, ffp_point.size_min, ffp_point.size_max);\n"); + { + if (reg_maps->shader_version.major >= 4) + shader_addline(buffer, "gl_PointSize = 1.0;\n"); + else + shader_addline(buffer, "gl_PointSize = clamp(ffp_point.size, ffp_point.size_min, ffp_point.size_max);\n"); + }
if (args->next_shader_type == WINED3D_SHADER_TYPE_PIXEL && !gl_info->supported[ARB_CLIP_CONTROL]) shader_glsl_fixup_position(buffer, FALSE); @@ -8150,7 +8155,7 @@ static GLuint shader_glsl_generate_vertex_shader(const struct wined3d_context_gl for (i = 0; i < shader->input_signature.element_count; ++i) shader_glsl_declare_generic_vertex_attribute(buffer, gl_info, &shader->input_signature.elements[i]);
- if (args->point_size && !args->per_vertex_point_size) + if (args->point_size && !args->per_vertex_point_size && reg_maps->shader_version.major < 4) { shader_addline(buffer, "uniform struct\n{\n"); shader_addline(buffer, " float size;\n");
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/ffp_gl.c | 1 + dlls/wined3d/glsl_shader.c | 31 +++++++++------------------- dlls/wined3d/shader_spirv.c | 4 ---- dlls/wined3d/stateblock.c | 37 ++++++++++++++++++++++++++++++++++ dlls/wined3d/utils.c | 33 ------------------------------ dlls/wined3d/wined3d_private.h | 6 ++++-- 6 files changed, 51 insertions(+), 61 deletions(-)
diff --git a/dlls/wined3d/ffp_gl.c b/dlls/wined3d/ffp_gl.c index 3bcd67f9c02..84ae038f176 100644 --- a/dlls/wined3d/ffp_gl.c +++ b/dlls/wined3d/ffp_gl.c @@ -1677,6 +1677,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table) {144, 144}, {149, 150}, {153, 153}, + {157, 160}, {162, 165}, {167, 193}, {195, 209}, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 237733ec738..e4b90cafa74 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1655,13 +1655,16 @@ static void shader_glsl_ffp_vertex_light_uniform(const struct wined3d_context_gl checkGLcall("setting FFP lights uniforms"); }
-static void shader_glsl_pointsize_uniform(const struct wined3d_context_gl *context_gl, +static void shader_glsl_pointsize_uniform(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; - float size, att[3]; + const struct wined3d_ffp_vs_constants *constants; float min, max;
+ constants = wined3d_buffer_load_sysmem( + context_gl->c.device->push_constants[WINED3D_PUSH_CONSTANTS_VS_FFP], &context_gl->c); + get_pointsize_minmax(&context_gl->c, state, &min, &max);
GL_EXTCALL(glUniform1f(prog->vs.pointsize_min_location, min)); @@ -1669,15 +1672,13 @@ static void shader_glsl_pointsize_uniform(const struct wined3d_context_gl *conte GL_EXTCALL(glUniform1f(prog->vs.pointsize_max_location, max)); checkGLcall("glUniform1f");
- get_pointsize(&context_gl->c, state, &size, att); - - GL_EXTCALL(glUniform1f(prog->vs.pointsize_location, size)); + GL_EXTCALL(glUniform1f(prog->vs.pointsize_location, int_to_float(state->render_states[WINED3D_RS_POINTSIZE]))); checkGLcall("glUniform1f"); - GL_EXTCALL(glUniform1f(prog->vs.pointsize_c_att_location, att[0])); + GL_EXTCALL(glUniform1f(prog->vs.pointsize_c_att_location, constants->point.scale_const)); checkGLcall("glUniform1f"); - GL_EXTCALL(glUniform1f(prog->vs.pointsize_l_att_location, att[1])); + GL_EXTCALL(glUniform1f(prog->vs.pointsize_l_att_location, constants->point.scale_linear)); checkGLcall("glUniform1f"); - GL_EXTCALL(glUniform1f(prog->vs.pointsize_q_att_location, att[2])); + GL_EXTCALL(glUniform1f(prog->vs.pointsize_q_att_location, constants->point.scale_quad)); checkGLcall("glUniform1f"); }
@@ -11925,9 +11926,6 @@ static void glsl_vertex_pipe_projection(struct wined3d_context *context, static void glsl_vertex_pipe_viewport(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { - if (!isStateDirty(context, STATE_RENDER(WINED3D_RS_POINTSCALEENABLE)) - && state->render_states[WINED3D_RS_POINTSCALEENABLE]) - context->constant_update_mask |= WINED3D_SHADER_CONST_VS_POINTSIZE; context->constant_update_mask |= WINED3D_SHADER_CONST_POS_FIXUP | WINED3D_SHADER_CONST_FFP_PROJ; }
@@ -11937,13 +11935,6 @@ static void glsl_vertex_pipe_pointsize(struct wined3d_context *context, context->constant_update_mask |= WINED3D_SHADER_CONST_VS_POINTSIZE; }
-static void glsl_vertex_pipe_pointscale(struct wined3d_context *context, - const struct wined3d_state *state, DWORD state_id) -{ - if (!use_vs(state)) - context->constant_update_mask |= WINED3D_SHADER_CONST_VS_POINTSIZE; -} - static void glsl_vertex_pointsprite_core(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { @@ -12033,10 +12024,6 @@ static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), state_pointsprite }, ARB_POINT_SPRITE }, {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), state_pointsprite_w }, WINED3D_GL_LEGACY_CONTEXT }, {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), glsl_vertex_pointsprite_core}, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_POINTSCALEENABLE), {STATE_RENDER(WINED3D_RS_POINTSCALEENABLE), glsl_vertex_pipe_pointscale}, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_POINTSCALE_A), {STATE_RENDER(WINED3D_RS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_POINTSCALE_B), {STATE_RENDER(WINED3D_RS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_POINTSCALE_C), {STATE_RENDER(WINED3D_RS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_POINTSIZE_MAX), {STATE_RENDER(WINED3D_RS_POINTSIZE_MIN), NULL }, WINED3D_GL_EXT_NONE }, {STATE_POINT_ENABLE, {STATE_POINT_ENABLE, glsl_vertex_pipe_shader}, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), glsl_vertex_pipe_shademode}, WINED3D_GLSL_130 }, diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index a5461d3d998..c533ca2798a 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -1171,10 +1171,6 @@ static const struct wined3d_state_entry_template spirv_vertex_pipe_vk_vp_states[ {STATE_RENDER(WINED3D_RS_CLIPPLANEENABLE), {STATE_RENDER(WINED3D_RS_CLIPPLANEENABLE), state_nop}}, {STATE_RENDER(WINED3D_RS_POINTSIZE), {STATE_RENDER(WINED3D_RS_POINTSIZE), state_nop}}, {STATE_RENDER(WINED3D_RS_POINTSIZE_MIN), {STATE_RENDER(WINED3D_RS_POINTSIZE_MIN), state_nop}}, - {STATE_RENDER(WINED3D_RS_POINTSCALEENABLE), {STATE_RENDER(WINED3D_RS_POINTSCALEENABLE), state_nop}}, - {STATE_RENDER(WINED3D_RS_POINTSCALE_A), {STATE_RENDER(WINED3D_RS_POINTSCALE_A), state_nop}}, - {STATE_RENDER(WINED3D_RS_POINTSCALE_B), {STATE_RENDER(WINED3D_RS_POINTSCALE_B), state_nop}}, - {STATE_RENDER(WINED3D_RS_POINTSCALE_C), {STATE_RENDER(WINED3D_RS_POINTSCALE_C), state_nop}}, {STATE_RENDER(WINED3D_RS_POINTSIZE_MAX), {STATE_RENDER(WINED3D_RS_POINTSIZE_MAX), state_nop}}, {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), state_nop}}, {STATE_LIGHT_TYPE, {STATE_LIGHT_TYPE, state_nop}}, diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 54bea64afcc..9fde09b0ff1 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -63,6 +63,7 @@ struct wined3d_saved_states uint32_t ffp_ps_constants : 1; uint32_t texture_matrices : 1; uint32_t modelview_matrices : 1; + uint32_t point_scale : 1; };
struct stage_state @@ -1585,6 +1586,13 @@ void CDECL wined3d_stateblock_set_render_state(struct wined3d_stateblock *stateb stateblock->changed.modelview_matrices = 1; break;
+ case WINED3D_RS_POINTSCALEENABLE: + case WINED3D_RS_POINTSCALE_A: + case WINED3D_RS_POINTSCALE_B: + case WINED3D_RS_POINTSCALE_C: + stateblock->changed.point_scale = 1; + break; + default: break; } @@ -1730,6 +1738,7 @@ void CDECL wined3d_stateblock_set_viewport(struct wined3d_stateblock *stateblock
stateblock->stateblock_state.viewport = *viewport; stateblock->changed.viewport = TRUE; + stateblock->changed.point_scale = TRUE; }
void CDECL wined3d_stateblock_set_scissor_rect(struct wined3d_stateblock *stateblock, const RECT *rect) @@ -2261,6 +2270,7 @@ static void wined3d_stateblock_invalidate_push_constants(struct wined3d_stateblo stateblock->changed.transforms = 1; memset(stateblock->changed.transform, 0xff, sizeof(stateblock->changed.transform)); stateblock->changed.modelview_matrices = 1; + stateblock->changed.point_scale = 1; }
static HRESULT stateblock_init(struct wined3d_stateblock *stateblock, const struct wined3d_stateblock *device_state, @@ -2874,6 +2884,10 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, break;
case WINED3D_RS_ADAPTIVETESS_Y: + case WINED3D_RS_POINTSCALEENABLE: + case WINED3D_RS_POINTSCALE_A: + case WINED3D_RS_POINTSCALE_B: + case WINED3D_RS_POINTSCALE_C: case WINED3D_RS_TEXTUREFACTOR: break;
@@ -3572,6 +3586,29 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, sizeof(constants.texture_matrices), constants.texture_matrices); }
+ if (changed->point_scale) + { + struct wined3d_ffp_point_constants constants; + + if (state->rs[WINED3D_RS_POINTSCALEENABLE]) + { + float scale_factor = state->viewport.height * state->viewport.height; + + constants.scale_const = int_to_float(state->rs[WINED3D_RS_POINTSCALE_A]) / scale_factor; + constants.scale_linear = int_to_float(state->rs[WINED3D_RS_POINTSCALE_B]) / scale_factor; + constants.scale_quad = int_to_float(state->rs[WINED3D_RS_POINTSCALE_C]) / scale_factor; + } + else + { + constants.scale_const = 1.0f; + constants.scale_linear = 0.0f; + constants.scale_quad = 0.0f; + } + + wined3d_device_context_push_constants(context, WINED3D_PUSH_CONSTANTS_VS_FFP, WINED3D_SHADER_CONST_VS_POINTSIZE, + offsetof(struct wined3d_ffp_vs_constants, point), sizeof(constants), &constants); + } + if (changed->ffp_ps_constants) { static const struct wined3d_color specular_enabled = {1.0f, 1.0f, 1.0f, 0.0f}; diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 3a13045f625..0eda0acc4e9 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -5693,39 +5693,6 @@ void get_pointsize_minmax(const struct wined3d_context *context, const struct wi *out_max = max.f; }
-void get_pointsize(const struct wined3d_context *context, const struct wined3d_state *state, - float *out_pointsize, float *out_att) -{ - /* POINTSCALEENABLE controls how point size value is treated. If set to - * true, the point size is scaled with respect to height of viewport. - * When set to false point size is in pixels. */ - union - { - DWORD d; - float f; - } pointsize, a, b, c; - - out_att[0] = 1.0f; - out_att[1] = 0.0f; - out_att[2] = 0.0f; - - pointsize.d = state->render_states[WINED3D_RS_POINTSIZE]; - a.d = state->render_states[WINED3D_RS_POINTSCALE_A]; - b.d = state->render_states[WINED3D_RS_POINTSCALE_B]; - c.d = state->render_states[WINED3D_RS_POINTSCALE_C]; - - /* Always use first viewport, this path does not apply to d3d10/11 multiple viewports case. */ - if (state->render_states[WINED3D_RS_POINTSCALEENABLE]) - { - float scale_factor = state->viewports[0].height * state->viewports[0].height; - - out_att[0] = a.f / scale_factor; - out_att[1] = b.f / scale_factor; - out_att[2] = c.f / scale_factor; - } - *out_pointsize = pointsize.f; -} - void get_fog_start_end(const struct wined3d_context *context, const struct wined3d_state *state, float *start, float *end) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 7de83d3b1cd..eff2400fd8f 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2779,6 +2779,10 @@ struct wined3d_ffp_vs_constants } modelview; struct wined3d_matrix projection_matrix; struct wined3d_matrix texture_matrices[WINED3D_MAX_FFP_TEXTURES]; + struct wined3d_ffp_point_constants + { + float scale_const, scale_linear, scale_quad; + } point; struct wined3d_material material; struct wined3d_ffp_light_constants { @@ -4389,8 +4393,6 @@ void get_texture_matrix(const struct wined3d_stream_info *si, const struct wined3d_stateblock_state *state, const unsigned int tex, struct wined3d_matrix *mat); void get_pointsize_minmax(const struct wined3d_context *context, const struct wined3d_state *state, float *out_min, float *out_max); -void get_pointsize(const struct wined3d_context *context, const struct wined3d_state *state, - float *out_pointsize, float *out_att); void get_fog_start_end(const struct wined3d_context *context, const struct wined3d_state *state, float *start, float *end);
This merge request was approved by Jan Sikorski.