[PATCH 1/3] wined3d: Initialise d3d_info after quirks are applied.
Henri Verbeet
hverbeet at codeweavers.com
Wed Aug 28 11:44:26 CDT 2019
In particular, quirk_broken_viewport_subpixel_bits() disables
ARB_CLIP_CONTROL, which affects "d3d_info->clip_control". This fixes a
regression introduced by commit e795ddb3d80d7b94d29cf97a24a01bb157b0138d.
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/wined3d/adapter_gl.c | 170 +++++++++++++++++++++--------------------
dlls/wined3d/wined3d_private.h | 1 +
2 files changed, 90 insertions(+), 81 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index 10b8aea4e4b..0415099439c 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -1295,8 +1295,7 @@ static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_s
}
static enum wined3d_feature_level feature_level_from_caps(const struct wined3d_gl_info *gl_info,
- const struct wined3d_d3d_limits *d3d_limits, const struct shader_caps *shader_caps,
- const struct fragment_caps *fragment_caps)
+ const struct shader_caps *shader_caps, const struct fragment_caps *fragment_caps)
{
unsigned int shader_model;
@@ -1322,7 +1321,7 @@ static enum wined3d_feature_level feature_level_from_caps(const struct wined3d_g
}
}
- if (shader_model >= 3 && d3d_limits->texture_size >= 4096 && d3d_limits->max_rt_count >= 4)
+ if (shader_model >= 3 && gl_info->limits.texture_size >= 4096 && gl_info->limits.buffers >= 4)
return WINED3D_FEATURE_LEVEL_9_3;
if (shader_model >= 2)
{
@@ -2905,10 +2904,9 @@ static void load_gl_funcs(struct wined3d_gl_info *gl_info)
#undef MAP_GL_FUNCTION_CAST
}
-static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info, struct wined3d_d3d_info *d3d_info)
+static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
{
unsigned int i, sampler_count;
- GLfloat gl_floatv[2];
GLint gl_max;
gl_info->limits.buffers = 1;
@@ -2947,14 +2945,9 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info, struct
}
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_max);
- d3d_info->limits.texture_size = gl_max;
+ gl_info->limits.texture_size = gl_max;
TRACE("Maximum texture size support - max texture size %d.\n", gl_max);
- gl_info->gl_ops.gl.p_glGetFloatv(gl_info->supported[WINED3D_GL_LEGACY_CONTEXT]
- ? GL_ALIASED_POINT_SIZE_RANGE : GL_POINT_SIZE_RANGE, gl_floatv);
- d3d_info->limits.pointsize_max = gl_floatv[1];
- TRACE("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);
@@ -3246,8 +3239,8 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info, struct
}
else
{
- gl_info->limits.framebuffer_width = d3d_info->limits.texture_size;
- gl_info->limits.framebuffer_height = d3d_info->limits.texture_size;
+ gl_info->limits.framebuffer_width = gl_info->limits.texture_size;
+ gl_info->limits.framebuffer_height = gl_info->limits.texture_size;
}
gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] =
@@ -3420,12 +3413,8 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
};
struct wined3d_driver_info *driver_info = &adapter->driver_info;
const char *gl_vendor_str, *gl_renderer_str, *gl_version_str;
- struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
const struct wined3d_gpu_description *gpu_description;
struct wined3d_gl_info *gl_info = &adapter->gl_info;
- struct wined3d_vertex_caps vertex_caps;
- struct fragment_caps fragment_caps;
- struct shader_caps shader_caps;
const char *WGL_Extensions = NULL;
enum wined3d_gl_vendor gl_vendor;
DWORD gl_version, gl_ext_emul_mask;
@@ -3731,7 +3720,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
gl_info->supported[ARB_TEXTURE_MULTISAMPLE] = FALSE;
}
- wined3d_adapter_init_limits(gl_info, d3d_info);
+ wined3d_adapter_init_limits(gl_info);
if (gl_info->supported[ARB_VERTEX_PROGRAM] && test_arb_vs_offset_limit(gl_info))
gl_info->quirks |= WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT;
@@ -3756,68 +3745,6 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
adapter->vertex_pipe = select_vertex_implementation(gl_info, adapter->shader_backend);
adapter->fragment_pipe = select_fragment_implementation(gl_info, adapter->shader_backend);
- d3d_info->limits.max_rt_count = gl_info->limits.buffers;
- d3d_info->limits.max_clip_distances = gl_info->limits.user_clip_distances;
-
- adapter->shader_backend->shader_get_caps(adapter, &shader_caps);
- d3d_info->vs_clipping = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_VS_CLIPPING;
- d3d_info->limits.vs_version = shader_caps.vs_version;
- d3d_info->limits.hs_version = shader_caps.hs_version;
- d3d_info->limits.ds_version = shader_caps.ds_version;
- d3d_info->limits.gs_version = shader_caps.gs_version;
- d3d_info->limits.ps_version = shader_caps.ps_version;
- d3d_info->limits.cs_version = shader_caps.cs_version;
- d3d_info->limits.vs_uniform_count = shader_caps.vs_uniform_count;
- d3d_info->limits.ps_uniform_count = shader_caps.ps_uniform_count;
- d3d_info->limits.varying_count = shader_caps.varying_count;
- d3d_info->full_ffp_varyings = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_FULL_FFP_VARYINGS);
- d3d_info->shader_double_precision = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_DOUBLE_PRECISION);
- d3d_info->shader_output_interpolation = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_OUTPUT_INTERPOLATION);
-
- d3d_info->viewport_array_index_any_shader = !!gl_info->supported[ARB_SHADER_VIEWPORT_LAYER_ARRAY];
-
- adapter->vertex_pipe->vp_get_caps(adapter, &vertex_caps);
- d3d_info->xyzrhw = vertex_caps.xyzrhw;
- d3d_info->ffp_generic_attributes = vertex_caps.ffp_generic_attributes;
- d3d_info->ffp_alpha_test = !!gl_info->supported[WINED3D_GL_LEGACY_CONTEXT];
- d3d_info->limits.ffp_vertex_blend_matrices = vertex_caps.max_vertex_blend_matrices;
- d3d_info->limits.active_light_count = vertex_caps.max_active_lights;
- d3d_info->emulated_flatshading = vertex_caps.emulated_flatshading;
-
- adapter->fragment_pipe->get_caps(adapter, &fragment_caps);
- d3d_info->limits.ffp_blend_stages = fragment_caps.MaxTextureBlendStages;
- d3d_info->limits.ffp_textures = fragment_caps.MaxSimultaneousTextures;
- d3d_info->shader_color_key = !!(fragment_caps.wined3d_caps & WINED3D_FRAGMENT_CAP_COLOR_KEY);
- d3d_info->wined3d_creation_flags = wined3d_creation_flags;
-
- d3d_info->texture_npot = !!gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO];
- d3d_info->texture_npot_conditional = gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT]
- || gl_info->supported[ARB_TEXTURE_RECTANGLE];
-
- d3d_info->draw_base_vertex_offset = !!gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX];
- d3d_info->vertex_bgra = !!gl_info->supported[ARB_VERTEX_ARRAY_BGRA];
- d3d_info->texture_swizzle = !!gl_info->supported[ARB_TEXTURE_SWIZZLE];
- d3d_info->srgb_read_control = !!gl_info->supported[EXT_TEXTURE_SRGB_DECODE];
- d3d_info->srgb_write_control = !!gl_info->supported[ARB_FRAMEBUFFER_SRGB];
- d3d_info->clip_control = !!gl_info->supported[ARB_CLIP_CONTROL];
-
- if (gl_info->supported[ARB_TEXTURE_MULTISAMPLE])
- d3d_info->multisample_draw_location = WINED3D_LOCATION_TEXTURE_RGB;
- else
- d3d_info->multisample_draw_location = WINED3D_LOCATION_RB_MULTISAMPLE;
-
- d3d_info->feature_level = feature_level_from_caps(gl_info, &d3d_info->limits, &shader_caps, &fragment_caps);
-
- TRACE("Max texture stages: %u.\n", d3d_info->limits.ffp_blend_stages);
-
- if (!d3d_info->shader_color_key)
- {
- /* We do not want to deal with re-creating immutable texture storage
- * for colour-keying emulation. */
- WARN("Disabling ARB_texture_storage because fragment pipe doesn't support colour-keying.\n");
- gl_info->supported[ARB_TEXTURE_STORAGE] = FALSE;
- }
-
if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT])
{
gl_info->fbo_ops.glIsRenderbuffer = gl_info->gl_ops.ext.p_glIsRenderbuffer;
@@ -3911,13 +3838,20 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
if (!(gpu_description = query_gpu_description(gl_info, &vram_bytes)))
{
+ enum wined3d_feature_level feature_level;
+ struct fragment_caps fragment_caps;
enum wined3d_pci_vendor vendor;
enum wined3d_pci_device device;
+ struct shader_caps shader_caps;
+
+ adapter->shader_backend->shader_get_caps(adapter, &shader_caps);
+ adapter->fragment_pipe->get_caps(adapter, &fragment_caps);
+ feature_level = feature_level_from_caps(gl_info, &shader_caps, &fragment_caps);
vendor = wined3d_guess_card_vendor(gl_vendor_str, gl_renderer_str);
TRACE("Guessed vendor PCI ID 0x%04x.\n", vendor);
- device = wined3d_guess_card(d3d_info->feature_level, gl_renderer_str, &gl_vendor, &vendor);
+ device = wined3d_guess_card(feature_level, gl_renderer_str, &gl_vendor, &vendor);
TRACE("Guessed device PCI ID 0x%04x.\n", device);
if (!(gpu_description = wined3d_get_gpu_description(vendor, device)))
@@ -5159,6 +5093,71 @@ static const struct wined3d_adapter_ops wined3d_adapter_gl_ops =
adapter_gl_flush_context,
};
+static void wined3d_adapter_gl_init_d3d_info(struct wined3d_adapter_gl *adapter_gl, uint32_t wined3d_creation_flags)
+{
+ const struct wined3d_gl_info *gl_info = &adapter_gl->a.gl_info;
+ struct wined3d_d3d_info *d3d_info = &adapter_gl->a.d3d_info;
+ struct wined3d_vertex_caps vertex_caps;
+ struct fragment_caps fragment_caps;
+ struct shader_caps shader_caps;
+ GLfloat f[2];
+
+ adapter_gl->a.shader_backend->shader_get_caps(&adapter_gl->a, &shader_caps);
+ adapter_gl->a.vertex_pipe->vp_get_caps(&adapter_gl->a, &vertex_caps);
+ adapter_gl->a.fragment_pipe->get_caps(&adapter_gl->a, &fragment_caps);
+
+ d3d_info->limits.vs_version = shader_caps.vs_version;
+ d3d_info->limits.hs_version = shader_caps.hs_version;
+ d3d_info->limits.ds_version = shader_caps.ds_version;
+ d3d_info->limits.gs_version = shader_caps.gs_version;
+ d3d_info->limits.ps_version = shader_caps.ps_version;
+ d3d_info->limits.cs_version = shader_caps.cs_version;
+ d3d_info->limits.vs_uniform_count = shader_caps.vs_uniform_count;
+ d3d_info->limits.ps_uniform_count = shader_caps.ps_uniform_count;
+ d3d_info->limits.varying_count = shader_caps.varying_count;
+ d3d_info->limits.ffp_textures = fragment_caps.MaxSimultaneousTextures;
+ d3d_info->limits.ffp_blend_stages = fragment_caps.MaxTextureBlendStages;
+ TRACE("Max texture stages: %u.\n", d3d_info->limits.ffp_blend_stages);
+ d3d_info->limits.ffp_vertex_blend_matrices = vertex_caps.max_vertex_blend_matrices;
+ d3d_info->limits.active_light_count = vertex_caps.max_active_lights;
+
+ d3d_info->limits.max_rt_count = gl_info->limits.buffers;
+ d3d_info->limits.max_clip_distances = gl_info->limits.user_clip_distances;
+ d3d_info->limits.texture_size = gl_info->limits.texture_size;
+
+ gl_info->gl_ops.gl.p_glGetFloatv(gl_info->supported[WINED3D_GL_LEGACY_CONTEXT]
+ ? GL_ALIASED_POINT_SIZE_RANGE : GL_POINT_SIZE_RANGE, f);
+ d3d_info->limits.pointsize_max = f[1];
+ TRACE("Maximum point size support - max point size %.8e.\n", f[1]);
+
+ d3d_info->wined3d_creation_flags = wined3d_creation_flags;
+ d3d_info->xyzrhw = vertex_caps.xyzrhw;
+ d3d_info->emulated_flatshading = vertex_caps.emulated_flatshading;
+ d3d_info->ffp_generic_attributes = vertex_caps.ffp_generic_attributes;
+ d3d_info->ffp_alpha_test = !!gl_info->supported[WINED3D_GL_LEGACY_CONTEXT];
+ d3d_info->vs_clipping = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_VS_CLIPPING;
+ d3d_info->shader_color_key = !!(fragment_caps.wined3d_caps & WINED3D_FRAGMENT_CAP_COLOR_KEY);
+ d3d_info->shader_double_precision = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_DOUBLE_PRECISION);
+ d3d_info->shader_output_interpolation = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_OUTPUT_INTERPOLATION);
+ d3d_info->viewport_array_index_any_shader = !!gl_info->supported[ARB_SHADER_VIEWPORT_LAYER_ARRAY];
+ d3d_info->texture_npot = !!gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO];
+ d3d_info->texture_npot_conditional = gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT]
+ || gl_info->supported[ARB_TEXTURE_RECTANGLE];
+ d3d_info->draw_base_vertex_offset = !!gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX];
+ d3d_info->vertex_bgra = !!gl_info->supported[ARB_VERTEX_ARRAY_BGRA];
+ d3d_info->texture_swizzle = !!gl_info->supported[ARB_TEXTURE_SWIZZLE];
+ d3d_info->srgb_read_control = !!gl_info->supported[EXT_TEXTURE_SRGB_DECODE];
+ d3d_info->srgb_write_control = !!gl_info->supported[ARB_FRAMEBUFFER_SRGB];
+ d3d_info->clip_control = !!gl_info->supported[ARB_CLIP_CONTROL];
+ d3d_info->full_ffp_varyings = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_FULL_FFP_VARYINGS);
+ d3d_info->feature_level = feature_level_from_caps(gl_info, &shader_caps, &fragment_caps);
+
+ if (gl_info->supported[ARB_TEXTURE_MULTISAMPLE])
+ d3d_info->multisample_draw_location = WINED3D_LOCATION_TEXTURE_RGB;
+ else
+ d3d_info->multisample_draw_location = WINED3D_LOCATION_RB_MULTISAMPLE;
+}
+
static BOOL wined3d_adapter_gl_init(struct wined3d_adapter_gl *adapter_gl,
unsigned int ordinal, unsigned int wined3d_creation_flags)
{
@@ -5239,6 +5238,15 @@ static BOOL wined3d_adapter_gl_init(struct wined3d_adapter_gl *adapter_gl,
return FALSE;
}
+ wined3d_adapter_gl_init_d3d_info(adapter_gl, wined3d_creation_flags);
+ if (!adapter_gl->a.d3d_info.shader_color_key)
+ {
+ /* We do not want to deal with re-creating immutable texture storage
+ * for colour-keying emulation. */
+ WARN("Disabling ARB_texture_storage because fragment pipe doesn't support colour-keying.\n");
+ gl_info->supported[ARB_TEXTURE_STORAGE] = FALSE;
+ }
+
if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER)
ERR_(winediag)("You are using the backbuffer for offscreen rendering. "
"This is unsupported, and will be removed in a future version.\n");
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 26a1feee7a5..10d076edccc 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2682,6 +2682,7 @@ struct wined3d_gl_limits
unsigned int combined_samplers;
UINT general_combiners;
UINT user_clip_distances;
+ unsigned int texture_size;
UINT texture3d_size;
UINT anisotropy;
float shininess;
--
2.11.0
More information about the wine-devel
mailing list