[PATCH 1/5] wined3d: Introduce a separate function for initializing a wined3d_state structure.
Henri Verbeet
hverbeet at codeweavers.com
Tue Aug 27 01:44:57 CDT 2013
---
dlls/wined3d/stateblock.c | 46 +++++++++++++++++++++++++++++-----------------
1 file changed, 29 insertions(+), 17 deletions(-)
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 8abd8e5..1621ba7 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -196,19 +196,10 @@ static HRESULT stateblock_allocate_shader_constants(struct wined3d_stateblock *o
{
const struct wined3d_d3d_info *d3d_info = &object->device->adapter->d3d_info;
- /* Allocate space for floating point constants */
- object->state.ps_consts_f = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof(float) * d3d_info->limits.ps_uniform_count * 4);
- if (!object->state.ps_consts_f) goto fail;
-
object->changed.pixelShaderConstantsF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(BOOL) * d3d_info->limits.ps_uniform_count);
if (!object->changed.pixelShaderConstantsF) goto fail;
- object->state.vs_consts_f = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof(float) * d3d_info->limits.vs_uniform_count * 4);
- if (!object->state.vs_consts_f) goto fail;
-
object->changed.vertexShaderConstantsF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(BOOL) * d3d_info->limits.vs_uniform_count);
if (!object->changed.vertexShaderConstantsF) goto fail;
@@ -225,9 +216,7 @@ static HRESULT stateblock_allocate_shader_constants(struct wined3d_stateblock *o
fail:
ERR("Failed to allocate memory\n");
- HeapFree(GetProcessHeap(), 0, object->state.ps_consts_f);
HeapFree(GetProcessHeap(), 0, object->changed.pixelShaderConstantsF);
- HeapFree(GetProcessHeap(), 0, object->state.vs_consts_f);
HeapFree(GetProcessHeap(), 0, object->changed.vertexShaderConstantsF);
HeapFree(GetProcessHeap(), 0, object->contained_vs_consts_f);
HeapFree(GetProcessHeap(), 0, object->contained_ps_consts_f);
@@ -609,6 +598,29 @@ static void state_cleanup(struct wined3d_state *state)
HeapFree(GetProcessHeap(), 0, state->ps_consts_f);
}
+static HRESULT state_init(struct wined3d_state *state, const struct wined3d_d3d_info *d3d_info)
+{
+ unsigned int i;
+
+ for (i = 0; i < LIGHTMAP_SIZE; i++)
+ {
+ list_init(&state->light_map[i]);
+ }
+
+ if (!(state->vs_consts_f = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ 4 * sizeof(float) * d3d_info->limits.vs_uniform_count)))
+ return E_OUTOFMEMORY;
+
+ if (!(state->ps_consts_f = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ 4 * sizeof(float) * d3d_info->limits.ps_uniform_count)))
+ {
+ HeapFree(GetProcessHeap(), 0, state->vs_consts_f);
+ return E_OUTOFMEMORY;
+ }
+
+ return WINED3D_OK;
+}
+
ULONG CDECL wined3d_stateblock_decref(struct wined3d_stateblock *stateblock)
{
ULONG refcount = InterlockedDecrement(&stateblock->ref);
@@ -1407,21 +1419,21 @@ void stateblock_init_default_state(struct wined3d_stateblock *stateblock)
static HRESULT stateblock_init(struct wined3d_stateblock *stateblock,
struct wined3d_device *device, enum wined3d_stateblock_type type)
{
- unsigned int i;
HRESULT hr;
const struct wined3d_d3d_info *d3d_info = &device->adapter->d3d_info;
stateblock->ref = 1;
stateblock->device = device;
- for (i = 0; i < LIGHTMAP_SIZE; i++)
+ if (FAILED(hr = state_init(&stateblock->state, d3d_info)))
+ return hr;
+
+ if (FAILED(hr = stateblock_allocate_shader_constants(stateblock)))
{
- list_init(&stateblock->state.light_map[i]);
+ state_cleanup(&stateblock->state);
+ return hr;
}
- hr = stateblock_allocate_shader_constants(stateblock);
- if (FAILED(hr)) return hr;
-
/* The WINED3D_SBT_INIT stateblock type is used during initialization to
* produce a placeholder stateblock so other functions called can update a
* state block. */
--
1.8.1.5
More information about the wine-patches
mailing list