From 2fa3b4a87dcb63a83a4f087fc00d37cd3051ef28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Sat, 24 Oct 2009 16:23:34 -0700 Subject: [PATCH 01/16] WineD3D: Use the shader backend reported constant limit outside the shader backend --- dlls/wined3d/context.c | 16 ++++++++-------- dlls/wined3d/pixelshader.c | 2 +- dlls/wined3d/stateblock.c | 42 +++++++++++++++++++++--------------------- dlls/wined3d/vertexshader.c | 22 +++++++++++----------- 4 files changed, 41 insertions(+), 41 deletions(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 66ba358..69cd978 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -1280,13 +1280,13 @@ struct wined3d_context *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceI if(This->shader_backend->shader_dirtifyable_constants((IWineD3DDevice *) This)) { /* Create the dirty constants array and initialize them to dirty */ ret->vshader_const_dirty = HeapAlloc(GetProcessHeap(), 0, - sizeof(*ret->vshader_const_dirty) * gl_info->max_vshader_constantsF); + sizeof(*ret->vshader_const_dirty) * This->d3d_vshader_constantF); ret->pshader_const_dirty = HeapAlloc(GetProcessHeap(), 0, - sizeof(*ret->pshader_const_dirty) * gl_info->max_pshader_constantsF); + sizeof(*ret->pshader_const_dirty) * This->d3d_pshader_constantF); memset(ret->vshader_const_dirty, 1, - sizeof(*ret->vshader_const_dirty) * gl_info->max_vshader_constantsF); + sizeof(*ret->vshader_const_dirty) * This->d3d_vshader_constantF); memset(ret->pshader_const_dirty, 1, - sizeof(*ret->pshader_const_dirty) * gl_info->max_pshader_constantsF); + sizeof(*ret->pshader_const_dirty) * This->d3d_pshader_constantF); } ret->free_occlusion_query_size = 4; @@ -2053,14 +2053,14 @@ struct wined3d_context *ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurfac if (context->vshader_const_dirty) { memset(context->vshader_const_dirty, 1, - sizeof(*context->vshader_const_dirty) * gl_info->max_vshader_constantsF); - This->highest_dirty_vs_const = gl_info->max_vshader_constantsF; + sizeof(*context->vshader_const_dirty) * This->d3d_vshader_constantF); + This->highest_dirty_vs_const = This->d3d_vshader_constantF; } if (context->pshader_const_dirty) { memset(context->pshader_const_dirty, 1, - sizeof(*context->pshader_const_dirty) * gl_info->max_pshader_constantsF); - This->highest_dirty_ps_const = gl_info->max_pshader_constantsF; + sizeof(*context->pshader_const_dirty) * This->d3d_pshader_constantF); + This->highest_dirty_ps_const = This->d3d_pshader_constantF; } } diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index 00f04e9..c82faa5 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -247,7 +247,7 @@ static HRESULT pixelshader_set_function(IWineD3DPixelShaderImpl *shader, /* Second pass: figure out which registers are used, what the semantics are, etc.. */ hr = shader_get_registers_used((IWineD3DBaseShader *)shader, fe, reg_maps, NULL, shader->input_signature, NULL, - byte_code, gl_info->max_pshader_constantsF); + byte_code, device->d3d_pshader_constantF); if (FAILED(hr)) return hr; pshader_set_limits(shader); diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index da1df21..892ac89 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(IWineD3DStateBlockImpl *object) { - const struct wined3d_gl_info *gl_info = &object->wineD3DDevice->adapter->gl_info; + IWineD3DDeviceImpl *device = object->wineD3DDevice; /* Allocate space for floating point constants */ object->pixelShaderConstantF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(float) * gl_info->max_pshader_constantsF * 4); + sizeof(float) * device->d3d_pshader_constantF * 4); if (!object->pixelShaderConstantF) goto fail; object->changed.pixelShaderConstantsF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(BOOL) * gl_info->max_pshader_constantsF); + sizeof(BOOL) * device->d3d_pshader_constantF); if (!object->changed.pixelShaderConstantsF) goto fail; object->vertexShaderConstantF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(float) * gl_info->max_vshader_constantsF * 4); + sizeof(float) * device->d3d_vshader_constantF * 4); if (!object->vertexShaderConstantF) goto fail; object->changed.vertexShaderConstantsF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(BOOL) * gl_info->max_vshader_constantsF); + sizeof(BOOL) * device->d3d_vshader_constantF); if (!object->changed.vertexShaderConstantsF) goto fail; object->contained_vs_consts_f = HeapAlloc(GetProcessHeap(), 0, - sizeof(DWORD) * gl_info->max_vshader_constantsF); + sizeof(DWORD) * device->d3d_vshader_constantF); if (!object->contained_vs_consts_f) goto fail; object->contained_ps_consts_f = HeapAlloc(GetProcessHeap(), 0, - sizeof(DWORD) * gl_info->max_pshader_constantsF); + sizeof(DWORD) * device->d3d_pshader_constantF); if (!object->contained_ps_consts_f) goto fail; return WINED3D_OK; @@ -242,7 +242,7 @@ static inline void stateblock_set_bits(DWORD *map, UINT map_size) } /* Set all members of a stateblock savedstate to the given value */ -static void stateblock_savedstates_set_all(SAVEDSTATES *states, const struct wined3d_gl_info *gl_info) +static void stateblock_savedstates_set_all(SAVEDSTATES *states, DWORD vs_consts, DWORD ps_consts) { unsigned int i; @@ -271,11 +271,11 @@ static void stateblock_savedstates_set_all(SAVEDSTATES *states, const struct win states->vertexShaderConstantsI = 0xffff; /* Dynamically sized arrays */ - memset(states->pixelShaderConstantsF, TRUE, sizeof(BOOL) * gl_info->max_pshader_constantsF); - memset(states->vertexShaderConstantsF, TRUE, sizeof(BOOL) * gl_info->max_vshader_constantsF); + memset(states->pixelShaderConstantsF, TRUE, sizeof(BOOL) * ps_consts); + memset(states->vertexShaderConstantsF, TRUE, sizeof(BOOL) * vs_consts); } -static void stateblock_savedstates_set_pixel(SAVEDSTATES *states, const struct wined3d_gl_info *gl_info) +static void stateblock_savedstates_set_pixel(SAVEDSTATES *states, const DWORD num_constants) { DWORD texture_mask = 0; WORD sampler_mask = 0; @@ -298,10 +298,10 @@ static void stateblock_savedstates_set_pixel(SAVEDSTATES *states, const struct w states->pixelShaderConstantsB = 0xffff; states->pixelShaderConstantsI = 0xffff; - memset(states->pixelShaderConstantsF, TRUE, sizeof(BOOL) * gl_info->max_pshader_constantsF); + memset(states->pixelShaderConstantsF, TRUE, sizeof(BOOL) * num_constants); } -static void stateblock_savedstates_set_vertex(SAVEDSTATES *states, const struct wined3d_gl_info *gl_info) +static void stateblock_savedstates_set_vertex(SAVEDSTATES *states, const DWORD num_constants) { DWORD texture_mask = 0; WORD sampler_mask = 0; @@ -325,12 +325,12 @@ static void stateblock_savedstates_set_vertex(SAVEDSTATES *states, const struct states->vertexShaderConstantsB = 0xffff; states->vertexShaderConstantsI = 0xffff; - memset(states->vertexShaderConstantsF, TRUE, sizeof(BOOL) * gl_info->max_vshader_constantsF); + memset(states->vertexShaderConstantsF, TRUE, sizeof(BOOL) * num_constants); } void stateblock_init_contained_states(IWineD3DStateBlockImpl *stateblock) { - const struct wined3d_gl_info *gl_info = &stateblock->wineD3DDevice->adapter->gl_info; + IWineD3DDeviceImpl *device = stateblock->wineD3DDevice; unsigned int i, j; for (i = 0; i <= WINEHIGHEST_RENDER_STATE >> 5; ++i) @@ -357,7 +357,7 @@ void stateblock_init_contained_states(IWineD3DStateBlockImpl *stateblock) } } - for (i = 0; i < gl_info->max_vshader_constantsF; ++i) + for (i = 0; i < device->d3d_vshader_constantF; ++i) { if (stateblock->changed.vertexShaderConstantsF[i]) { @@ -384,7 +384,7 @@ void stateblock_init_contained_states(IWineD3DStateBlockImpl *stateblock) } } - for (i = 0; i < gl_info->max_pshader_constantsF; ++i) + for (i = 0; i < device->d3d_pshader_constantF; ++i) { if (stateblock->changed.pixelShaderConstantsF[i]) { @@ -1339,7 +1339,6 @@ static const IWineD3DStateBlockVtbl IWineD3DStateBlock_Vtbl = HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock, IWineD3DDeviceImpl *device, WINED3DSTATEBLOCKTYPE type, IUnknown *parent) { - const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; unsigned int i; HRESULT hr; @@ -1368,16 +1367,17 @@ HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock, IWineD3DDeviceImpl * { case WINED3DSBT_ALL: stateblock_init_lights(stateblock, device->stateBlock->lightMap); - stateblock_savedstates_set_all(&stateblock->changed, gl_info); + stateblock_savedstates_set_all(&stateblock->changed, device->d3d_vshader_constantF, + device->d3d_pshader_constantF); break; case WINED3DSBT_PIXELSTATE: - stateblock_savedstates_set_pixel(&stateblock->changed, gl_info); + stateblock_savedstates_set_pixel(&stateblock->changed, device->d3d_pshader_constantF); break; case WINED3DSBT_VERTEXSTATE: stateblock_init_lights(stateblock, device->stateBlock->lightMap); - stateblock_savedstates_set_vertex(&stateblock->changed, gl_info); + stateblock_savedstates_set_vertex(&stateblock->changed, device->d3d_vshader_constantF); break; default: diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c index 2a11dae..3712bee 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -37,9 +37,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); static void vshader_set_limits(IWineD3DVertexShaderImpl *This) { - const struct wined3d_gl_info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info; DWORD shader_version = WINED3D_SHADER_VERSION(This->baseShader.reg_maps.shader_version.major, This->baseShader.reg_maps.shader_version.minor); + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device; This->baseShader.limits.texcoord = 0; This->baseShader.limits.attributes = 16; @@ -58,7 +58,7 @@ static void vshader_set_limits(IWineD3DVertexShaderImpl *This) This->baseShader.limits.label = 0; /* TODO: vs_1_1 has a minimum of 96 constants. What happens if a vs_1_1 shader is used * on a vs_3_0 capable card that has 256 constants? */ - This->baseShader.limits.constant_float = min(256, gl_info->max_vshader_constantsF); + This->baseShader.limits.constant_float = min(256, device->d3d_vshader_constantF); break; case WINED3D_SHADER_VERSION(2,0): @@ -70,7 +70,7 @@ static void vshader_set_limits(IWineD3DVertexShaderImpl *This) This->baseShader.limits.packed_output = 0; This->baseShader.limits.sampler = 0; This->baseShader.limits.label = 16; - This->baseShader.limits.constant_float = min(256, gl_info->max_vshader_constantsF); + This->baseShader.limits.constant_float = min(256, device->d3d_vshader_constantF); break; case WINED3D_SHADER_VERSION(4,0): @@ -89,7 +89,7 @@ static void vshader_set_limits(IWineD3DVertexShaderImpl *This) * of supporting much more(GL drivers advertise 1024). d3d9.dll and d3d8.dll clamp the * wined3d-advertised maximum. Clamp the constant limit for <= 3.0 shaders to 256.s * use constant buffers */ - This->baseShader.limits.constant_float = min(256, gl_info->max_vshader_constantsF); + This->baseShader.limits.constant_float = min(256, device->d3d_vshader_constantF); break; default: @@ -100,7 +100,7 @@ static void vshader_set_limits(IWineD3DVertexShaderImpl *This) This->baseShader.limits.packed_output = 0; This->baseShader.limits.sampler = 0; This->baseShader.limits.label = 16; - This->baseShader.limits.constant_float = min(256, gl_info->max_vshader_constantsF); + This->baseShader.limits.constant_float = min(256, device->d3d_vshader_constantF); FIXME("Unrecognized vertex shader version %u.%u\n", This->baseShader.reg_maps.shader_version.major, This->baseShader.reg_maps.shader_version.minor); @@ -260,11 +260,11 @@ static HRESULT vertexshader_set_function(IWineD3DVertexShaderImpl *shader, list_init(&shader->baseShader.constantsI); /* Second pass: figure out registers used, semantics, etc.. */ - shader->min_rel_offset = gl_info->max_vshader_constantsF; + shader->min_rel_offset = device->d3d_vshader_constantF; shader->max_rel_offset = 0; hr = shader_get_registers_used((IWineD3DBaseShader *)shader, fe, reg_maps, shader->attributes, NULL, shader->output_signature, - byte_code, gl_info->max_vshader_constantsF); + byte_code, device->d3d_vshader_constantF); if (hr != WINED3D_OK) return hr; if (output_signature) @@ -317,16 +317,16 @@ static HRESULT vertexshader_set_function(IWineD3DVertexShaderImpl *shader, static HRESULT WINAPI IWIneD3DVertexShaderImpl_SetLocalConstantsF(IWineD3DVertexShader *iface, UINT start_idx, const float *src_data, UINT count) { IWineD3DVertexShaderImpl *This =(IWineD3DVertexShaderImpl *)iface; - const struct wined3d_gl_info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info; + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device; UINT i, end_idx; TRACE("(%p) : start_idx %u, src_data %p, count %u\n", This, start_idx, src_data, count); end_idx = start_idx + count; - if (end_idx > gl_info->max_vshader_constantsF) + if (end_idx > device->d3d_vshader_constantF) { - WARN("end_idx %u > float constants limit %u\n", end_idx, gl_info->max_vshader_constantsF); - end_idx = gl_info->max_vshader_constantsF; + WARN("end_idx %u > float constants limit %u\n", end_idx, device->d3d_vshader_constantF); + end_idx = device->d3d_vshader_constantF; } for (i = start_idx; i < end_idx; ++i) { -- 1.6.4.4