[PATCH 5/7] wined3d: Move shader limits into the adapter

Stefan Dösinger stefan at codeweavers.com
Fri Apr 19 04:20:55 CDT 2013


---
 dlls/wined3d/arb_program_shader.c | 17 +++++++++--------
 dlls/wined3d/device.c             | 19 ++++++-------------
 dlls/wined3d/directx.c            |  5 +++++
 dlls/wined3d/shader.c             | 21 ++++++++++++---------
 dlls/wined3d/stateblock.c         | 36 ++++++++++++++++++++----------------
 dlls/wined3d/wined3d_private.h    |  4 ++--
 6 files changed, 54 insertions(+), 48 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 8454f72..04824d3 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -655,6 +655,7 @@ static void shader_arb_load_constants_internal(const struct wined3d_context *con
     struct wined3d_device *device = context->swapchain->device;
     const struct wined3d_stateblock *stateblock = device->stateBlock;
     const struct wined3d_state *state = &stateblock->state;
+    const struct wined3d_adapter *adapter = context->adapter;
     const struct wined3d_gl_info *gl_info = context->gl_info;
     struct shader_arb_priv *priv = device->shader_priv;
 
@@ -688,12 +689,12 @@ static void shader_arb_load_constants_internal(const struct wined3d_context *con
     if (context != priv->last_context)
     {
         memset(priv->vshader_const_dirty, 1,
-                sizeof(*priv->vshader_const_dirty) * device->d3d_vshader_constantF);
-        priv->highest_dirty_vs_const = device->d3d_vshader_constantF;
+                sizeof(*priv->vshader_const_dirty) * adapter->d3d_vshader_constantF);
+        priv->highest_dirty_vs_const = adapter->d3d_vshader_constantF;
 
         memset(priv->pshader_const_dirty, 1,
-                sizeof(*priv->pshader_const_dirty) * device->d3d_pshader_constantF);
-        priv->highest_dirty_ps_const = device->d3d_pshader_constantF;
+                sizeof(*priv->pshader_const_dirty) * adapter->d3d_pshader_constantF);
+        priv->highest_dirty_ps_const = adapter->d3d_pshader_constantF;
 
         priv->last_context = context;
     }
