Module: wine Branch: master Commit: 40bc47901c9cdc9c17ddf3d24011232df41ee82f URL: http://source.winehq.org/git/wine.git/?a=commit;h=40bc47901c9cdc9c17ddf3d240...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed Jul 1 09:46:19 2009 +0200
wined3d: Use flags for driver quirks.
---
dlls/wined3d/arb_program_shader.c | 10 ++++++---- dlls/wined3d/directx.c | 6 +++--- dlls/wined3d/glsl_shader.c | 10 ++++++---- dlls/wined3d/vertexshader.c | 8 ++++---- dlls/wined3d/wined3d_gl.h | 5 ++--- dlls/wined3d/wined3d_private.h | 5 +++++ 6 files changed, 26 insertions(+), 18 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index e438366..28118c7 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -49,9 +49,10 @@ static BOOL need_mova_const(IWineD3DBaseShader *shader, const WineD3D_GL_Info *g }
static BOOL need_helper_const(const WineD3D_GL_Info *gl_info) { - if(!GL_SUPPORT(NV_VERTEX_PROGRAM) || /* Need to init colors */ - gl_info->arb_vs_offset_limit || /* Have to init texcoords */ - gl_info->set_texcoord_w) { /* Load the immval offset */ + if (!GL_SUPPORT(NV_VERTEX_PROGRAM) /* Need to init colors. */ + || gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT /* Load the immval offset. */ + || gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W) /* Have to init texcoords. */ + { return TRUE; } return FALSE; @@ -3751,7 +3752,8 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, if(!GL_SUPPORT(NV_VERTEX_PROGRAM)) { shader_addline(buffer, "MOV result.color.secondary, -helper_const.wwwy;\n");
- if((GLINFO_LOCATION).set_texcoord_w && !device->frag_pipe->ffp_proj_control) { + if ((GLINFO_LOCATION).quirks & WINED3D_QUIRK_SET_TEXCOORD_W && !device->frag_pipe->ffp_proj_control) + { int i; for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) { if(This->baseShader.reg_maps.texcoord_mask[i] != 0 && diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index eda6854..523528f 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -950,7 +950,7 @@ static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) { gl_info->vs_arb_max_instructions = gl_max; TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native instructions: %d\n", gl_info->vs_arb_max_instructions);
- gl_info->arb_vs_offset_limit = test_arb_vs_offset_limit(gl_info); + if (test_arb_vs_offset_limit(gl_info)) gl_info->quirks |= WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT; } if (gl_info->supported[ARB_VERTEX_SHADER]) { glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &gl_max); @@ -4196,11 +4196,11 @@ static void quirk_texcoord_w(WineD3D_GL_Info *gl_info) { * performance negatively. */ TRACE("Enabling vertex texture coord fixes in vertex shaders\n"); - gl_info->set_texcoord_w = TRUE; + gl_info->quirks |= WINED3D_QUIRK_SET_TEXCOORD_W; }
static void quirk_clip_varying(WineD3D_GL_Info *gl_info) { - gl_info->glsl_clip_varying = TRUE; + gl_info->quirks |= WINED3D_QUIRK_GLSL_CLIP_VARYING; }
struct driver_quirk diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 501023d..f7b193e 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -776,7 +776,7 @@ static int vec4_varyings(DWORD shader_major, const WineD3D_GL_Info *gl_info) if(shader_major > 3) return ret;
/* 3.0 shaders may need an extra varying for the clip coord on some cards(mostly dx10 ones) */ - if(gl_info->glsl_clip_varying) ret -= 1; + if (gl_info->quirks & WINED3D_QUIRK_GLSL_CLIP_VARYING) ret -= 1; return ret; }
@@ -3529,8 +3529,9 @@ static GLhandleARB generate_param_reorder_function(IWineD3DVertexShader *vertexs * Take care about the texcoord .w fixup though if we're using the fixed function fragment pipeline */ device = (IWineD3DDeviceImpl *) vs->baseShader.device; - if((GLINFO_LOCATION).set_texcoord_w && ps_major == 0 && vs_major > 0 && - !device->frag_pipe->ffp_proj_control) { + if (((GLINFO_LOCATION).quirks & WINED3D_QUIRK_SET_TEXCOORD_W) + && ps_major == 0 && vs_major > 0 && !device->frag_pipe->ffp_proj_control) + { shader_addline(&buffer, "void order_ps_input() {\n"); for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) { if(vs->baseShader.reg_maps.texcoord_mask[i] != 0 && @@ -3575,7 +3576,8 @@ static GLhandleARB generate_param_reorder_function(IWineD3DVertexShader *vertexs { if (semantic_idx < 8) { - if (!(GLINFO_LOCATION).set_texcoord_w || ps_major > 0) write_mask |= WINED3DSP_WRITEMASK_3; + if (!((GLINFO_LOCATION).quirks & WINED3D_QUIRK_SET_TEXCOORD_W) || ps_major > 0) + write_mask |= WINED3DSP_WRITEMASK_3;
shader_addline(&buffer, "gl_TexCoord[%u]%s = OUT[%u]%s;\n", semantic_idx, reg_mask, i, reg_mask); diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c index 6c1440d..6348e1c 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -280,10 +280,10 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader
vshader_set_limits(This);
- if(deviceImpl->vs_selected_mode == SHADER_ARB && - (GLINFO_LOCATION).arb_vs_offset_limit && - This->min_rel_offset <= This->max_rel_offset) { - + if (deviceImpl->vs_selected_mode == SHADER_ARB + && ((GLINFO_LOCATION).quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT) + && This->min_rel_offset <= This->max_rel_offset) + { if(This->max_rel_offset - This->min_rel_offset > 127) { FIXME("The difference between the minimum and maximum relative offset is > 127\n"); FIXME("Which this OpenGL implementation does not support. Try using GLSL\n"); diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h index 2d3cc3a..da35319 100644 --- a/dlls/wined3d/wined3d_gl.h +++ b/dlls/wined3d/wined3d_gl.h @@ -4000,10 +4000,9 @@ typedef struct _WineD3D_GL_Info { GL_VSVersion vs_nv_version; GL_VSVersion vs_ati_version;
- BOOL arb_vs_offset_limit; - BOOL set_texcoord_w; DWORD reserved_glsl_constants; - BOOL glsl_clip_varying; + + DWORD quirks;
BOOL supported[WINED3D_GL_EXT_COUNT];
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index ffee326..7af5719 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -43,6 +43,11 @@ #include "wine/list.h" #include "wine/rbtree.h"
+/* Driver quirks */ +#define WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT 0x00000001 +#define WINED3D_QUIRK_SET_TEXCOORD_W 0x00000002 +#define WINED3D_QUIRK_GLSL_CLIP_VARYING 0x00000004 + /* Texture format fixups */
enum fixup_channel_source