Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- dlls/wined3d/gl_compat.c | 241 +++++++++++++++++++++++++---------------- dlls/wined3d/wined3d_private.h | 18 +-- 2 files changed, 159 insertions(+), 100 deletions(-)
diff --git a/dlls/wined3d/gl_compat.c b/dlls/wined3d/gl_compat.c index a2fb09c39e1..c1491d4c631 100644 --- a/dlls/wined3d/gl_compat.c +++ b/dlls/wined3d/gl_compat.c @@ -149,121 +149,168 @@ static void WINE_GLAPI wine_glGetDoublev(GLenum pname, GLdouble* params) { }
/* Start GL_EXT_fogcoord emulation */ -static void (WINE_GLAPI *old_fogcoord_glEnable) (GLenum cap) = NULL; -static void WINE_GLAPI wine_glEnable(GLenum cap) { - if(cap == GL_FOG) { - struct wined3d_context *ctx = context_get_current(); +static void (WINE_GLAPI *old_fogcoord_glEnable)(GLenum cap); +static void WINE_GLAPI wine_glEnable(GLenum cap) +{ + if (cap == GL_FOG) + { + struct wined3d_context_gl *ctx = wined3d_context_gl(context_get_current()); + ctx->fog_enabled = 1; - if(ctx->gl_fog_source != GL_FRAGMENT_DEPTH_EXT) return; + if (ctx->gl_fog_source != GL_FRAGMENT_DEPTH_EXT) + return; } old_fogcoord_glEnable(cap); }
-static void (WINE_GLAPI *old_fogcoord_glDisable) (GLenum cap) = NULL; -static void WINE_GLAPI wine_glDisable(GLenum cap) { - if(cap == GL_FOG) { - struct wined3d_context *ctx = context_get_current(); +static void (WINE_GLAPI *old_fogcoord_glDisable)(GLenum cap); +static void WINE_GLAPI wine_glDisable(GLenum cap) +{ + if (cap == GL_FOG) + { + struct wined3d_context_gl *ctx = wined3d_context_gl(context_get_current()); + ctx->fog_enabled = 0; - if(ctx->gl_fog_source != GL_FRAGMENT_DEPTH_EXT) return; + if (ctx->gl_fog_source != GL_FRAGMENT_DEPTH_EXT) + return; } old_fogcoord_glDisable(cap); }
-static void (WINE_GLAPI *old_fogcoord_glFogi) (GLenum pname, GLint param) = NULL; -static void WINE_GLAPI wine_glFogi(GLenum pname, GLint param) { - struct wined3d_context *ctx = context_get_current(); +static void (WINE_GLAPI *old_fogcoord_glFogi)(GLenum pname, GLint param); +static void WINE_GLAPI wine_glFogi(GLenum pname, GLint param) +{ + struct wined3d_context_gl *ctx = wined3d_context_gl(context_get_current());
- if(pname == GL_FOG_COORDINATE_SOURCE_EXT) { + if (pname == GL_FOG_COORDINATE_SOURCE_EXT) + { ctx->gl_fog_source = param; - if(param == GL_FRAGMENT_DEPTH_EXT) { - if(ctx->fog_enabled) old_fogcoord_glEnable(GL_FOG); - } else { - WARN_(d3d_perf)("Fog coords activated, but not supported. Using slow emulation\n"); - old_fogcoord_glDisable(GL_FOG); + if (param == GL_FRAGMENT_DEPTH_EXT) + { + if (ctx->fog_enabled) + old_fogcoord_glEnable(GL_FOG); } - } else { - if(pname == GL_FOG_START) { - ctx->fogstart = (float) param; - } else if(pname == GL_FOG_END) { - ctx->fogend = (float) param; + else + { + WARN_(d3d_perf)("Fog coordinates activated, but not supported. Using slow emulation.\n"); + old_fogcoord_glDisable(GL_FOG); } + } + else + { + if (pname == GL_FOG_START) + ctx->fog_start = (float)param; + else if (pname == GL_FOG_END) + ctx->fog_end = (float)param; old_fogcoord_glFogi(pname, param); } }
-static void (WINE_GLAPI *old_fogcoord_glFogiv) (GLenum pname, const GLint *param) = NULL; -static void WINE_GLAPI wine_glFogiv(GLenum pname, const GLint *param) { - struct wined3d_context *ctx = context_get_current(); - if(pname == GL_FOG_COORDINATE_SOURCE_EXT) { +static void (WINE_GLAPI *old_fogcoord_glFogiv)(GLenum pname, const GLint *param); +static void WINE_GLAPI wine_glFogiv(GLenum pname, const GLint *param) +{ + struct wined3d_context_gl *ctx = wined3d_context_gl(context_get_current()); + + if (pname == GL_FOG_COORDINATE_SOURCE_EXT) + { ctx->gl_fog_source = *param; - if(*param == GL_FRAGMENT_DEPTH_EXT) { - if(ctx->fog_enabled) old_fogcoord_glEnable(GL_FOG); - } else { - WARN_(d3d_perf)("Fog coords activated, but not supported. Using slow emulation\n"); - old_fogcoord_glDisable(GL_FOG); + if (*param == GL_FRAGMENT_DEPTH_EXT) + { + if (ctx->fog_enabled) + old_fogcoord_glEnable(GL_FOG); } - } else { - if(pname == GL_FOG_START) { - ctx->fogstart = (float) *param; - } else if(pname == GL_FOG_END) { - ctx->fogend = (float) *param; + else + { + WARN_(d3d_perf)("Fog coordinates activated, but not supported. Using slow emulation.\n"); + old_fogcoord_glDisable(GL_FOG); } + } + else + { + if (pname == GL_FOG_START) + ctx->fog_start = (float)*param; + else if (pname == GL_FOG_END) + ctx->fog_end = (float)*param; old_fogcoord_glFogiv(pname, param); } }
-static void (WINE_GLAPI *old_fogcoord_glFogf) (GLenum pname, GLfloat param) = NULL; -static void WINE_GLAPI wine_glFogf(GLenum pname, GLfloat param) { - struct wined3d_context *ctx = context_get_current(); - if(pname == GL_FOG_COORDINATE_SOURCE_EXT) { - ctx->gl_fog_source = (GLint) param; - if(param == GL_FRAGMENT_DEPTH_EXT) { - if(ctx->fog_enabled) old_fogcoord_glEnable(GL_FOG); - } else { - WARN_(d3d_perf)("Fog coords activated, but not supported. Using slow emulation\n"); - old_fogcoord_glDisable(GL_FOG); +static void (WINE_GLAPI *old_fogcoord_glFogf)(GLenum pname, GLfloat param); +static void WINE_GLAPI wine_glFogf(GLenum pname, GLfloat param) +{ + struct wined3d_context_gl *ctx = wined3d_context_gl(context_get_current()); + + if (pname == GL_FOG_COORDINATE_SOURCE_EXT) + { + ctx->gl_fog_source = (GLint)param; + if (param == GL_FRAGMENT_DEPTH_EXT) + { + if (ctx->fog_enabled) + old_fogcoord_glEnable(GL_FOG); } - } else { - if(pname == GL_FOG_START) { - ctx->fogstart = param; - } else if(pname == GL_FOG_END) { - ctx->fogend = param; + else + { + WARN_(d3d_perf)("Fog coordinates activated, but not supported. Using slow emulation.\n"); + old_fogcoord_glDisable(GL_FOG); } + } + else + { + if (pname == GL_FOG_START) + ctx->fog_start = param; + else if (pname == GL_FOG_END) + ctx->fog_end = param; old_fogcoord_glFogf(pname, param); } }
-static void (WINE_GLAPI *old_fogcoord_glFogfv) (GLenum pname, const GLfloat *param) = NULL; -static void WINE_GLAPI wine_glFogfv(GLenum pname, const GLfloat *param) { - struct wined3d_context *ctx = context_get_current(); - if(pname == GL_FOG_COORDINATE_SOURCE_EXT) { - ctx->gl_fog_source = (GLint) *param; - if(*param == GL_FRAGMENT_DEPTH_EXT) { - if(ctx->fog_enabled) old_fogcoord_glEnable(GL_FOG); - } else { - WARN_(d3d_perf)("Fog coords activated, but not supported. Using slow emulation\n"); +static void (WINE_GLAPI *old_fogcoord_glFogfv)(GLenum pname, const GLfloat *param); +static void WINE_GLAPI wine_glFogfv(GLenum pname, const GLfloat *param) +{ + struct wined3d_context_gl *ctx = wined3d_context_gl(context_get_current()); + + if (pname == GL_FOG_COORDINATE_SOURCE_EXT) + { + ctx->gl_fog_source = (GLint)*param; + if (*param == GL_FRAGMENT_DEPTH_EXT) + { + if (ctx->fog_enabled) + old_fogcoord_glEnable(GL_FOG); + } + else + { + WARN_(d3d_perf)("Fog coordinates activated, but not supported. Using slow emulation.\n"); old_fogcoord_glDisable(GL_FOG); } - } else { - if(pname == GL_FOG_COLOR) { - ctx->fogcolor[0] = param[0]; - ctx->fogcolor[1] = param[1]; - ctx->fogcolor[2] = param[2]; - ctx->fogcolor[3] = param[3]; - } else if(pname == GL_FOG_START) { - ctx->fogstart = *param; - } else if(pname == GL_FOG_END) { - ctx->fogend = *param; + } + else + { + if (pname == GL_FOG_COLOR) + { + ctx->fog_colour[0] = param[0]; + ctx->fog_colour[1] = param[1]; + ctx->fog_colour[2] = param[2]; + ctx->fog_colour[3] = param[3]; + } + else if (pname == GL_FOG_START) + { + ctx->fog_start = *param; + } + else if (pname == GL_FOG_END) + { + ctx->fog_end = *param; } old_fogcoord_glFogfv(pname, param); } }
-static void (WINE_GLAPI *old_fogcoord_glVertex4f) (GLfloat x, GLfloat y, GLfloat z, GLfloat w) = NULL; -static void (WINE_GLAPI *old_fogcoord_glColor4f) (GLfloat r, GLfloat g, GLfloat b, GLfloat a) = NULL; +static void (WINE_GLAPI *old_fogcoord_glVertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +static void (WINE_GLAPI *old_fogcoord_glColor4f)(GLfloat r, GLfloat g, GLfloat b, GLfloat a);
-static void WINE_GLAPI wine_glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { +static void WINE_GLAPI wine_glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ struct wined3d_context *ctx = context_get_current(); + struct wined3d_context_gl *ctx_gl;
/* This can be called from draw_test_quad() and at that point there is no * wined3d_context current. */ @@ -272,18 +319,23 @@ static void WINE_GLAPI wine_glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat old_fogcoord_glVertex4f(x, y, z, w); return; } - if(ctx->gl_fog_source == GL_FOG_COORDINATE_EXT && ctx->fog_enabled) { - GLfloat c[4] = {ctx->color[0], ctx->color[1], ctx->color[2], ctx->color[3]}; + + ctx_gl = wined3d_context_gl(ctx); + if (ctx_gl->gl_fog_source == GL_FOG_COORDINATE_EXT && ctx_gl->fog_enabled) + { + GLfloat c[4] = {ctx_gl->colour[0], ctx_gl->colour[1], ctx_gl->colour[2], ctx_gl->colour[3]}; GLfloat i;
- i = (ctx->fogend - ctx->fog_coord_value) / (ctx->fogend - ctx->fogstart); - c[0] = i * c[0] + (1.0f - i) * ctx->fogcolor[0]; - c[1] = i * c[1] + (1.0f - i) * ctx->fogcolor[1]; - c[2] = i * c[2] + (1.0f - i) * ctx->fogcolor[2]; + i = (ctx_gl->fog_end - ctx_gl->fog_coord_value) / (ctx_gl->fog_end - ctx_gl->fog_start); + c[0] = i * c[0] + (1.0f - i) * ctx_gl->fog_colour[0]; + c[1] = i * c[1] + (1.0f - i) * ctx_gl->fog_colour[1]; + c[2] = i * c[2] + (1.0f - i) * ctx_gl->fog_colour[2];
old_fogcoord_glColor4f(c[0], c[1], c[2], c[3]); old_fogcoord_glVertex4f(x, y, z, w); - } else { + } + else + { old_fogcoord_glVertex4f(x, y, z, w); } } @@ -300,8 +352,10 @@ static void WINE_GLAPI wine_glVertex3fv(const GLfloat *pos) { wine_glVertex4f(pos[0], pos[1], pos[2], 1.0f); }
-static void WINE_GLAPI wine_glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { +static void WINE_GLAPI wine_glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) +{ struct wined3d_context *ctx = context_get_current(); + struct wined3d_context_gl *ctx_gl;
/* This can be called from draw_test_quad() and at that point there is no * wined3d_context current. */ @@ -310,10 +364,12 @@ static void WINE_GLAPI wine_glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a old_fogcoord_glColor4f(r, g, b, a); return; } - ctx->color[0] = r; - ctx->color[1] = g; - ctx->color[2] = b; - ctx->color[3] = a; + + ctx_gl = wined3d_context_gl(ctx); + ctx_gl->colour[0] = r; + ctx_gl->colour[1] = g; + ctx_gl->colour[2] = b; + ctx_gl->colour[3] = a; old_fogcoord_glColor4f(r, g, b, a); }
@@ -333,11 +389,12 @@ static void WINE_GLAPI wine_glColor4ub(GLubyte r, GLubyte g, GLubyte b, GLubyte wine_glColor4f(r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f); }
-/* In D3D the fog coord is a UBYTE, so there's no problem with using the single - * precision function - */ -static void WINE_GLAPI wine_glFogCoordfEXT(GLfloat f) { - struct wined3d_context *ctx = context_get_current(); +/* In D3D the fog coord is a UBYTE, so there's no problem with using the + * single precision function. */ +static void WINE_GLAPI wine_glFogCoordfEXT(GLfloat f) +{ + struct wined3d_context_gl *ctx = wined3d_context_gl(context_get_current()); + ctx->fog_coord_value = f; } static void WINE_GLAPI wine_glFogCoorddEXT(GLdouble f) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 2b7172a6dc5..fd27c6edc72 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1919,9 +1919,9 @@ struct wined3d_context DWORD last_was_blit : 1; DWORD last_was_ckey : 1; DWORD fog_coord : 1; - DWORD fog_enabled : 1; DWORD current : 1; DWORD destroyed : 1; + DWORD destroy_delayed : 1; DWORD valid : 1;
DWORD texShaderBumpMap : 8; /* WINED3D_MAX_TEXTURES, 8 */ @@ -1939,13 +1939,12 @@ struct wined3d_context DWORD update_unordered_access_view_bindings : 1; DWORD update_compute_unordered_access_view_bindings : 1; DWORD uses_uavs : 1; - DWORD destroy_delayed : 1; DWORD transform_feedback_active : 1; DWORD transform_feedback_paused : 1; DWORD shader_update_mask : 6; /* WINED3D_SHADER_TYPE_COUNT, 6 */ DWORD clip_distance_mask : 8; /* WINED3D_MAX_CLIP_DISTANCES, 8 */ DWORD num_untracked_materials : 2; /* Max value 2 */ - DWORD padding : 7; + DWORD padding : 8;
DWORD constant_update_mask; DWORD numbered_array_mask; @@ -2019,11 +2018,6 @@ struct wined3d_context DWORD tex_unit_map[WINED3D_MAX_COMBINED_SAMPLERS]; DWORD rev_tex_unit_map[MAX_GL_FRAGMENT_SAMPLERS + WINED3D_MAX_VERTEX_SAMPLERS];
- /* Extension emulation */ - GLint gl_fog_source; - GLfloat fog_coord_value; - GLfloat color[4], fogstart, fogend, fogcolor[4]; - unsigned int viewport_count; unsigned int scissor_rect_count; }; @@ -2037,8 +2031,16 @@ struct wined3d_context_gl { struct wined3d_context c;
+ uint32_t fog_enabled : 1; + uint32_t padding : 31; + GLenum *texture_type;
+ /* Extension emulation. */ + GLint gl_fog_source; + GLfloat fog_coord_value; + GLfloat colour[4], fog_start, fog_end, fog_colour[4]; + GLuint dummy_arbfp_prog; };
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=52009
Your paranoid android.
=== debian9 (build log) ===
error: patch failed: dlls/wined3d/context.c:1478 error: patch failed: dlls/wined3d/context.c:1482 Task: Patch failed to apply
=== debian9 (build log) ===
error: patch failed: dlls/wined3d/context.c:1478 error: patch failed: dlls/wined3d/context.c:1482 Task: Patch failed to apply