[PATCH 2/5] wined3d: Move the rel_offset vertex shader field to the ARB shader backend.

Henri Verbeet hverbeet at codeweavers.com
Thu Dec 2 17:55:45 CST 2010


---
 dlls/wined3d/arb_program_shader.c |  122 ++++++++++++++++++++++---------------
 dlls/wined3d/shader.c             |   25 --------
 dlls/wined3d/wined3d_private.h    |    1 -
 3 files changed, 72 insertions(+), 76 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 6c28d7f..bb338bf 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -78,47 +78,6 @@ static void shader_arb_dump_program_source(const char *source)
     HeapFree(GetProcessHeap(), 0, tmp);
 }
 
-/* GL locking for state handlers is done by the caller. */
-static BOOL need_rel_addr_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
-{
-    if (shader->baseShader.reg_maps.shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
-    {
-        if (((IWineD3DVertexShaderImpl *)shader)->rel_offset) return TRUE;
-    }
-    if (!shader->baseShader.reg_maps.usesmova) return FALSE;
-    return !gl_info->supported[NV_VERTEX_PROGRAM2_OPTION];
-}
-
-/* Returns TRUE if result.clip from GL_NV_vertex_program2 should be used and FALSE otherwise */
-static inline BOOL use_nv_clip(const struct wined3d_gl_info *gl_info)
-{
-    return gl_info->supported[NV_VERTEX_PROGRAM2_OPTION]
-            && !(gl_info->quirks & WINED3D_QUIRK_NV_CLIP_BROKEN);
-}
-
-static BOOL need_helper_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
-{
-    if (need_rel_addr_const(shader, gl_info)) return TRUE;
-    if (!gl_info->supported[NV_VERTEX_PROGRAM]) return TRUE; /* Need to init colors. */
-    if (gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT) return TRUE; /* Load the immval offset. */
-    if (gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W) return TRUE; /* Have to init texcoords. */
-    if (!use_nv_clip(gl_info)) return TRUE; /* Init the clip texcoord */
-    if (shader->baseShader.reg_maps.usesnrm) return TRUE; /* 0.0 */
-    if (shader->baseShader.reg_maps.usesrcp) return TRUE; /* EPS */
-    return FALSE;
-}
-
-static unsigned int reserved_vs_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
-{
-    unsigned int ret = 1;
-    /* We use one PARAM for the pos fixup, and in some cases one to load
-     * some immediate values into the shader
-     */
-    if(need_helper_const(shader, gl_info)) ret++;
-    if(need_rel_addr_const(shader, gl_info)) ret++;
-    return ret;
-}
-
 enum arb_helper_value
 {
     ARB_ZERO,
@@ -335,6 +294,7 @@ struct arb_pshader_private {
 struct arb_vshader_private {
     struct arb_vs_compiled_shader   *gl_shaders;
     UINT                            num_gl_shaders, shader_array_size;
+    UINT rel_offset;
 };
 
 struct shader_arb_priv
@@ -355,9 +315,46 @@ struct shader_arb_priv
     DWORD ps_sig_number;
 };
 
-/********************************************************
- * ARB_[vertex/fragment]_program helper functions follow
- ********************************************************/
+/* GL locking for state handlers is done by the caller. */
+static BOOL need_rel_addr_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
+{
+    if (shader->baseShader.reg_maps.shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
+    {
+        const struct arb_vshader_private *shader_data = shader->baseShader.backend_data;
+        if (shader_data->rel_offset) return TRUE;
+    }
+    if (!shader->baseShader.reg_maps.usesmova) return FALSE;
+    return !gl_info->supported[NV_VERTEX_PROGRAM2_OPTION];
+}
+
+/* Returns TRUE if result.clip from GL_NV_vertex_program2 should be used and FALSE otherwise */
+static inline BOOL use_nv_clip(const struct wined3d_gl_info *gl_info)
+{
+    return gl_info->supported[NV_VERTEX_PROGRAM2_OPTION]
+            && !(gl_info->quirks & WINED3D_QUIRK_NV_CLIP_BROKEN);
+}
+
+static BOOL need_helper_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
+{
+    if (need_rel_addr_const(shader, gl_info)) return TRUE;
+    if (!gl_info->supported[NV_VERTEX_PROGRAM]) return TRUE; /* Need to init colors. */
+    if (gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT) return TRUE; /* Load the immval offset. */
+    if (gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W) return TRUE; /* Have to init texcoords. */
+    if (!use_nv_clip(gl_info)) return TRUE; /* Init the clip texcoord */
+    if (shader->baseShader.reg_maps.usesnrm) return TRUE; /* 0.0 */
+    if (shader->baseShader.reg_maps.usesrcp) return TRUE; /* EPS */
+    return FALSE;
+}
+
+static unsigned int reserved_vs_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
+{
+    unsigned int ret = 1;
+    /* We use one PARAM for the pos fixup, and in some cases one to load
+     * some immediate values into the shader. */
+    if (need_helper_const(shader, gl_info)) ++ret;
+    if (need_rel_addr_const(shader, gl_info)) ++ret;
+    return ret;
+}
 
 /* Loads floating point constants into the currently set ARB_vertex/fragment_program.
  * When constant_list == NULL, it will load all the constants.
@@ -1032,9 +1029,10 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction
         case WINED3DSPR_CONST:
             if (!pshader && reg->rel_addr)
             {
+                const struct arb_vshader_private *shader_data = This->baseShader.backend_data;
+                UINT rel_offset = shader_data->rel_offset;
                 BOOL aL = FALSE;
                 char rel_reg[50];
-                UINT rel_offset = ((IWineD3DVertexShaderImpl *)This)->rel_offset;
                 if (reg_maps->shader_version.major < 2)
                 {
                     sprintf(rel_reg, "A0.x");
@@ -1752,7 +1750,9 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
     char src0_param[256];
 
-    if(ins->handler_idx == WINED3DSIH_MOVA) {
+    if (ins->handler_idx == WINED3DSIH_MOVA)
+    {
+        const struct arb_vshader_private *shader_data = shader->baseShader.backend_data;
         char write_mask[6];
         const char *offset = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_VS_REL_OFFSET);
 
@@ -1779,7 +1779,7 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
         shader_addline(buffer, "ABS TA%s, %s;\n", write_mask, src0_param);
         shader_addline(buffer, "ADD TA%s, TA, rel_addr_const.x;\n", write_mask);
         shader_addline(buffer, "FLR TA%s, TA;\n", write_mask);
-        if (((IWineD3DVertexShaderImpl *)shader)->rel_offset)
+        if (shader_data->rel_offset)
         {
             shader_addline(buffer, "ADD TA%s, TA, %s;\n", write_mask, offset);
         }
@@ -1791,8 +1791,10 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
           && !shader_is_pshader_version(reg_maps->shader_version.type)
           && ins->dst[0].reg.type == WINED3DSPR_ADDR)
     {
+        const struct arb_vshader_private *shader_data = shader->baseShader.backend_data;
         src0_param[0] = '\0';
-        if (((IWineD3DVertexShaderImpl *)shader)->rel_offset)
+
+        if (shader_data->rel_offset)
         {
             const char *offset = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_VS_REL_OFFSET);
             shader_arb_get_src_param(ins, &ins->src[0], 0, src0_param);
@@ -4063,6 +4065,7 @@ static void init_output_registers(IWineD3DVertexShaderImpl *shader, DWORD sig_nu
 static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct wined3d_shader_buffer *buffer,
         const struct arb_vs_compile_args *args, struct arb_vs_compiled_shader *compiled)
 {
+    const struct arb_vshader_private *shader_data = This->baseShader.backend_data;
     const shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
     CONST DWORD *function = This->baseShader.function;
     IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device;
@@ -4104,8 +4107,9 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct
     if(need_helper_const((IWineD3DBaseShaderImpl *) This, gl_info)) {
         shader_addline(buffer, "PARAM helper_const = { 0.0, 1.0, 2.0, %1.10f};\n", eps);
     }
-    if(need_rel_addr_const((IWineD3DBaseShaderImpl *) This, gl_info)) {
-        shader_addline(buffer, "PARAM rel_addr_const = { 0.5, %d.0, 0.0, 0.0 };\n", This->rel_offset);
+    if (need_rel_addr_const((IWineD3DBaseShaderImpl *) This, gl_info))
+    {
+        shader_addline(buffer, "PARAM rel_addr_const = { 0.5, %d.0, 0.0, 0.0 };\n", shader_data->rel_offset);
         shader_addline(buffer, "TEMP A0_SHADOW;\n");
     }
 
@@ -4328,7 +4332,25 @@ static struct arb_vs_compiled_shader *find_arb_vshader(IWineD3DVertexShaderImpl
 
     if (!shader->baseShader.backend_data)
     {
+        const struct shader_reg_maps *reg_maps = &shader->baseShader.reg_maps;
+
         shader->baseShader.backend_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data));
+        shader_data = shader->baseShader.backend_data;
+
+        if ((gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT)
+                && reg_maps->min_rel_offset <= reg_maps->max_rel_offset)
+        {
+            if (reg_maps->max_rel_offset - reg_maps->min_rel_offset > 127)
+            {
+                FIXME("The difference between the minimum and maximum relative offset is > 127.\n");
+                FIXME("Which this OpenGL implementation does not support. Try using GLSL.\n");
+                FIXME("Min: %u, Max: %u.\n", reg_maps->min_rel_offset, reg_maps->max_rel_offset);
+            }
+            else if (reg_maps->max_rel_offset - reg_maps->min_rel_offset > 63)
+                shader_data->rel_offset = reg_maps->min_rel_offset + 63;
+            else if (reg_maps->max_rel_offset > 63)
+                shader_data->rel_offset = reg_maps->min_rel_offset;
+        }
     }
     shader_data = shader->baseShader.backend_data;
 
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 320b2f4..25ed2cf 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -1852,7 +1852,6 @@ HRESULT vertexshader_init(IWineD3DVertexShaderImpl *shader, IWineD3DDeviceImpl *
         const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
         void *parent, const struct wined3d_parent_ops *parent_ops)
 {
-    const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
     struct shader_reg_maps *reg_maps = &shader->baseShader.reg_maps;
     unsigned int i;
     HRESULT hr;
@@ -1894,30 +1893,6 @@ HRESULT vertexshader_init(IWineD3DVertexShaderImpl *shader, IWineD3DDeviceImpl *
 
     vertexshader_set_limits(shader);
 
-    if (device->vs_selected_mode == SHADER_ARB
-            && (gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT)
-            && reg_maps->min_rel_offset <= reg_maps->max_rel_offset)
-    {
-        if (reg_maps->max_rel_offset - reg_maps->min_rel_offset > 127)
-        {
-            FIXME("The difference between the minimum and maximum relative offset is > 127.\n");
-            FIXME("Which this OpenGL implementation does not support. Try using GLSL.\n");
-            FIXME("Min: %u, Max: %u.\n", reg_maps->min_rel_offset, reg_maps->max_rel_offset);
-        }
-        else if (reg_maps->max_rel_offset - reg_maps->min_rel_offset > 63)
-        {
-            shader->rel_offset = reg_maps->min_rel_offset + 63;
-        }
-        else if (reg_maps->max_rel_offset > 63)
-        {
-            shader->rel_offset = reg_maps->min_rel_offset;
-        }
-        else
-        {
-            shader->rel_offset = 0;
-        }
-    }
-
     shader->baseShader.load_local_constsF = shader->baseShader.reg_maps.usesrelconstF
             && !list_empty(&shader->baseShader.constantsF);
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index aa77211..393dda7 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2868,7 +2868,6 @@ typedef struct IWineD3DVertexShaderImpl {
 
     /* Vertex shader attributes. */
     struct wined3d_shader_attribute attributes[MAX_ATTRIBS];
-    UINT                       rel_offset;
 } IWineD3DVertexShaderImpl;
 
 void find_vs_compile_args(const struct wined3d_state *state,
-- 
1.7.2.2




More information about the wine-patches mailing list