[PATCH 5/5] wined3d: Implement version checks for geometry shaders.
Henri Verbeet
hverbeet at codeweavers.com
Tue Sep 18 15:13:59 CDT 2012
---
dlls/wined3d/arb_program_shader.c | 32 +++++++++++++++++---------------
dlls/wined3d/device.c | 11 ++++++-----
dlls/wined3d/directx.c | 8 ++++----
dlls/wined3d/glsl_shader.c | 33 ++++++++++++++-------------------
dlls/wined3d/shader.c | 20 ++++++++++++--------
dlls/wined3d/wined3d_private.h | 18 ++++++++++--------
6 files changed, 63 insertions(+), 59 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 1195563..a54a37f 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -4978,28 +4978,30 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
if (gl_info->supported[NV_VERTEX_PROGRAM3])
{
- caps->VertexShaderVersion = 3;
+ caps->vs_version = 3;
TRACE("Hardware vertex shader version 3.0 enabled (NV_VERTEX_PROGRAM3)\n");
}
else if (vs_consts >= 256)
{
/* Shader Model 2.0 requires at least 256 vertex shader constants */
- caps->VertexShaderVersion = 2;
+ caps->vs_version = 2;
TRACE("Hardware vertex shader version 2.0 enabled (ARB_PROGRAM)\n");
}
else
{
- caps->VertexShaderVersion = 1;
+ caps->vs_version = 1;
TRACE("Hardware vertex shader version 1.1 enabled (ARB_PROGRAM)\n");
}
- caps->MaxVertexShaderConst = vs_consts;
+ caps->vs_uniform_count = vs_consts;
}
else
{
- caps->VertexShaderVersion = 0;
- caps->MaxVertexShaderConst = 0;
+ caps->vs_version = 0;
+ caps->vs_uniform_count = 0;
}
+ caps->gs_version = 0;
+
if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
{
DWORD ps_consts;
@@ -5013,31 +5015,31 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
if (gl_info->supported[NV_FRAGMENT_PROGRAM2])
{
- caps->PixelShaderVersion = 3;
+ caps->ps_version = 3;
TRACE("Hardware pixel shader version 3.0 enabled (NV_FRAGMENT_PROGRAM2)\n");
}
else if (ps_consts >= 32)
{
/* Shader Model 2.0 requires at least 32 pixel shader constants */
- caps->PixelShaderVersion = 2;
+ caps->ps_version = 2;
TRACE("Hardware pixel shader version 2.0 enabled (ARB_PROGRAM)\n");
}
else
{
- caps->PixelShaderVersion = 1;
+ caps->ps_version = 1;
TRACE("Hardware pixel shader version 1.4 enabled (ARB_PROGRAM)\n");
}
- caps->PixelShader1xMaxValue = 8.0f;
- caps->MaxPixelShaderConst = ps_consts;
+ caps->ps_uniform_count = ps_consts;
+ caps->ps_1x_max_value = 8.0f;
}
else
{
- caps->PixelShaderVersion = 0;
- caps->PixelShader1xMaxValue = 0.0f;
- caps->MaxPixelShaderConst = 0;
+ caps->ps_version = 0;
+ caps->ps_uniform_count = 0;
+ caps->ps_1x_max_value = 0.0f;
}
- caps->VSClipping = use_nv_clip(gl_info);
+ caps->vs_clipping = use_nv_clip(gl_info);
}
static BOOL shader_arb_color_fixup_supported(struct color_fixup_desc fixup)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 69518b4..8439c13 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5547,11 +5547,12 @@ HRESULT device_init(struct wined3d_device *device, struct wined3d *wined3d,
if (device->shader_backend)
{
device->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
- device->vshader_version = shader_caps.VertexShaderVersion;
- device->pshader_version = shader_caps.PixelShaderVersion;
- device->d3d_vshader_constantF = shader_caps.MaxVertexShaderConst;
- device->d3d_pshader_constantF = shader_caps.MaxPixelShaderConst;
- device->vs_clipping = shader_caps.VSClipping;
+ device->vs_version = shader_caps.vs_version;
+ device->gs_version = shader_caps.gs_version;
+ device->ps_version = shader_caps.ps_version;
+ device->d3d_vshader_constantF = shader_caps.vs_uniform_count;
+ device->d3d_pshader_constantF = shader_caps.ps_uniform_count;
+ device->vs_clipping = shader_caps.vs_clipping;
}
fragment_pipeline = adapter->fragment_pipe;
device->frag_pipe = fragment_pipeline;
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 36aafee..0354b0a 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -4962,8 +4962,8 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
}
else
{
- caps->VertexShaderVersion = shader_caps.VertexShaderVersion;
- caps->MaxVertexShaderConst = shader_caps.MaxVertexShaderConst;
+ caps->VertexShaderVersion = shader_caps.vs_version;
+ caps->MaxVertexShaderConst = shader_caps.vs_uniform_count;
}
if (ps_selected_mode == SHADER_NONE)
@@ -4972,8 +4972,8 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
caps->PixelShaderVersion = 0;
caps->PixelShader1xMaxValue = 0.0f;
} else {
- caps->PixelShaderVersion = shader_caps.PixelShaderVersion;
- caps->PixelShader1xMaxValue = shader_caps.PixelShader1xMaxValue;
+ caps->PixelShaderVersion = shader_caps.ps_version;
+ caps->PixelShader1xMaxValue = shader_caps.ps_1x_max_value;
}
caps->TextureOpCaps = fragment_caps.TextureOpCaps;
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index afbdb22..aece4d0 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -4964,27 +4964,25 @@ static void shader_glsl_context_destroyed(void *shader_priv, const struct wined3
static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *caps)
{
+ UINT shader_model;
+
if (gl_info->supported[EXT_GPU_SHADER4] && gl_info->supported[ARB_GEOMETRY_SHADER4]
&& gl_info->glsl_version >= MAKEDWORD_VERSION(1, 50))
- {
- caps->VertexShaderVersion = 4;
- caps->PixelShaderVersion = 4;
- }
+ shader_model = 4;
/* ARB_shader_texture_lod or EXT_gpu_shader4 is required for the SM3
* texldd and texldl instructions. */
else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD] || gl_info->supported[EXT_GPU_SHADER4])
- {
- caps->VertexShaderVersion = 3;
- caps->PixelShaderVersion = 3;
- }
+ shader_model = 3;
else
- {
- caps->VertexShaderVersion = 2;
- caps->PixelShaderVersion = 2;
- }
+ shader_model = 2;
+ TRACE("Shader model %u.\n", shader_model);
- caps->MaxVertexShaderConst = gl_info->limits.glsl_vs_float_constants;
- caps->MaxPixelShaderConst = gl_info->limits.glsl_ps_float_constants;
+ caps->vs_version = shader_model;
+ caps->gs_version = shader_model;
+ caps->ps_version = shader_model;
+
+ caps->vs_uniform_count = gl_info->limits.glsl_vs_float_constants;
+ caps->ps_uniform_count = gl_info->limits.glsl_ps_float_constants;
/* FIXME: The following line is card dependent. -8.0 to 8.0 is the
* Direct3D minimum requirement.
@@ -4998,12 +4996,9 @@ static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct s
* the shader will generate incorrect results too. Unfortunately, GL deliberately doesn't
* offer a way to query this.
*/
- caps->PixelShader1xMaxValue = 8.0;
-
- caps->VSClipping = TRUE;
+ caps->ps_1x_max_value = 8.0;
- TRACE("Hardware vertex shader version %u enabled (GLSL).\n", caps->VertexShaderVersion);
- TRACE("Hardware pixel shader version %u enabled (GLSL).\n", caps->PixelShaderVersion);
+ caps->vs_clipping = TRUE;
}
static BOOL shader_glsl_color_fixup_supported(struct color_fixup_desc fixup)
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index aaf3446..3e309a6 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -1482,12 +1482,13 @@ static void shader_none_context_destroyed(void *shader_priv, const struct wined3
static void shader_none_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *caps)
{
/* Set the shader caps to 0 for the none shader backend */
- caps->VertexShaderVersion = 0;
- caps->MaxVertexShaderConst = 0;
- caps->PixelShaderVersion = 0;
- caps->PixelShader1xMaxValue = 0.0f;
- caps->MaxPixelShaderConst = 0;
- caps->VSClipping = FALSE;
+ caps->vs_version = 0;
+ caps->gs_version = 0;
+ caps->ps_version = 0;
+ caps->vs_uniform_count = 0;
+ caps->ps_uniform_count = 0;
+ caps->ps_1x_max_value = 0.0f;
+ caps->vs_clipping = FALSE;
}
static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
@@ -1581,10 +1582,13 @@ static HRESULT shader_set_function(struct wined3d_shader *shader, const DWORD *b
switch (type)
{
case WINED3D_SHADER_TYPE_VERTEX:
- backend_version = shader->device->vshader_version;
+ backend_version = shader->device->vs_version;
+ break;
+ case WINED3D_SHADER_TYPE_GEOMETRY:
+ backend_version = shader->device->gs_version;
break;
case WINED3D_SHADER_TYPE_PIXEL:
- backend_version = shader->device->pshader_version;
+ backend_version = shader->device->ps_version;
break;
default:
FIXME("No backend version-checking for this shader type\n");
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 5ea23b4..258ac2d 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -702,15 +702,17 @@ extern const struct wined3d_shader_frontend sm4_shader_frontend DECLSPEC_HIDDEN;
typedef void (*SHADER_HANDLER)(const struct wined3d_shader_instruction *);
-struct shader_caps {
- DWORD VertexShaderVersion;
- DWORD MaxVertexShaderConst;
+struct shader_caps
+{
+ UINT vs_version;
+ UINT gs_version;
+ UINT ps_version;
- DWORD PixelShaderVersion;
- float PixelShader1xMaxValue;
- DWORD MaxPixelShaderConst;
+ DWORD vs_uniform_count;
+ DWORD ps_uniform_count;
+ float ps_1x_max_value;
- BOOL VSClipping;
+ BOOL vs_clipping;
};
enum tex_types
@@ -1696,7 +1698,7 @@ struct wined3d_device
const struct blit_shader *blitter;
unsigned int max_ffp_textures;
- DWORD vshader_version, pshader_version;
+ UINT vs_version, gs_version, ps_version;
DWORD d3d_vshader_constantF, d3d_pshader_constantF; /* Advertised d3d caps, not GL ones */
DWORD vs_clipping;
--
1.7.8.6
More information about the wine-patches
mailing list