From 19d223cadea1956eac0f0f8629c0ce1f7dc7a9b5 Mon Sep 17 00:00:00 2001 From: "H. Verbeet" Date: Tue, 27 Feb 2007 20:51:58 +0100 Subject: [PATCH] wined3d: Store multiple constant indices per list entry. --- dlls/wined3d/arb_program_shader.c | 29 +++++++++++++++-------- dlls/wined3d/device.c | 18 +++++++++----- dlls/wined3d/glsl_shader.c | 39 +++++++++++++++++++------------ dlls/wined3d/stateblock.c | 6 ++--- dlls/wined3d/wined3d_private.h | 7 +++--- 5 files changed, 62 insertions(+), 37 deletions(-) diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 083c8122aaf..e48303306f4 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -50,21 +50,30 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_constants); */ static void shader_arb_load_constantsF(IWineD3DBaseShaderImpl* This, WineD3D_GL_Info *gl_info, GLuint target_type, unsigned int max_constants, float* constants, struct list *constant_list) { - constant_entry *constant; + constants_entry *constant; local_constant* lconst; - int i; + DWORD i, j; + DWORD *idx; if (TRACE_ON(d3d_shader)) { - LIST_FOR_EACH_ENTRY(constant, constant_list, constant_entry, entry) { - i = constant->idx; - TRACE_(d3d_constants)("Loading constants %i: %f, %f, %f, %f\n", i, - constants[i * 4 + 0], constants[i * 4 + 1], - constants[i * 4 + 2], constants[i * 4 + 3]); + LIST_FOR_EACH_ENTRY(constant, constant_list, constants_entry, entry) { + idx = constant->idx; + j = constant->count; + while (j--) { + i = *idx++; + TRACE_(d3d_constants)("Loading constants %i: %f, %f, %f, %f\n", i, + constants[i * 4 + 0], constants[i * 4 + 1], + constants[i * 4 + 2], constants[i * 4 + 3]); + } } } - LIST_FOR_EACH_ENTRY(constant, constant_list, constant_entry, entry) { - i = constant->idx; - GL_EXTCALL(glProgramEnvParameter4fvARB(target_type, i, constants + (i * 4))); + LIST_FOR_EACH_ENTRY(constant, constant_list, constants_entry, entry) { + idx = constant->idx; + j = constant->count; + while (j--) { + i = *idx++; + GL_EXTCALL(glProgramEnvParameter4fvARB(target_type, i, constants + (i * 4))); + } } checkGLcall("glProgramEnvParameter4fvARB()"); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index f73ceb7327c..94c49fa3411 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -2958,9 +2958,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShaderConstantF( for (i = start; i < count + start; ++i) { if (!This->updateStateBlock->set.vertexShaderConstantsF[i]) { - constant_entry *ptr = HeapAlloc(GetProcessHeap(), 0, sizeof(constant_entry)); - ptr->idx = i; - list_add_head(&This->updateStateBlock->set_vconstantsF, &ptr->entry); + constants_entry *ptr = LIST_ENTRY(list_head(&This->updateStateBlock->set_vconstantsF), constants_entry, entry); + if (!ptr || ptr->count >= sizeof(ptr->idx) / sizeof(*ptr->idx)) { + ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(constants_entry)); + list_add_head(&This->updateStateBlock->set_vconstantsF, &ptr->entry); + } + ptr->idx[ptr->count++] = i; This->updateStateBlock->set.vertexShaderConstantsF[i] = TRUE; } This->updateStateBlock->changed.vertexShaderConstantsF[i] = TRUE; @@ -3238,9 +3241,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShaderConstantF( for (i = start; i < count + start; ++i) { if (!This->updateStateBlock->set.pixelShaderConstantsF[i]) { - constant_entry *ptr = HeapAlloc(GetProcessHeap(), 0, sizeof(constant_entry)); - ptr->idx = i; - list_add_head(&This->updateStateBlock->set_pconstantsF, &ptr->entry); + constants_entry *ptr = LIST_ENTRY(list_head(&This->updateStateBlock->set_pconstantsF), constants_entry, entry); + if (!ptr || ptr->count >= sizeof(ptr->idx) / sizeof(*ptr->idx)) { + ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(constants_entry)); + list_add_head(&This->updateStateBlock->set_pconstantsF, &ptr->entry); + } + ptr->idx[ptr->count++] = i; This->updateStateBlock->set.pixelShaderConstantsF[i] = TRUE; } This->updateStateBlock->changed.pixelShaderConstantsF[i] = TRUE; diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index ae2bf0852ab..64deb4de384 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -105,28 +105,37 @@ void shader_glsl_load_psamplers( static void shader_glsl_load_constantsF(IWineD3DBaseShaderImpl* This, WineD3D_GL_Info *gl_info, unsigned int max_constants, float* constants, GLhandleARB *constant_locations, struct list *constant_list) { - constant_entry *constant; + constants_entry *constant; local_constant* lconst; GLhandleARB tmp_loc; - int i; + DWORD i, j; + DWORD *idx; if (TRACE_ON(d3d_shader)) { - LIST_FOR_EACH_ENTRY(constant, constant_list, constant_entry, entry) { - i = constant->idx; - tmp_loc = constant_locations[i]; - if (tmp_loc != -1) { - TRACE_(d3d_constants)("Loading constants %i: %f, %f, %f, %f\n", i, - constants[i * 4 + 0], constants[i * 4 + 1], - constants[i * 4 + 2], constants[i * 4 + 3]); + LIST_FOR_EACH_ENTRY(constant, constant_list, constants_entry, entry) { + idx = constant->idx; + j = constant->count; + while (j--) { + i = *idx++; + tmp_loc = constant_locations[i]; + if (tmp_loc != -1) { + TRACE_(d3d_constants)("Loading constants %i: %f, %f, %f, %f\n", i, + constants[i * 4 + 0], constants[i * 4 + 1], + constants[i * 4 + 2], constants[i * 4 + 3]); + } } } } - LIST_FOR_EACH_ENTRY(constant, constant_list, constant_entry, entry) { - i = constant->idx; - tmp_loc = constant_locations[i]; - if (tmp_loc != -1) { - /* We found this uniform name in the program - go ahead and send the data */ - GL_EXTCALL(glUniform4fvARB(tmp_loc, 1, constants + (i * 4))); + LIST_FOR_EACH_ENTRY(constant, constant_list, constants_entry, entry) { + idx = constant->idx; + j = constant->count; + while (j--) { + i = *idx++; + tmp_loc = constant_locations[i]; + if (tmp_loc != -1) { + /* We found this uniform name in the program - go ahead and send the data */ + GL_EXTCALL(glUniform4fvARB(tmp_loc, 1, constants + (i * 4))); + } } } checkGLcall("glUniform4fvARB()"); diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 7622d8e7528..f9be5e96f96 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -249,7 +249,7 @@ static ULONG WINAPI IWineD3DStateBlockImpl_Release(IWineD3DStateBlock *iface) { TRACE("(%p) : Releasing from %d\n", This, refCount + 1); if (!refCount) { - constant_entry *constant, *constant2; + constants_entry *constant, *constant2; int counter; /* type 0 represents the primary stateblock, so free all the resources */ @@ -284,11 +284,11 @@ static ULONG WINAPI IWineD3DStateBlockImpl_Release(IWineD3DStateBlock *iface) { HeapFree(GetProcessHeap(), 0, This->set.pixelShaderConstantsF); HeapFree(GetProcessHeap(), 0, This->changed.pixelShaderConstantsF); - LIST_FOR_EACH_ENTRY_SAFE(constant, constant2, &This->set_vconstantsF, constant_entry, entry) { + LIST_FOR_EACH_ENTRY_SAFE(constant, constant2, &This->set_vconstantsF, constants_entry, entry) { HeapFree(GetProcessHeap(), 0, constant); } - LIST_FOR_EACH_ENTRY_SAFE(constant, constant2, &This->set_pconstantsF, constant_entry, entry) { + LIST_FOR_EACH_ENTRY_SAFE(constant, constant2, &This->set_pconstantsF, constants_entry, entry) { HeapFree(GetProcessHeap(), 0, constant); } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index add82a8af98..dbb83644aee 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1194,9 +1194,10 @@ typedef struct SAVEDSTATES { } SAVEDSTATES; typedef struct { - struct list entry; - int idx; -} constant_entry; + struct list entry; + DWORD count; + DWORD idx[13]; +} constants_entry; struct IWineD3DStateBlockImpl {