diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 5fa9355..77dde7a 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -870,8 +870,25 @@ static BOOL match_broken_arb_fog(const struct wined3d_gl_info *gl_info, const ch
return data[0] != 0x00ff0000 || data[3] != 0x0000ff00;
}
+static void quirk_arb_constants(struct wined3d_gl_info *gl_info)
+{
+ /* MacOS always reports 4096 MAX_VERTEX_UNIFORM_COMPONENTS, which means
+ * 1024 VS_FLOAT_CONSTANTS. This is fine with nVidia, but the ATi drivers
+ * in OS X use some vertex shaders for internal calculations.
+ * This number is never subtracted from the available ones, and OS X always
+ * advertises 1024, so when an application tries to access these constants
+ * they have incorrect values. This hack lets the user report a fixed number
+ */
+ if (wined3d_settings.override_vertex_constants) {
+ FIXME("Using Constants Override\n");
+ gl_info->limits.glsl_vs_float_constants = wined3d_settings.vertex_constants_number;
+ FIXME("Constants Number is now set at %i\n", wined3d_settings.vertex_constants_number);
+ }
+}
+
static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info)
{
+ quirk_arb_constants(gl_info);
/* MacOS needs uniforms for relative addressing offsets. This can accumulate to quite a few uniforms.
* Beyond that the general uniform isn't optimal, so reserve a number of uniforms. 12 vec4's should
* allow 48 different offsets or other helper immediate values. */
@@ -3099,25 +3116,25 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_CLIP_PLANES, &gl_max);
gl_info->limits.clipplanes = min(WINED3DMAXUSERCLIPPLANES, gl_max);
- TRACE("Clip plane support - max planes %d.\n", gl_max);
+ FIXME("Clip plane support - max planes %d.\n", gl_max);
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_LIGHTS, &gl_max);
gl_info->limits.lights = gl_max;
- TRACE("Light support - max lights %d.\n", gl_max);
+ FIXME("Light support - max lights %d.\n", gl_max);
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_max);
gl_info->limits.texture_size = gl_max;
- TRACE("Maximum texture size support - max texture size %d.\n", gl_max);
+ FIXME("Maximum texture size support - max texture size %d.\n", gl_max);
gl_info->gl_ops.gl.p_glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, gl_floatv);
gl_info->limits.pointsize_min = gl_floatv[0];
gl_info->limits.pointsize_max = gl_floatv[1];
- TRACE("Maximum point size support - max point size %f.\n", gl_floatv[1]);
+ FIXME("Maximum point size support - max point size %f.\n", gl_floatv[1]);
if (gl_info->supported[ARB_MAP_BUFFER_ALIGNMENT])
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MIN_MAP_BUFFER_ALIGNMENT, &gl_max);
- TRACE("Minimum buffer map alignment: %d.\n", gl_max);
+ FIXME("Minimum buffer map alignment: %d.\n", gl_max);
}
else
{
@@ -3127,19 +3144,19 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &gl_max);
gl_info->limits.general_combiners = gl_max;
- TRACE("Max general combiners: %d.\n", gl_max);
+ FIXME("Max general combiners: %d.\n", gl_max);
}
if (gl_info->supported[ARB_DRAW_BUFFERS] && wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max);
gl_info->limits.buffers = gl_max;
- TRACE("Max draw buffers: %u.\n", gl_max);
+ FIXME("Max draw buffers: %u.\n", gl_max);
}
if (gl_info->supported[ARB_MULTITEXTURE])
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max);
gl_info->limits.textures = min(MAX_TEXTURES, gl_max);
- TRACE("Max textures: %d.\n", gl_info->limits.textures);
+ FIXME("Max textures: %d.\n", gl_info->limits.textures);
if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
{
@@ -3154,8 +3171,8 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
gl_info->limits.texture_coords = max(gl_info->limits.texture_coords, gl_max);
gl_info->limits.fragment_samplers = max(gl_info->limits.fragment_samplers, gl_max);
}
- TRACE("Max texture coords: %d.\n", gl_info->limits.texture_coords);
- TRACE("Max fragment samplers: %d.\n", gl_info->limits.fragment_samplers);
+ FIXME("Max texture coords: %d.\n", gl_info->limits.texture_coords);
+ FIXME("Max fragment samplers: %d.\n", gl_info->limits.fragment_samplers);
if (gl_info->supported[ARB_VERTEX_SHADER])
{
@@ -3197,103 +3214,103 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
{
gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers;
}
- TRACE("Max vertex samplers: %u.\n", gl_info->limits.vertex_samplers);
- TRACE("Max combined samplers: %u.\n", gl_info->limits.combined_samplers);
+ FIXME("Max vertex samplers: %u.\n", gl_info->limits.vertex_samplers);
+ FIXME("Max combined samplers: %u.\n", gl_info->limits.combined_samplers);
}
if (gl_info->supported[ARB_VERTEX_BLEND])
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_UNITS_ARB, &gl_max);
gl_info->limits.blends = gl_max;
- TRACE("Max blends: %u.\n", gl_info->limits.blends);
+ FIXME("Max blends: %u.\n", gl_info->limits.blends);
}
if (gl_info->supported[EXT_TEXTURE3D])
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE_EXT, &gl_max);
gl_info->limits.texture3d_size = gl_max;
- TRACE("Max texture3D size: %d.\n", gl_info->limits.texture3d_size);
+ FIXME("Max texture3D size: %d.\n", gl_info->limits.texture3d_size);
}
if (gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC])
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_max);
gl_info->limits.anisotropy = gl_max;
- TRACE("Max anisotropy: %d.\n", gl_info->limits.anisotropy);
+ FIXME("Max anisotropy: %d.\n", gl_info->limits.anisotropy);
}
if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
{
GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max));
gl_info->limits.arb_ps_float_constants = gl_max;
- TRACE("Max ARB_FRAGMENT_PROGRAM float constants: %d.\n", gl_info->limits.arb_ps_float_constants);
+ FIXME("Max ARB_FRAGMENT_PROGRAM float constants: %d.\n", gl_info->limits.arb_ps_float_constants);
GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB, &gl_max));
gl_info->limits.arb_ps_native_constants = gl_max;
- TRACE("Max ARB_FRAGMENT_PROGRAM native float constants: %d.\n",
+ FIXME("Max ARB_FRAGMENT_PROGRAM native float constants: %d.\n",
gl_info->limits.arb_ps_native_constants);
GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &gl_max));
gl_info->limits.arb_ps_temps = gl_max;
- TRACE("Max ARB_FRAGMENT_PROGRAM native temporaries: %d.\n", gl_info->limits.arb_ps_temps);
+ FIXME("Max ARB_FRAGMENT_PROGRAM native temporaries: %d.\n", gl_info->limits.arb_ps_temps);
GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &gl_max));
gl_info->limits.arb_ps_instructions = gl_max;
- TRACE("Max ARB_FRAGMENT_PROGRAM native instructions: %d.\n", gl_info->limits.arb_ps_instructions);
+ FIXME("Max ARB_FRAGMENT_PROGRAM native instructions: %d.\n", gl_info->limits.arb_ps_instructions);
GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &gl_max));
gl_info->limits.arb_ps_local_constants = gl_max;
- TRACE("Max ARB_FRAGMENT_PROGRAM local parameters: %d.\n", gl_info->limits.arb_ps_instructions);
+ FIXME("Max ARB_FRAGMENT_PROGRAM local parameters: %d.\n", gl_info->limits.arb_ps_instructions);
}
if (gl_info->supported[ARB_VERTEX_PROGRAM])
{
GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max));
gl_info->limits.arb_vs_float_constants = gl_max;
- TRACE("Max ARB_VERTEX_PROGRAM float constants: %d.\n", gl_info->limits.arb_vs_float_constants);
+ FIXME("Max ARB_VERTEX_PROGRAM float constants: %d.\n", gl_info->limits.arb_vs_float_constants);
GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB, &gl_max));
gl_info->limits.arb_vs_native_constants = gl_max;
- TRACE("Max ARB_VERTEX_PROGRAM native float constants: %d.\n",
+ FIXME("Max ARB_VERTEX_PROGRAM native float constants: %d.\n",
gl_info->limits.arb_vs_native_constants);
GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &gl_max));
gl_info->limits.arb_vs_temps = gl_max;
- TRACE("Max ARB_VERTEX_PROGRAM native temporaries: %d.\n", gl_info->limits.arb_vs_temps);
+ FIXME("Max ARB_VERTEX_PROGRAM native temporaries: %d.\n", gl_info->limits.arb_vs_temps);
GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &gl_max));
gl_info->limits.arb_vs_instructions = gl_max;
- TRACE("Max ARB_VERTEX_PROGRAM native instructions: %d.\n", gl_info->limits.arb_vs_instructions);
+ FIXME("Max ARB_VERTEX_PROGRAM native instructions: %d.\n", gl_info->limits.arb_vs_instructions);
}
if (gl_info->supported[ARB_VERTEX_SHADER])
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &gl_max);
gl_info->limits.glsl_vs_float_constants = gl_max / 4;
- TRACE("Max ARB_VERTEX_SHADER float constants: %u.\n", gl_info->limits.glsl_vs_float_constants);
+ FIXME("Max ARB_VERTEX_SHADER float constants: %u.\n", gl_info->limits.glsl_vs_float_constants);
if (gl_info->supported[ARB_UNIFORM_BUFFER_OBJECT])
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_UNIFORM_BLOCKS, &gl_max);
gl_info->limits.vertex_uniform_blocks = min(gl_max, WINED3D_MAX_CBS);
- TRACE("Max vertex uniform blocks: %u (%d).\n", gl_info->limits.vertex_uniform_blocks, gl_max);
+ FIXME("Max vertex uniform blocks: %u (%d).\n", gl_info->limits.vertex_uniform_blocks, gl_max);
}
}
if (gl_info->supported[ARB_GEOMETRY_SHADER4] && gl_info->supported[ARB_UNIFORM_BUFFER_OBJECT])
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_GEOMETRY_UNIFORM_BLOCKS, &gl_max);
gl_info->limits.geometry_uniform_blocks = min(gl_max, WINED3D_MAX_CBS);
- TRACE("Max geometry uniform blocks: %u (%d).\n", gl_info->limits.geometry_uniform_blocks, gl_max);
+ FIXME("Max geometry uniform blocks: %u (%d).\n", gl_info->limits.geometry_uniform_blocks, gl_max);
}
if (gl_info->supported[ARB_FRAGMENT_SHADER])
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, &gl_max);
gl_info->limits.glsl_ps_float_constants = gl_max / 4;
- TRACE("Max ARB_FRAGMENT_SHADER float constants: %u.\n", gl_info->limits.glsl_ps_float_constants);
+ FIXME("Max ARB_FRAGMENT_SHADER float constants: %u.\n", gl_info->limits.glsl_ps_float_constants);
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &gl_max);
gl_info->limits.glsl_varyings = gl_max;
- TRACE("Max GLSL varyings: %u (%u 4 component varyings).\n", gl_max, gl_max / 4);
+ FIXME("Max GLSL varyings: %u (%u 4 component varyings).\n", gl_max, gl_max / 4);
if (gl_info->supported[ARB_UNIFORM_BUFFER_OBJECT])
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_BLOCKS, &gl_max);
gl_info->limits.fragment_uniform_blocks = min(gl_max, WINED3D_MAX_CBS);
- TRACE("Max fragment uniform blocks: %u (%d).\n", gl_info->limits.fragment_uniform_blocks, gl_max);
+ FIXME("Max fragment uniform blocks: %u (%d).\n", gl_info->limits.fragment_uniform_blocks, gl_max);
}
}
if (gl_info->supported[ARB_UNIFORM_BUFFER_OBJECT])
{
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &gl_max);
- TRACE("Max combined uniform blocks: %d.\n", gl_max);
+ FIXME("Max combined uniform blocks: %d.\n", gl_max);
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &gl_max);
- TRACE("Max uniform buffer bindings: %d.\n", gl_max);
+ FIXME("Max uniform buffer bindings: %d.\n", gl_max);
}
if (gl_info->supported[NV_LIGHT_MAX_EXPONENT])
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 758ba43..ae1a038 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -85,6 +85,8 @@ struct wined3d_settings wined3d_settings =
~0U, /* No GS shader model limit by default. */
~0U, /* No PS shader model limit by default. */
FALSE, /* 3D support enabled by default. */
TRUE, /* No multithreaded CS by default. */
+ FALSE, /* Override vertex constants? */
+ 1024, /* Number of vertex shaders to use. */
};
struct wined3d * CDECL wined3d_create(DWORD flags)
@@ -292,6 +294,21 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
TRACE("Not always rendering backbuffers offscreen.\n");
wined3d_settings.always_offscreen = FALSE;
}
+ if (!get_config_key(hkey, appkey, "OverrideVertexShaders", buffer, size)
+ && !strcmp(buffer,"enabled"))
+ {
+ TRACE("Override Vertex Shader Constants.\n");
+ wined3d_settings.override_vertex_constants = TRUE;
+ }
+ if (!get_config_key(hkey, appkey, "VertexShaderConstants", buffer, size))
+ {
+ int TmpVertexShaderConstants = atoi(buffer);
+ if (TmpVertexShaderConstants > 0)
+ {
+ wined3d_settings.vertex_constants_number = TmpVertexShaderConstants;
+ TRACE("Use %i Vertex Shader Constants.\n", TmpVertexShaderConstants);
+ }
+ }
if (!get_config_key_dword(hkey, appkey, "MaxShaderModelVS", &wined3d_settings.max_sm_vs))
TRACE("Limiting VS shader model to %u.\n", wined3d_settings.max_sm_vs);
if (!get_config_key_dword(hkey, appkey, "MaxShaderModelGS", &wined3d_settings.max_sm_gs))
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b0c7a53..1089156 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -278,6 +278,8 @@ struct wined3d_settings
unsigned int max_sm_gs;
unsigned int max_sm_ps;
BOOL no_3d;
BOOL cs_multithreaded;
+ BOOL override_vertex_constants;
+ int vertex_constants_number;
};
extern struct wined3d_settings wined3d_settings DECLSPEC_HIDDEN;