[PATCH 3/5] wined3d: Add a real implementation of wined3d_check_device_multisample_type().
Matteo Bruni
mbruni at codeweavers.com
Mon Dec 14 16:37:55 CST 2015
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
This (and the tests) can be deferred if deemed too dangerous for code
freeze.
Otherwise it can instead be merged with the previous patch.
dlls/wined3d/directx.c | 46 +++++++++++++++++++++++++++++++-----------
dlls/wined3d/utils.c | 13 +++++++++++-
dlls/wined3d/wined3d_private.h | 3 +++
3 files changed, 49 insertions(+), 13 deletions(-)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index e022e19..3f3a6b2 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -4403,6 +4403,7 @@ HRESULT CDECL wined3d_check_device_multisample_type(const struct wined3d *wined3
enum wined3d_multisample_type multisample_type, DWORD *quality_levels)
{
const struct wined3d_gl_info *gl_info;
+ HRESULT hr = WINED3D_OK;
TRACE("wined3d %p, adapter_idx %u, device_type %s, surface_format %s,\n"
"windowed %#x, multisample_type %#x, quality_levels %p.\n",
@@ -4411,29 +4412,50 @@ HRESULT CDECL wined3d_check_device_multisample_type(const struct wined3d *wined3
if (adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL;
+ if (surface_format_id == WINED3DFMT_UNKNOWN)
+ return WINED3DERR_INVALIDCALL;
+ if (multisample_type < WINED3D_MULTISAMPLE_NONE || multisample_type > WINED3D_MULTISAMPLE_16_SAMPLES)
+ return WINED3DERR_INVALIDCALL;
gl_info = &wined3d->adapters[adapter_idx].gl_info;
- /* FIXME: Make use of ARB_internalformat_query2 NUM_SAMPLE_COUNTS and
- * SAMPLES queries to give sensible results. */
if (multisample_type > gl_info->limits.samples)
+ hr = WINED3DERR_NOTAVAILABLE;
+
+ if (SUCCEEDED(hr))
{
- TRACE("Returning not supported.\n");
- if (quality_levels)
- *quality_levels = 0;
+ const struct wined3d_format *format = wined3d_get_format(gl_info, surface_format_id);
+ unsigned int i;
- return WINED3DERR_NOTAVAILABLE;
+ hr = WINED3DERR_NOTAVAILABLE;
+ for (i = 0; i < format->multisample_types_count; ++i)
+ {
+ if (format->multisample_types[i] == multisample_type)
+ {
+ hr = WINED3D_OK;
+ break;
+ }
+ }
}
- if (quality_levels)
+ if (SUCCEEDED(hr) || multisample_type == WINED3D_MULTISAMPLE_NONE
+ || multisample_type == WINED3D_MULTISAMPLE_NON_MASKABLE)
{
- if (multisample_type == WINED3D_MULTISAMPLE_NON_MASKABLE)
- *quality_levels = wined3d_log2i(gl_info->limits.samples);
- else
- *quality_levels = 1;
+ if (quality_levels)
+ {
+ if (multisample_type == WINED3D_MULTISAMPLE_NON_MASKABLE)
+ *quality_levels = wined3d_log2i(gl_info->limits.samples);
+ else
+ *quality_levels = 1;
+ }
+ return WINED3D_OK;
}
- return WINED3D_OK;
+ TRACE("Returning not supported.\n");
+ if (quality_levels)
+ *quality_levels = 0;
+
+ return hr;
}
/* Check if the given DisplayFormat + DepthStencilFormat combination is valid for the Adapter */
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 4406067..ac528c6 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -2127,7 +2127,7 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win
struct fragment_caps fragment_caps;
struct shader_caps shader_caps;
BOOL srgb_write;
- unsigned int i;
+ unsigned int i, j;
adapter->fragment_pipe->get_caps(gl_info, &fragment_caps);
adapter->shader_backend->shader_get_caps(gl_info, &shader_caps);
@@ -2207,6 +2207,12 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win
else if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
format->glInternal = format->glGammaInternal;
}
+
+ GL_EXTCALL(glGetInternalformativ(GL_TEXTURE_2D, format->glInternal, GL_NUM_SAMPLE_COUNTS,
+ 1, &format->multisample_types_count));
+ format->multisample_types_count = min(format->multisample_types_count, MAX_MULTISAMPLE_TYPES);
+ GL_EXTCALL(glGetInternalformativ(GL_TEXTURE_2D, format->glInternal, GL_SAMPLES,
+ format->multisample_types_count, format->multisample_types));
}
else
{
@@ -2244,6 +2250,11 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win
format->flags[WINED3D_GL_RES_TYPE_TEX_CUBE] &= ~WINED3DFMT_FLAG_TEXTURE;
format->flags[WINED3D_GL_RES_TYPE_TEX_RECT] &= ~WINED3DFMT_FLAG_TEXTURE;
}
+
+ format->multisample_types_count = wined3d_log2i(gl_info->limits.samples);
+ format->multisample_types_count = min(format->multisample_types_count, MAX_MULTISAMPLE_TYPES);
+ for (j = 1; j <= format->multisample_types_count; ++j)
+ format->multisample_types[j] = 1 << j;
}
/* Texture conversion stuff */
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 70857c9..f798f1d 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -185,6 +185,7 @@ void wined3d_rb_free(void *ptr) DECLSPEC_HIDDEN;
#define MAX_SAMPLER_OBJECTS 16
#define MAX_SHADER_RESOURCE_VIEWS 128
#define MAX_VERTEX_BLENDS 4
+#define MAX_MULTISAMPLE_TYPES 8
struct min_lookup
{
@@ -3242,6 +3243,8 @@ struct wined3d_format
GLint glFormat;
GLint glType;
UINT conv_byte_count;
+ GLint multisample_types_count;
+ GLint multisample_types[MAX_MULTISAMPLE_TYPES];
unsigned int flags[WINED3D_GL_RES_TYPE_COUNT];
struct wined3d_rational height_scale;
struct color_fixup_desc color_fixup;
--
2.4.10
More information about the wine-patches
mailing list