[WINED3D] Make the shader mode selections per device
Ivan Gyurdiev
ivg231 at gmail.com
Sat Oct 7 22:25:01 CDT 2006
...forgot to remove FIXMEs that were fixed.
-------------- next part --------------
---
dlls/wined3d/device.c | 8 ++++---
dlls/wined3d/directx.c | 45 +++++++++++++++++++++++-----------------
dlls/wined3d/drawprim.c | 25 +++++++++++-----------
dlls/wined3d/pixelshader.c | 5 +++-
dlls/wined3d/vertexshader.c | 2 +-
dlls/wined3d/wined3d_main.c | 2 --
dlls/wined3d/wined3d_private.h | 6 ++++-
7 files changed, 50 insertions(+), 43 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 13ea67a..d1ecc14 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -317,7 +317,7 @@ void set_glsl_shader_program(IWineD3DDev
This->stateBlock->glsl_program = newLink;
/* Attach GLSL vshader */
- if (NULL != vshader && wined3d_settings.vs_selected_mode == SHADER_GLSL) {
+ if (NULL != vshader && This->vs_selected_mode == SHADER_GLSL) {
int i;
int max_attribs = 16; /* TODO: Will this always be the case? It is at the moment... */
char tmp_name[10];
@@ -343,7 +343,7 @@ void set_glsl_shader_program(IWineD3DDev
}
/* Attach GLSL pshader */
- if (NULL != pshader && wined3d_settings.ps_selected_mode == SHADER_GLSL) {
+ if (NULL != pshader && This->ps_selected_mode == SHADER_GLSL) {
TRACE("Attaching pixel shader to GLSL program\n");
attach_glsl_shader(iface, (IWineD3DBaseShader*)pshader);
newLink->pixelShader = pshader;
@@ -574,8 +574,8 @@ static ULONG WINAPI IWineD3DDeviceImpl_R
** ***************************/
/* Delete any GLSL shader programs that may exist */
- if (wined3d_settings.vs_selected_mode == SHADER_GLSL ||
- wined3d_settings.ps_selected_mode == SHADER_GLSL)
+ if (This->vs_selected_mode == SHADER_GLSL ||
+ This->ps_selected_mode == SHADER_GLSL)
delete_glsl_shader_list(iface);
/* Release the update stateblock */
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index bf2f059..bbedfe3 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -238,9 +238,12 @@ static void select_shader_mode(
}
/** Select the number of report maximum shader constants based on the selected shader modes */
-void select_shader_max_constants(WineD3D_GL_Info *gl_info) {
+void select_shader_max_constants(
+ int ps_selected_mode,
+ int vs_selected_mode,
+ WineD3D_GL_Info *gl_info) {
- switch (wined3d_settings.vs_selected_mode) {
+ switch (vs_selected_mode) {
case SHADER_GLSL:
/* Subtract the other potential uniforms from the max available (bools, ints, and 1 row of projection matrix) */
gl_info->max_vshader_constantsF = gl_info->vs_glsl_constantsF - MAX_CONST_B - MAX_CONST_I - 1;
@@ -259,7 +262,7 @@ void select_shader_max_constants(WineD3D
break;
}
- switch (wined3d_settings.ps_selected_mode) {
+ switch (ps_selected_mode) {
case SHADER_GLSL:
/* Subtract the other potential uniforms from the max available (bools & ints) */
gl_info->max_pshader_constantsF = gl_info->ps_glsl_constantsF - MAX_CONST_B - MAX_CONST_I;
@@ -1808,6 +1811,8 @@ static HRESULT WINAPI IWineD3DImpl_Chec
static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DCAPS* pCaps) {
IWineD3DImpl *This = (IWineD3DImpl *)iface;
+ int vs_selected_mode;
+ int ps_selected_mode;
TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps);
@@ -1815,7 +1820,7 @@ static HRESULT WINAPI IWineD3DImpl_GetDe
return WINED3DERR_INVALIDCALL;
}
- /* FIXME: both the gl_info and the shader_mode should be made per adapter */
+ /* FIXME: GL info should be per adapter */
/* If we don't know the device settings, go query them now */
if (!This->isGLInfoValid) {
@@ -1825,9 +1830,11 @@ static HRESULT WINAPI IWineD3DImpl_GetDe
/* We are running off a real context, save the values */
if (rc) This->isGLInfoValid = TRUE;
}
- select_shader_mode(&This->gl_info, DeviceType,
- &wined3d_settings.ps_selected_mode, &wined3d_settings.vs_selected_mode);
- select_shader_max_constants(&This->gl_info);
+ select_shader_mode(&This->gl_info, DeviceType, &ps_selected_mode, &vs_selected_mode);
+
+ /* This function should *not* be modifying GL caps
+ * TODO: move the functionality where it belongs */
+ select_shader_max_constants(ps_selected_mode, vs_selected_mode, &This->gl_info);
/* ------------------------------------------------
The following fields apply to both d3d8 and d3d9
@@ -2192,8 +2199,7 @@ #endif
*pCaps->MaxStreams = MAX_STREAMS;
*pCaps->MaxStreamStride = 1024;
- /* FIXME: the shader mode should be per adapter */
- if (wined3d_settings.vs_selected_mode == SHADER_GLSL) {
+ if (vs_selected_mode == SHADER_GLSL) {
/* Nvidia Geforce6/7 or Ati R4xx/R5xx cards with GLSL support, support VS 3.0 but older Nvidia/Ati
models with GLSL support only support 2.0. In case of nvidia we can detect VS 2.0 support using
vs_nv_version which is based on NV_vertex_program. For Ati cards there's no easy way, so for
@@ -2203,10 +2209,10 @@ #endif
else
*pCaps->VertexShaderVersion = D3DVS_VERSION(3,0);
TRACE_(d3d_caps)("Hardware vertex shader version 3.0 enabled (GLSL)\n");
- } else if (wined3d_settings.vs_selected_mode == SHADER_ARB) {
+ } else if (vs_selected_mode == SHADER_ARB) {
*pCaps->VertexShaderVersion = D3DVS_VERSION(1,1);
TRACE_(d3d_caps)("Hardware vertex shader version 1.1 enabled (ARB_PROGRAM)\n");
- } else if (wined3d_settings.vs_selected_mode == SHADER_SW) {
+ } else if (vs_selected_mode == SHADER_SW) {
*pCaps->VertexShaderVersion = D3DVS_VERSION(3,0);
TRACE_(d3d_caps)("Software vertex shader version 3.0 enabled\n");
} else {
@@ -2216,8 +2222,7 @@ #endif
*pCaps->MaxVertexShaderConst = GL_LIMITS(vshader_constantsF);
- /* FIXME: the shader mode should be per adapter */
- if (wined3d_settings.ps_selected_mode == SHADER_GLSL) {
+ if (ps_selected_mode == SHADER_GLSL) {
/* See the comment about VS2.0/VS3.0 detection as we do the same here but then based on NV_fragment_program
in case of GeforceFX cards. */
if(This->gl_info.ps_nv_version == PS_VERSION_20)
@@ -2227,12 +2232,12 @@ #endif
/* FIXME: The following line is card dependent. -1.0 to 1.0 is a safe default clamp range for now */
*pCaps->PixelShader1xMaxValue = 1.0;
TRACE_(d3d_caps)("Hardware pixel shader version 3.0 enabled (GLSL)\n");
- } else if (wined3d_settings.ps_selected_mode == SHADER_ARB) {
+ } else if (ps_selected_mode == SHADER_ARB) {
*pCaps->PixelShaderVersion = D3DPS_VERSION(1,4);
*pCaps->PixelShader1xMaxValue = 1.0;
TRACE_(d3d_caps)("Hardware pixel shader version 1.4 enabled (ARB_PROGRAM)\n");
/* FIXME: Uncomment this when there is support for software Pixel Shader 3.0 and PS_SW is defined
- } else if (wined3d_settings.ps_selected_mode = SHADER_SW) {
+ } else if (ps_selected_mode = SHADER_SW) {
*pCaps->PixelShaderVersion = D3DPS_VERSION(3,0);
*pCaps->PixelShader1xMaxValue = 1.0;
TRACE_(d3d_caps)("Software pixel shader version 3.0 enabled\n"); */
@@ -2413,12 +2418,14 @@ static HRESULT WINAPI IWineD3DImpl_Crea
/* Setup some defaults for creating the implicit swapchain */
ENTER_GL();
- /* FIXME: both of those should be made per adapter */
+ /* FIXME: GL info should be per adapter */
IWineD3DImpl_FillGLCaps(iface, IWineD3DImpl_GetAdapterDisplay(iface, Adapter));
LEAVE_GL();
- select_shader_mode(&This->gl_info, DeviceType,
- &wined3d_settings.ps_selected_mode, &wined3d_settings.vs_selected_mode);
- select_shader_max_constants(&This->gl_info);
+ select_shader_mode(&This->gl_info, DeviceType, &object->ps_selected_mode, &object->vs_selected_mode);
+
+ /* This function should *not* be modifying GL caps
+ * TODO: move the functionality where it belongs */
+ select_shader_max_constants(object->ps_selected_mode, object->vs_selected_mode, &This->gl_info);
temp_result = allocate_shader_constants(object->updateStateBlock);
if (WINED3D_OK != temp_result)
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 95f7692..9511b8c 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -1797,15 +1797,14 @@ #undef BUFFER_OR_DATA
}
/* If GLSL is used for either pixel or vertex shaders, make a GLSL program
* Otherwise set NULL, to restore fixed function */
- if ((wined3d_settings.vs_selected_mode == SHADER_GLSL && useVertexShaderFunction) ||
- (wined3d_settings.ps_selected_mode == SHADER_GLSL && usePixelShaderFunction))
+ if ((This->vs_selected_mode == SHADER_GLSL && useVertexShaderFunction) ||
+ (This->ps_selected_mode == SHADER_GLSL && usePixelShaderFunction))
set_glsl_shader_program(iface);
else
This->stateBlock->glsl_program = NULL;
/* If GLSL is used now, or might have been used before, (re)set the program */
- if (wined3d_settings.vs_selected_mode == SHADER_GLSL ||
- wined3d_settings.ps_selected_mode == SHADER_GLSL) {
+ if (This->vs_selected_mode == SHADER_GLSL || This->ps_selected_mode == SHADER_GLSL) {
GLhandleARB progId = This->stateBlock->glsl_program ? This->stateBlock->glsl_program->programId : 0;
if (progId)
@@ -1818,7 +1817,7 @@ #undef BUFFER_OR_DATA
TRACE("Using vertex shader\n");
- if (wined3d_settings.vs_selected_mode == SHADER_ARB) {
+ if (This->vs_selected_mode == SHADER_ARB) {
/* Bind the vertex program */
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB,
((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->baseShader.prgId));
@@ -1836,7 +1835,7 @@ #undef BUFFER_OR_DATA
TRACE("Using pixel shader\n");
- if (wined3d_settings.ps_selected_mode == SHADER_ARB) {
+ if (This->ps_selected_mode == SHADER_ARB) {
/* Bind the fragment program */
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB,
((IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader)->baseShader.prgId));
@@ -1848,12 +1847,12 @@ #undef BUFFER_OR_DATA
TRACE_(d3d_shader)("(%p) : Bound fragment program %u and enabled GL_FRAGMENT_PROGRAM_ARB\n",
This, ((IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader)->baseShader.prgId);
}
- }
+ }
/* Load any global constants/uniforms that may have been set by the application */
- if (wined3d_settings.vs_selected_mode == SHADER_GLSL || wined3d_settings.ps_selected_mode == SHADER_GLSL)
+ if (This->vs_selected_mode == SHADER_GLSL || This->ps_selected_mode == SHADER_GLSL)
shader_glsl_load_constants(iface, usePixelShaderFunction, useVertexShaderFunction);
- else if (wined3d_settings.vs_selected_mode== SHADER_ARB || wined3d_settings.ps_selected_mode == SHADER_ARB)
+ else if (This->vs_selected_mode == SHADER_ARB || This->ps_selected_mode == SHADER_ARB)
shader_arb_load_constants(iface, usePixelShaderFunction, useVertexShaderFunction);
/* Draw vertex-by-vertex */
@@ -1866,14 +1865,14 @@ #undef BUFFER_OR_DATA
if (useVertexShaderFunction) {
unloadNumberedArrays(iface);
- if (wined3d_settings.vs_selected_mode == SHADER_ARB)
+ if (This->vs_selected_mode == SHADER_ARB)
glDisable(GL_VERTEX_PROGRAM_ARB);
} else {
unloadVertexData(iface);
}
/* Cleanup fragment program */
- if (usePixelShaderFunction && wined3d_settings.ps_selected_mode == SHADER_ARB)
+ if (usePixelShaderFunction && This->ps_selected_mode == SHADER_ARB)
glDisable(GL_FRAGMENT_PROGRAM_ARB);
}
@@ -2100,11 +2099,11 @@ void drawPrimitive(IWineD3DDevice *iface
/* Shaders can be implemented using ARB_PROGRAM, GLSL, or software -
* here simply check whether a shader was set, or the user disabled shaders */
- if (wined3d_settings.vs_selected_mode != SHADER_NONE && This->stateBlock->vertexShader &&
+ if (This->vs_selected_mode != SHADER_NONE && This->stateBlock->vertexShader &&
((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->baseShader.function != NULL)
useVertexShaderFunction = TRUE;
- if (wined3d_settings.ps_selected_mode != SHADER_NONE && This->stateBlock->pixelShader &&
+ if (This->ps_selected_mode != SHADER_NONE && This->stateBlock->pixelShader &&
((IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader)->baseShader.function)
usePixelShaderFunction = TRUE;
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c
index 9fc88cf..de4d983 100644
--- a/dlls/wined3d/pixelshader.c
+++ b/dlls/wined3d/pixelshader.c
@@ -870,7 +870,7 @@ #endif
/* Store the shader object */
This->baseShader.prgId = shader_obj;
- } else if (wined3d_settings.ps_selected_mode == SHADER_ARB) {
+ } else if (This->baseShader.shader_mode == SHADER_ARB) {
/* Create the hw ARB shader */
shader_addline(&buffer, "!!ARBfp1.0\n");
@@ -921,6 +921,7 @@ #endif
static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *iface, CONST DWORD *pFunction) {
IWineD3DPixelShaderImpl *This =(IWineD3DPixelShaderImpl *)iface;
+ IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *) This->baseShader.device;
TRACE("(%p) : pFunction %p\n", iface, pFunction);
@@ -933,7 +934,7 @@ static HRESULT WINAPI IWineD3DPixelShade
list_init(&This->baseShader.constantsB);
list_init(&This->baseShader.constantsI);
- This->baseShader.shader_mode = wined3d_settings.ps_selected_mode;
+ This->baseShader.shader_mode = deviceImpl->ps_selected_mode;
TRACE("(%p) : Copying the function\n", This);
if (NULL != pFunction) {
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index a229248..0ba8d47 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -1207,7 +1207,7 @@ static HRESULT WINAPI IWineD3DVertexShad
This->semantics_in, This->semantics_out, pFunction, deviceImpl->stateBlock);
if (hr != WINED3D_OK) return hr;
- This->baseShader.shader_mode = wined3d_settings.vs_selected_mode;
+ This->baseShader.shader_mode = deviceImpl->vs_selected_mode;
/* copy the function ... because it will certainly be released by application */
if (NULL != pFunction) {
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 872165a..8a7d631 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -40,8 +40,6 @@ wined3d_settings_t wined3d_settings =
PS_HW, /* Hardware by default */
VBO_HW, /* Hardware by default */
FALSE, /* Use of GLSL disabled by default */
- SHADER_ARB, /* Use ARB vertex programs, when available */
- SHADER_ARB, /* Use ARB fragment programs, when available */
NP2_NATIVE, /* Use native NPOT textures, when available */
RTL_AUTO, /* Automatically determine best locking method */
64*1024*1024 /* 64MB texture memory by default */
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 208ffa4..796c01c 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -157,8 +157,6 @@ typedef struct wined3d_settings_s {
we should use it. However, until it's fully implemented, we'll leave it as a registry
setting for developers. */
BOOL glslRequested;
- int vs_selected_mode;
- int ps_selected_mode;
/* nonpower 2 function */
int nonpower2_mode;
int rendertargetlock_mode;
@@ -499,6 +497,10 @@ typedef struct IWineD3DDeviceImpl
/* X and GL Information */
GLint maxConcurrentLights;
+ /* Selected capabilities */
+ int vs_selected_mode;
+ int ps_selected_mode;
+
/* Optimization */
BOOL modelview_valid;
BOOL proj_valid;
--
1.4.2.1
More information about the wine-patches
mailing list