@@ -4855,18 +4856,18 @@ static HRESULT shader_arb_alloc(struct wined3d_device *device, const struct frag
     }
 
     priv->vshader_const_dirty = HeapAlloc(GetProcessHeap(), 0,
-            sizeof(*priv->vshader_const_dirty) * device->d3d_vshader_constantF);
+            sizeof(*priv->vshader_const_dirty) * device->adapter->d3d_vshader_constantF);
     if (!priv->vshader_const_dirty)
         goto fail;
     memset(priv->vshader_const_dirty, 1,
-           sizeof(*priv->vshader_const_dirty) * device->d3d_vshader_constantF);
+           sizeof(*priv->vshader_const_dirty) * device->adapter->d3d_vshader_constantF);
 
     priv->pshader_const_dirty = HeapAlloc(GetProcessHeap(), 0,
-            sizeof(*priv->pshader_const_dirty) * device->d3d_pshader_constantF);
+            sizeof(*priv->pshader_const_dirty) * device->adapter->d3d_pshader_constantF);
     if (!priv->pshader_const_dirty)
         goto fail;
     memset(priv->pshader_const_dirty, 1,
-            sizeof(*priv->pshader_const_dirty) * device->d3d_pshader_constantF);
+            sizeof(*priv->pshader_const_dirty) * device->adapter->d3d_pshader_constantF);
 
     if(wine_rb_init(&priv->signature_tree, &sig_tree_functions) == -1)
     {
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 08309fe..59b8e94 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -2623,8 +2623,8 @@ HRESULT CDECL wined3d_device_set_vs_consts_f(struct wined3d_device *device,
     /* Specifically test start_register > limit to catch MAX_UINT overflows
      * when adding start_register + vector4f_count. */
     if (!constants
-            || start_register + vector4f_count > device->d3d_vshader_constantF
-            || start_register > device->d3d_vshader_constantF)
+            || start_register + vector4f_count > device->adapter->d3d_vshader_constantF
+            || start_register > device->adapter->d3d_vshader_constantF)
         return WINED3DERR_INVALIDCALL;
 
     memcpy(&device->updateStateBlock->state.vs_consts_f[start_register * 4],
@@ -2652,7 +2652,7 @@ HRESULT CDECL wined3d_device_set_vs_consts_f(struct wined3d_device *device,
 HRESULT CDECL wined3d_device_get_vs_consts_f(const struct wined3d_device *device,
         UINT start_register, float *constants, UINT vector4f_count)
 {
-    int count = min(vector4f_count, device->d3d_vshader_constantF - start_register);
+    int count = min(vector4f_count, device->adapter->d3d_vshader_constantF - start_register);
 
     TRACE("device %p, start_register %u, constants %p, vector4f_count %u.\n",
             device, start_register, constants, vector4f_count);
@@ -3092,8 +3092,8 @@ HRESULT CDECL wined3d_device_set_ps_consts_f(struct wined3d_device *device,
     /* Specifically test start_register > limit to catch MAX_UINT overflows
      * when adding start_register + vector4f_count. */
     if (!constants
-            || start_register + vector4f_count > device->d3d_pshader_constantF
-            || start_register > device->d3d_pshader_constantF)
+            || start_register + vector4f_count > device->adapter->d3d_pshader_constantF
+            || start_register > device->adapter->d3d_pshader_constantF)
         return WINED3DERR_INVALIDCALL;
 
     memcpy(&device->updateStateBlock->state.ps_consts_f[start_register * 4],
@@ -3121,7 +3121,7 @@ HRESULT CDECL wined3d_device_set_ps_consts_f(struct wined3d_device *device,
 HRESULT CDECL wined3d_device_get_ps_consts_f(const struct wined3d_device *device,
         UINT start_register, float *constants, UINT vector4f_count)
 {
-    int count = min(vector4f_count, device->d3d_pshader_constantF - start_register);
+    int count = min(vector4f_count, device->adapter->d3d_pshader_constantF - start_register);
 
     TRACE("device %p, start_register %u, constants %p, vector4f_count %u.\n",
             device, start_register, constants, vector4f_count);
@@ -5420,7 +5420,6 @@ HRESULT device_init(struct wined3d_device *device, struct wined3d *wined3d,
 {
     struct wined3d_adapter *adapter = &wined3d->adapters[adapter_idx];
     const struct fragment_pipeline *fragment_pipeline;
-    struct shader_caps shader_caps;
     struct fragment_caps ffp_caps;
     unsigned int i;
     HRESULT hr;
@@ -5441,12 +5440,6 @@ HRESULT device_init(struct wined3d_device *device, struct wined3d *wined3d,
     device->create_parms.flags = flags;
 
     device->shader_backend = adapter->shader_backend;
-    device->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
-    device->vs_version = shader_caps.vs_version;
-    device->gs_version = shader_caps.gs_version;
-    device->ps_version = shader_caps.ps_version;
-    device->d3d_vshader_constantF = shader_caps.vs_uniform_count;
-    device->d3d_pshader_constantF = shader_caps.ps_uniform_count;
 
     fragment_pipeline = adapter->fragment_pipe;
     fragment_pipeline->get_caps(&adapter->gl_info, &ffp_caps);
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 47ef8d2..d0bda3a 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2805,6 +2805,11 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
 
     adapter->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
     adapter->vs_clipping = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_VS_CLIPPING;
+    adapter->vs_version = shader_caps.vs_version;
+    adapter->gs_version = shader_caps.gs_version;
+    adapter->ps_version = shader_caps.ps_version;
+    adapter->d3d_vshader_constantF = shader_caps.vs_uniform_count;
+    adapter->d3d_pshader_constantF = shader_caps.ps_uniform_count;
 
     adapter->fragment_pipe->get_caps(gl_info, &fragment_caps);
     gl_info->limits.texture_stages = fragment_caps.MaxTextureBlendStages;
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 3aec36c..59ae49c 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -1657,13 +1657,13 @@ static HRESULT shader_set_function(struct wined3d_shader *shader, const DWORD *b
     switch (type)
     {
         case WINED3D_SHADER_TYPE_VERTEX:
-            backend_version = shader->device->vs_version;
+            backend_version = shader->device->adapter->vs_version;
             break;
         case WINED3D_SHADER_TYPE_GEOMETRY:
-            backend_version = shader->device->gs_version;
+            backend_version = shader->device->adapter->gs_version;
             break;
         case WINED3D_SHADER_TYPE_PIXEL:
-            backend_version = shader->device->ps_version;
+            backend_version = shader->device->adapter->ps_version;
             break;
         default:
             FIXME("No backend version-checking for this shader type\n");
@@ -1828,6 +1828,7 @@ static void vertexshader_set_limits(struct wined3d_shader *shader)
     DWORD shader_version = WINED3D_SHADER_VERSION(shader->reg_maps.shader_version.major,
             shader->reg_maps.shader_version.minor);
     struct wined3d_device *device = shader->device;
+    DWORD d3d_vshader_constantF = device->adapter->d3d_vshader_constantF;
 
     shader->limits.packed_input = 0;
 
@@ -1842,7 +1843,7 @@ static void vertexshader_set_limits(struct wined3d_shader *shader)
             /* TODO: vs_1_1 has a minimum of 96 constants. What happens when
              * a vs_1_1 shader is used on a vs_3_0 capable card that has 256
              * constants? */
-            shader->limits.constant_float = min(256, device->d3d_vshader_constantF);
+            shader->limits.constant_float = min(256, d3d_vshader_constantF);
             break;
 
         case WINED3D_SHADER_VERSION(2, 0):
@@ -1851,7 +1852,7 @@ static void vertexshader_set_limits(struct wined3d_shader *shader)
             shader->limits.constant_int = 16;
             shader->limits.packed_output = 12;
             shader->limits.sampler = 0;
-            shader->limits.constant_float = min(256, device->d3d_vshader_constantF);
+            shader->limits.constant_float = min(256, d3d_vshader_constantF);
             break;
 
         case WINED3D_SHADER_VERSION(3, 0):
@@ -1864,7 +1865,7 @@ static void vertexshader_set_limits(struct wined3d_shader *shader)
              * drivers advertise 1024). d3d9.dll and d3d8.dll clamp the
              * wined3d-advertised maximum. Clamp the constant limit for <= 3.0
              * shaders to 256. */
-            shader->limits.constant_float = min(256, device->d3d_vshader_constantF);
+            shader->limits.constant_float = min(256, d3d_vshader_constantF);
             break;
 
         case WINED3D_SHADER_VERSION(4, 0):
@@ -1881,7 +1882,7 @@ static void vertexshader_set_limits(struct wined3d_shader *shader)
             shader->limits.constant_int = 16;
             shader->limits.packed_output = 12;
             shader->limits.sampler = 0;
-            shader->limits.constant_float = min(256, device->d3d_vshader_constantF);
+            shader->limits.constant_float = min(256, d3d_vshader_constantF);
             FIXME("Unrecognized vertex shader version \"%u.%u\".\n",
                     shader->reg_maps.shader_version.major,
                     shader->reg_maps.shader_version.minor);
@@ -1896,11 +1897,12 @@ static HRESULT vertexshader_init(struct wined3d_shader *shader, struct wined3d_d
     unsigned int i;
     HRESULT hr;
     WORD map;
+    DWORD d3d_vshader_constantF = device->adapter->d3d_vshader_constantF;
 
     if (!byte_code) return WINED3DERR_INVALIDCALL;
 
     shader_init(shader, device, parent, parent_ops);
-    hr = shader_set_function(shader, byte_code, output_signature, device->d3d_vshader_constantF,
+    hr = shader_set_function(shader, byte_code, output_signature, d3d_vshader_constantF,
             WINED3D_SHADER_TYPE_VERTEX, max_version);
     if (FAILED(hr))
     {
@@ -2247,11 +2249,12 @@ static HRESULT pixelshader_init(struct wined3d_shader *shader, struct wined3d_de
     const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
     unsigned int i, highest_reg_used = 0, num_regs_used = 0;
     HRESULT hr;
+    DWORD d3d_pshader_constantF = device->adapter->d3d_pshader_constantF;
 
     if (!byte_code) return WINED3DERR_INVALIDCALL;
 
     shader_init(shader, device, parent, parent_ops);
-    hr = shader_set_function(shader, byte_code, output_signature, device->d3d_pshader_constantF,
+    hr = shader_set_function(shader, byte_code, output_signature, d3d_pshader_constantF,
             WINED3D_SHADER_TYPE_PIXEL, max_version);
     if (FAILED(hr))
     {
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 3349376..1cf4e1e 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -194,31 +194,31 @@ static const DWORD vertex_states_sampler[] =
  */
 static HRESULT stateblock_allocate_shader_constants(struct wined3d_stateblock *object)
 {
-    struct wined3d_device *device = object->device;
+    const struct wined3d_adapter *adapter = object->device->adapter;
 
     /* Allocate space for floating point constants */
     object->state.ps_consts_f = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-            sizeof(float) * device->d3d_pshader_constantF * 4);
+            sizeof(float) * adapter->d3d_pshader_constantF * 4);
     if (!object->state.ps_consts_f) goto fail;
 
     object->changed.pixelShaderConstantsF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-            sizeof(BOOL) * device->d3d_pshader_constantF);
+            sizeof(BOOL) * adapter->d3d_pshader_constantF);
     if (!object->changed.pixelShaderConstantsF) goto fail;
 
     object->state.vs_consts_f = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-            sizeof(float) * device->d3d_vshader_constantF * 4);
+            sizeof(float) * adapter->d3d_vshader_constantF * 4);
     if (!object->state.vs_consts_f) goto fail;
 
     object->changed.vertexShaderConstantsF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-            sizeof(BOOL) * device->d3d_vshader_constantF);
+            sizeof(BOOL) * adapter->d3d_vshader_constantF);
     if (!object->changed.vertexShaderConstantsF) goto fail;
 
     object->contained_vs_consts_f = HeapAlloc(GetProcessHeap(), 0,
-            sizeof(DWORD) * device->d3d_vshader_constantF);
+            sizeof(DWORD) * adapter->d3d_vshader_constantF);
     if (!object->contained_vs_consts_f) goto fail;
 
     object->contained_ps_consts_f = HeapAlloc(GetProcessHeap(), 0,
-            sizeof(DWORD) * device->d3d_pshader_constantF);
+            sizeof(DWORD) * adapter->d3d_pshader_constantF);
     if (!object->contained_ps_consts_f) goto fail;
 
     return WINED3D_OK;
@@ -330,7 +330,7 @@ static void stateblock_savedstates_set_vertex(struct wined3d_saved_states *state
 
 void stateblock_init_contained_states(struct wined3d_stateblock *stateblock)
 {
-    struct wined3d_device *device = stateblock->device;
+    struct wined3d_adapter *adapter = stateblock->device->adapter;
     unsigned int i, j;
 
     for (i = 0; i <= WINEHIGHEST_RENDER_STATE >> 5; ++i)
@@ -357,7 +357,7 @@ void stateblock_init_contained_states(struct wined3d_stateblock *stateblock)
         }
     }
 
-    for (i = 0; i < device->d3d_vshader_constantF; ++i)
+    for (i = 0; i < adapter->d3d_vshader_constantF; ++i)
     {
         if (stateblock->changed.vertexShaderConstantsF[i])
         {
@@ -384,7 +384,7 @@ void stateblock_init_contained_states(struct wined3d_stateblock *stateblock)
         }
     }
 
-    for (i = 0; i < device->d3d_pshader_constantF; ++i)
+    for (i = 0; i < adapter->d3d_pshader_constantF; ++i)
     {
         if (stateblock->changed.pixelShaderConstantsF[i])
         {
@@ -1163,11 +1163,13 @@ void stateblock_init_default_state(struct wined3d_stateblock *stateblock)
     unsigned int i;
     struct wined3d_swapchain *swapchain;
     struct wined3d_surface *backbuffer;
+    DWORD d3d_pshader_constantF = device->adapter->d3d_pshader_constantF;
+    DWORD d3d_vshader_constantF = device->adapter->d3d_vshader_constantF;
 
     TRACE("stateblock %p.\n", stateblock);
 
-    memset(stateblock->changed.pixelShaderConstantsF, 0, device->d3d_pshader_constantF * sizeof(BOOL));
-    memset(stateblock->changed.vertexShaderConstantsF, 0, device->d3d_vshader_constantF * sizeof(BOOL));
+    memset(stateblock->changed.pixelShaderConstantsF, 0, d3d_pshader_constantF * sizeof(BOOL));
+    memset(stateblock->changed.vertexShaderConstantsF, 0, d3d_vshader_constantF * sizeof(BOOL));
 
     /* Set some of the defaults for lights, transforms etc */
     state->transforms[WINED3D_TS_PROJECTION] = identity;
@@ -1419,17 +1421,19 @@ static HRESULT stateblock_init(struct wined3d_stateblock *stateblock,
     {
         case WINED3D_SBT_ALL:
             stateblock_init_lights(stateblock, device->stateBlock->state.light_map);
-            stateblock_savedstates_set_all(&stateblock->changed, device->d3d_vshader_constantF,
-                                           device->d3d_pshader_constantF);
+            stateblock_savedstates_set_all(&stateblock->changed,
+                    device->adapter->d3d_vshader_constantF, device->adapter->d3d_pshader_constantF);
             break;
 
         case WINED3D_SBT_PIXEL_STATE:
-            stateblock_savedstates_set_pixel(&stateblock->changed, device->d3d_pshader_constantF);
+            stateblock_savedstates_set_pixel(&stateblock->changed,
+                    device->adapter->d3d_pshader_constantF);
             break;
 
         case WINED3D_SBT_VERTEX_STATE:
             stateblock_init_lights(stateblock, device->stateBlock->state.light_map);
-            stateblock_savedstates_set_vertex(&stateblock->changed, device->d3d_vshader_constantF);
+            stateblock_savedstates_set_vertex(&stateblock->changed,
+                    device->adapter->d3d_vshader_constantF);
             break;
 
         default:
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 3e26d0b..fbb0026 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1592,6 +1592,8 @@ struct wined3d_adapter
 
     /* Cached backend limits */
     DWORD vs_clipping;
+    UINT vs_version, gs_version, ps_version;
+    DWORD d3d_vshader_constantF, d3d_pshader_constantF; /* Advertised d3d caps, not GL ones */
 };
 
 BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter) DECLSPEC_HIDDEN;
@@ -1707,8 +1709,6 @@ struct wined3d_device
     const struct blit_shader *blitter;
 
     unsigned int max_ffp_textures;
-    UINT vs_version, gs_version, ps_version;
-    DWORD d3d_vshader_constantF, d3d_pshader_constantF; /* Advertised d3d caps, not GL ones */
     UINT instance_count;
 
     WORD vertexBlendUsed : 1;           /* To avoid needless setting of the blend matrices */
-- 
1.8.1.5




More information about the wine-patches mailing list