[WINED3D 3/3] Replaced USING_GLSL define with a new
wined3d_settings option based on the registry
jave27 at gmail.com
jave27 at gmail.com
Mon May 22 18:26:27 CDT 2006
From: Jason Green <jave27 at gmail.com>
This is a multi-part message in MIME format.
--------------050802040500080604070107
Content-Type: text/plain; charset=UTF-8; format=fixed
Content-Transfer-Encoding: 8bit
- Phil Costin had a patch applied a while ago to check for the user to request GLSL, this patch makes it more useful.
- GLSL should be used right now if the registry option is set and also only if the hardware supports it. (Easier to test for developers)
- Change the d3d_caps function to honor this setting
- Change the baseshader to honor this setting
There will be many more of these to come. Everywhere that currently checks for GL_SUPPORT(ARB_VERTEX_PROGRAM) should use this instead
---
dlls/wined3d/baseshader.c | 7 ++++---
dlls/wined3d/directx.c | 26 ++++++++++++++++++++------
dlls/wined3d/wined3d_private.h | 15 ++++++++-------
3 files changed, 32 insertions(+), 16 deletions(-)
--------------050802040500080604070107
Content-Type: text/x-patch;
name="d5ffd3a1b7b115668c9f2e017f827b38c19646fd.diff"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline;
filename="d5ffd3a1b7b115668c9f2e017f827b38c19646fd.diff"
d5ffd3a1b7b115668c9f2e017f827b38c19646fd
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index a47bb5e..caa6105 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -584,7 +584,7 @@ void generate_base_shader(
*/
/* Pre-declare registers */
- if (USING_GLSL) {
+ if (wined3d_settings.shader_mode == SHADER_GLSL) {
generate_glsl_declarations(iface, ®_maps, buffer);
shader_addline(buffer, "void main() {\n");
} else {
@@ -613,7 +613,8 @@ void generate_base_shader(
/* Read opcode */
opcode_token = *pToken++;
curOpcode = shader_get_opcode(iface, opcode_token);
- hw_fct = USING_GLSL ? curOpcode->hw_glsl_fct : curOpcode->hw_fct;
+ hw_fct = (wined3d_settings.shader_mode ==
+ SHADER_GLSL ? curOpcode->hw_glsl_fct : curOpcode->hw_fct);
/* Unknown opcode and its parameters */
if (NULL == curOpcode) {
@@ -693,7 +694,7 @@ void print_glsl_info_log(
{
infoLog = (char *)HeapAlloc(GetProcessHeap(), 0, infologLength);
GL_EXTCALL(glGetInfoLogARB(obj, infologLength, NULL, infoLog));
- FIXME("Error received from GLSL shader #%i: %s", obj, debugstr_a(infoLog));
+ FIXME("Error received from GLSL shader #%u: %s", obj, debugstr_a(infoLog));
HeapFree(GetProcessHeap(), 0, infoLog);
}
}
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 60b9b28..3eefecd 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1694,11 +1694,13 @@ #endif
*pCaps->MaxStreams = MAX_STREAMS;
*pCaps->MaxStreamStride = 1024;
- if (wined3d_settings.vs_mode == VS_HW && GL_SUPPORT(ARB_SHADING_LANGUAGE_100) &&
- wined3d_settings.glslRequested && DeviceType != WINED3DDEVTYPE_REF) {
+ if (wined3d_settings.vs_mode == VS_HW && wined3d_settings.shader_mode == SHADER_GLSL
+ && DeviceType != WINED3DDEVTYPE_REF) {
*pCaps->VertexShaderVersion = D3DVS_VERSION(3,0);
TRACE_(d3d_caps)("Hardware vertex shader versions 2.0+ enabled\n");
- } else if (wined3d_settings.vs_mode == VS_HW && GL_SUPPORT(ARB_VERTEX_PROGRAM) && DeviceType != WINED3DDEVTYPE_REF) {
+ } else if (wined3d_settings.vs_mode == VS_HW
+ && wined3d_settings.shader_mode == SHADER_ARB
+ && DeviceType != WINED3DDEVTYPE_REF) {
*pCaps->VertexShaderVersion = D3DVS_VERSION(1,1);
TRACE_(d3d_caps)("Hardware vertex shader version 1.1 enabled\n");
} else if (wined3d_settings.vs_mode == VS_SW || DeviceType == WINED3DDEVTYPE_REF) {
@@ -1716,13 +1718,15 @@ #endif
*pCaps->MaxVertexShaderConst = WINED3D_VSHADER_MAX_CONSTANTS;
}
- if (wined3d_settings.ps_mode == PS_HW && GL_SUPPORT(ARB_SHADING_LANGUAGE_100) &&
- wined3d_settings.glslRequested && DeviceType != WINED3DDEVTYPE_REF) {
+ if (wined3d_settings.ps_mode == PS_HW && wined3d_settings.shader_mode == SHADER_GLSL
+ && DeviceType != WINED3DDEVTYPE_REF) {
*pCaps->PixelShaderVersion = D3DPS_VERSION(3,0);
/* FIXME: The following line is card dependant. -1.0 to 1.0 is a safe default clamp range for now */
*pCaps->PixelShader1xMaxValue = 1.0;
TRACE_(d3d_caps)("Hardware pixel shader versions 2.0+ enabled\n");
- } else if (wined3d_settings.ps_mode == PS_HW && GL_SUPPORT(ARB_FRAGMENT_PROGRAM) && DeviceType != WINED3DDEVTYPE_REF) {
+ } else if (wined3d_settings.ps_mode == PS_HW
+ && wined3d_settings.shader_mode == SHADER_ARB
+ && DeviceType != WINED3DDEVTYPE_REF) {
*pCaps->PixelShaderVersion = D3DPS_VERSION(1,4);
*pCaps->PixelShader1xMaxValue = 1.0;
TRACE_(d3d_caps)("Hardware pixel shader version 1.4 enabled\n");
@@ -1840,6 +1844,16 @@ HRESULT WINAPI IWineD3DImpl_CreateDevi
IWineD3DImpl_FillGLCaps(&This->gl_info, IWineD3DImpl_GetAdapterDisplay(iface, Adapter));
LEAVE_GL();
+ /* Determine shader mode to use based on GL caps */
+ if (GL_SUPPORT(ARB_SHADING_LANGUAGE_100) && wined3d_settings.glslRequested == TRUE
+ && (wined3d_settings.vs_mode == VS_HW || wined3d_settings.ps_mode == PS_HW))
+ wined3d_settings.shader_mode = SHADER_GLSL;
+ else if ((GL_SUPPORT(ARB_VERTEX_PROGRAM) && wined3d_settings.vs_mode == VS_HW) ||
+ (GL_SUPPORT(ARB_FRAGMENT_PROGRAM) && wined3d_settings.ps_mode == PS_HW))
+ wined3d_settings.shader_mode = SHADER_ARB;
+ else
+ wined3d_settings.shader_mode = SHADER_SW;
+
/* set the state of the device to valid */
object->state = WINED3D_OK;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8228a73..060ac92 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -132,12 +132,20 @@ #define VBO_HW 1
#define NP2_NONE 0
#define NP2_REPACK 1
+#define SHADER_SW 0
+#define SHADER_ARB 1
+#define SHADER_GLSL 2
+
typedef struct wined3d_settings_s {
/* vertex and pixel shader modes */
int vs_mode;
int ps_mode;
int vbo_mode;
+/* Ideally, we don't want the user to have to request GLSL. If the hardware supports GLSL,
+ we should use it. However, until it's fully implemented, we'll leave it as a registry
+ setting for developers. */
BOOL glslRequested;
+ int shader_mode;
/* nonpower 2 function */
int nonpower2_mode;
} wined3d_settings_t;
@@ -1271,13 +1279,6 @@ struct SHADER_OPCODE_ARG;
typedef void (*shader_fct_t)();
typedef void (*SHADER_HANDLER) (struct SHADER_OPCODE_ARG*);
-
-/* This must be 0 in the main branch until GLSL is at least mostly implemented.
- Also, think about making it a winecfg option to use GLSL (if the card supports it)
- or ARB_vertex_program. Ideally, we want to use GLSL if it's available, but until
- everything is implemented, we'll probably have better luck with the ARB generation */
-#define USING_GLSL 0
-
#define SHADER_PGMSIZE 65535
typedef struct SHADER_BUFFER {
char* buffer;
--------------050802040500080604070107--
More information about the wine-patches
mailing list