[PATCH 4/5] wined3d: Move the extension emulation fields from struct wined3d_context to struct wined3d_context_gl.

Henri Verbeet hverbeet at codeweavers.com
Wed May 8 08:21:37 CDT 2019


Signed-off-by: Henri Verbeet <hverbeet at 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;
 };
 
-- 
2.11.0




More information about the wine-devel mailing list