Matteo Bruni : wined3d: Only install emulation wrappers when required.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jul 28 13:30:07 CDT 2015
Module: wine
Branch: master
Commit: f2989a25221ba47621e31c44496a3890799c9ac8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f2989a25221ba47621e31c44496a3890799c9ac8
Author: Matteo Bruni <mbruni at codeweavers.com>
Date: Mon Jul 27 14:29:57 2015 +0200
wined3d: Only install emulation wrappers when required.
---
dlls/wined3d/arb_program_shader.c | 6 ++++++
dlls/wined3d/ati_fragment_shader.c | 6 ++++++
dlls/wined3d/directx.c | 10 +++++++---
dlls/wined3d/glsl_shader.c | 16 ++++++++++++++++
dlls/wined3d/nvidia_texture_shader.c | 7 +++++++
dlls/wined3d/state.c | 24 ++++++++++++++++++++++++
dlls/wined3d/wined3d_private.h | 5 +++++
7 files changed, 71 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 0bd7c22..73b2218 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -5871,6 +5871,11 @@ static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragmen
caps->MaxSimultaneousTextures = min(gl_info->limits.fragment_samplers, 8);
}
+static DWORD arbfp_get_emul_mask(const struct wined3d_gl_info *gl_info)
+{
+ return GL_EXT_EMUL_ARB_MULTITEXTURE | GL_EXT_EMUL_EXT_FOG_COORD;
+}
+
static void state_texfactor_arbfp(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id)
{
@@ -6871,6 +6876,7 @@ static void arbfp_free_context_data(struct wined3d_context *context)
const struct fragment_pipeline arbfp_fragment_pipeline = {
arbfp_enable,
arbfp_get_caps,
+ arbfp_get_emul_mask,
arbfp_alloc,
arbfp_free,
arbfp_alloc_context_data,
diff --git a/dlls/wined3d/ati_fragment_shader.c b/dlls/wined3d/ati_fragment_shader.c
index b41f5d9..6558f27 100644
--- a/dlls/wined3d/ati_fragment_shader.c
+++ b/dlls/wined3d/ati_fragment_shader.c
@@ -1310,6 +1310,11 @@ static void atifs_get_caps(const struct wined3d_gl_info *gl_info, struct fragmen
caps->MaxSimultaneousTextures = 6;
}
+static DWORD atifs_get_emul_mask(const struct wined3d_gl_info *gl_info)
+{
+ return GL_EXT_EMUL_ARB_MULTITEXTURE | GL_EXT_EMUL_EXT_FOG_COORD;
+}
+
static void *atifs_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
{
struct atifs_private_data *priv;
@@ -1386,6 +1391,7 @@ static void atifs_free_context_data(struct wined3d_context *context)
const struct fragment_pipeline atifs_fragment_pipeline = {
atifs_enable,
atifs_get_caps,
+ atifs_get_emul_mask,
atifs_alloc,
atifs_free,
atifs_alloc_context_data,
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 0ed97c7..ce23c47 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -3434,7 +3434,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
const char *WGL_Extensions = NULL;
enum wined3d_gl_vendor gl_vendor;
enum wined3d_pci_device device;
- DWORD gl_version;
+ DWORD gl_version, gl_ext_emul_mask;
HDC hdc;
unsigned int i, j;
GLint context_profile = 0;
@@ -3805,8 +3805,12 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
fixup_extensions(gl_info, gl_renderer_str, gl_vendor, card_vendor, device);
init_driver_info(driver_info, card_vendor, device);
- install_gl_compat_wrapper(gl_info, ARB_MULTITEXTURE);
- install_gl_compat_wrapper(gl_info, EXT_FOG_COORD);
+ gl_ext_emul_mask = adapter->vertex_pipe->vp_get_emul_mask(gl_info)
+ | adapter->fragment_pipe->get_emul_mask(gl_info);
+ if (gl_ext_emul_mask & GL_EXT_EMUL_ARB_MULTITEXTURE)
+ install_gl_compat_wrapper(gl_info, ARB_MULTITEXTURE);
+ if (gl_ext_emul_mask & GL_EXT_EMUL_EXT_FOG_COORD)
+ install_gl_compat_wrapper(gl_info, EXT_FOG_COORD);
return TRUE;
}
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 301dc6f..9880df1 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -7742,6 +7742,13 @@ static void glsl_vertex_pipe_vp_get_caps(const struct wined3d_gl_info *gl_info,
caps->raster_caps = WINED3DPRASTERCAPS_FOGRANGE;
}
+static DWORD glsl_vertex_pipe_vp_get_emul_mask(const struct wined3d_gl_info *gl_info)
+{
+ if (gl_info->supported[WINED3D_GL_LEGACY_CONTEXT])
+ return GL_EXT_EMUL_ARB_MULTITEXTURE;
+ return 0;
+}
+
static void *glsl_vertex_pipe_vp_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
{
struct shader_glsl_priv *priv;
@@ -8121,6 +8128,7 @@ const struct wined3d_vertex_pipe_ops glsl_vertex_pipe =
{
glsl_vertex_pipe_vp_enable,
glsl_vertex_pipe_vp_get_caps,
+ glsl_vertex_pipe_vp_get_emul_mask,
glsl_vertex_pipe_vp_alloc,
glsl_vertex_pipe_vp_free,
glsl_vertex_pipe_vp_states,
@@ -8167,6 +8175,13 @@ static void glsl_fragment_pipe_get_caps(const struct wined3d_gl_info *gl_info, s
caps->MaxSimultaneousTextures = min(gl_info->limits.fragment_samplers, 8);
}
+static DWORD glsl_fragment_pipe_get_emul_mask(const struct wined3d_gl_info *gl_info)
+{
+ if (gl_info->supported[WINED3D_GL_LEGACY_CONTEXT])
+ return GL_EXT_EMUL_ARB_MULTITEXTURE;
+ return 0;
+}
+
static void *glsl_fragment_pipe_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
{
struct shader_glsl_priv *priv;
@@ -8446,6 +8461,7 @@ const struct fragment_pipeline glsl_fragment_pipe =
{
glsl_fragment_pipe_enable,
glsl_fragment_pipe_get_caps,
+ glsl_fragment_pipe_get_emul_mask,
glsl_fragment_pipe_alloc,
glsl_fragment_pipe_free,
glsl_fragment_pipe_alloc_context_data,
diff --git a/dlls/wined3d/nvidia_texture_shader.c b/dlls/wined3d/nvidia_texture_shader.c
index 0dda7f5..30d15ad 100644
--- a/dlls/wined3d/nvidia_texture_shader.c
+++ b/dlls/wined3d/nvidia_texture_shader.c
@@ -738,6 +738,11 @@ static void nvrc_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct
caps->MaxSimultaneousTextures = gl_info->limits.textures;
}
+static DWORD nvrc_fragment_get_emul_mask(const struct wined3d_gl_info *gl_info)
+{
+ return GL_EXT_EMUL_ARB_MULTITEXTURE | GL_EXT_EMUL_EXT_FOG_COORD;
+}
+
static void *nvrc_fragment_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
{
return shader_priv;
@@ -924,6 +929,7 @@ static void nvrc_context_free(struct wined3d_context *context)
const struct fragment_pipeline nvts_fragment_pipeline = {
nvts_enable,
nvrc_fragment_get_caps,
+ nvrc_fragment_get_emul_mask,
nvrc_fragment_alloc,
nvrc_fragment_free,
nvrc_context_alloc,
@@ -935,6 +941,7 @@ const struct fragment_pipeline nvts_fragment_pipeline = {
const struct fragment_pipeline nvrc_fragment_pipeline = {
nvrc_enable,
nvrc_fragment_get_caps,
+ nvrc_fragment_get_emul_mask,
nvrc_fragment_alloc,
nvrc_fragment_free,
nvrc_context_alloc,
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 4751b37..e39b7b4 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -5582,10 +5582,16 @@ static void vp_ffp_get_caps(const struct wined3d_gl_info *gl_info, struct wined3
caps->raster_caps |= WINED3DPRASTERCAPS_FOGRANGE;
}
+static DWORD vp_ffp_get_emul_mask(const struct wined3d_gl_info *gl_info)
+{
+ return GL_EXT_EMUL_ARB_MULTITEXTURE | GL_EXT_EMUL_EXT_FOG_COORD;
+}
+
const struct wined3d_vertex_pipe_ops ffp_vertex_pipe =
{
ffp_enable,
vp_ffp_get_caps,
+ vp_ffp_get_emul_mask,
ffp_alloc,
ffp_free,
vp_ffp_states,
@@ -5632,6 +5638,11 @@ static void ffp_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct
caps->MaxSimultaneousTextures = gl_info->limits.textures;
}
+static DWORD ffp_fragment_get_emul_mask(const struct wined3d_gl_info *gl_info)
+{
+ return GL_EXT_EMUL_ARB_MULTITEXTURE | GL_EXT_EMUL_EXT_FOG_COORD;
+}
+
static BOOL ffp_color_fixup_supported(struct color_fixup_desc fixup)
{
if (TRACE_ON(d3d))
@@ -5663,6 +5674,7 @@ static void ffp_none_context_free(struct wined3d_context *context)
const struct fragment_pipeline ffp_fragment_pipeline = {
ffp_enable,
ffp_fragment_get_caps,
+ ffp_fragment_get_emul_mask,
ffp_alloc,
ffp_free,
ffp_none_context_alloc,
@@ -5685,10 +5697,16 @@ static void vp_none_get_caps(const struct wined3d_gl_info *gl_info, struct wined
memset(caps, 0, sizeof(*caps));
}
+static DWORD vp_none_get_emul_mask(const struct wined3d_gl_info *gl_info)
+{
+ return 0;
+}
+
const struct wined3d_vertex_pipe_ops none_vertex_pipe =
{
none_enable,
vp_none_get_caps,
+ vp_none_get_emul_mask,
none_alloc,
none_free,
NULL,
@@ -5699,6 +5717,11 @@ static void fp_none_get_caps(const struct wined3d_gl_info *gl_info, struct fragm
memset(caps, 0, sizeof(*caps));
}
+static DWORD fp_none_get_emul_mask(const struct wined3d_gl_info *gl_info)
+{
+ return 0;
+}
+
static BOOL fp_none_color_fixup_supported(struct color_fixup_desc fixup)
{
return is_identity_fixup(fixup);
@@ -5708,6 +5731,7 @@ const struct fragment_pipeline none_fragment_pipe =
{
none_enable,
fp_none_get_caps,
+ fp_none_get_emul_mask,
none_alloc,
none_free,
ffp_none_context_alloc,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d239ac1..a1331d3 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1287,10 +1287,14 @@ struct fragment_caps
DWORD MaxSimultaneousTextures;
};
+#define GL_EXT_EMUL_ARB_MULTITEXTURE 0x00000001
+#define GL_EXT_EMUL_EXT_FOG_COORD 0x00000002
+
struct fragment_pipeline
{
void (*enable_extension)(const struct wined3d_gl_info *gl_info, BOOL enable);
void (*get_caps)(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps);
+ DWORD (*get_emul_mask)(const struct wined3d_gl_info *gl_info);
void *(*alloc_private)(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv);
void (*free_private)(struct wined3d_device *device);
BOOL (*allocate_context_data)(struct wined3d_context *context);
@@ -1316,6 +1320,7 @@ struct wined3d_vertex_pipe_ops
{
void (*vp_enable)(const struct wined3d_gl_info *gl_info, BOOL enable);
void (*vp_get_caps)(const struct wined3d_gl_info *gl_info, struct wined3d_vertex_caps *caps);
+ DWORD (*vp_get_emul_mask)(const struct wined3d_gl_info *gl_info);
void *(*vp_alloc)(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv);
void (*vp_free)(struct wined3d_device *device);
const struct StateEntryTemplate *vp_states;
More information about the wine-cvs
mailing list