[PATCH] wined3d: Support D3DFMT_L8 format as render target when supported by GPU.
Paul Gofman
gofmanp at gmail.com
Wed Mar 23 03:56:36 CDT 2016
Tested on Intel HD 4000 (L8 rt is not supported) and NVIDIA GeForce 650M
(L8 rt supported). Changes in query_internal_format are for avoiding
ERR in output when format is not supported as render target (RENDERTARGET
flag is cleared in check_fbo_compat which is called later).
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
dlls/d3d9/tests/visual.c | 1 +
dlls/wined3d/utils.c | 31 +++++++++++++++++++++----------
2 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index 6e63a12..a93937e 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -11279,6 +11279,7 @@ static void pixelshader_blending_test(void)
{"D3DFMT_R32F", D3DFMT_R32F, 0x0018ffff, 0x0020ffff},
{"D3DFMT_G32R32F", D3DFMT_G32R32F, 0x001818ff, 0x002010ff},
{"D3DFMT_A32B32G32R32F", D3DFMT_A32B32G32R32F, 0x00181800, 0x00201000},
+ {"D3DFMT_L8", D3DFMT_L8, 0x00181818, 0x002010ff},
};
static const float quad[][5] =
{
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 306d36a..efd4260 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -1241,7 +1241,7 @@ static const struct wined3d_format_texture_info format_texture_info[] =
{WINED3DFMT_L8_UNORM, GL_LUMINANCE8, GL_SLUMINANCE8_EXT, 0,
GL_LUMINANCE, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
- | WINED3DFMT_FLAG_SRGB_READ,
+ | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_SRGB_READ,
WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_L8A8_UNORM, GL_LUMINANCE8_ALPHA8, GL_SLUMINANCE8_ALPHA8_EXT, 0,
GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
@@ -2456,18 +2456,29 @@ static void query_internal_format(struct wined3d_adapter *adapter,
{
if (gl_info->supported[ARB_INTERNALFORMAT_QUERY])
{
+ GLenum err;
+
GL_EXTCALL(glGetInternalformativ(GL_RENDERBUFFER, format->glInternal,
GL_NUM_SAMPLE_COUNTS, 1, &count));
- checkGLcall("glGetInternalformativ(GL_NUM_SAMPLE_COUNTS)");
- count = min(count, MAX_MULTISAMPLE_TYPES);
- GL_EXTCALL(glGetInternalformativ(GL_RENDERBUFFER, format->glInternal,
- GL_SAMPLES, count, multisample_types));
- checkGLcall("glGetInternalformativ(GL_SAMPLES)");
- for (i = 0; i < count; ++i)
+ err = gl_info->gl_ops.gl.p_glGetError();
+ if (err == GL_INVALID_ENUM)
+ WARN("glGetInternalformativ(GL_NUM_SAMPLE_COUNTS) failed, format %s, error %s (%#x).\n",
+ debug_d3dformat(format->id), debug_glerror(err), err);
+ else if (err != GL_NO_ERROR)
+ ERR("glGetInternalformativ(GL_NUM_SAMPLE_COUNTS) failed, format %s, error %s (%#x).\n",
+ debug_d3dformat(format->id), debug_glerror(err), err);
+ else
{
- if (multisample_types[i] > sizeof(format->multisample_types) * 8)
- continue;
- format->multisample_types |= 1u << (multisample_types[i] - 1);
+ count = min(count, MAX_MULTISAMPLE_TYPES);
+ GL_EXTCALL(glGetInternalformativ(GL_RENDERBUFFER, format->glInternal,
+ GL_SAMPLES, count, multisample_types));
+ checkGLcall("glGetInternalformativ(GL_SAMPLES)");
+ for (i = 0; i < count; ++i)
+ {
+ if (multisample_types[i] > sizeof(format->multisample_types) * 8)
+ continue;
+ format->multisample_types |= 1u << (multisample_types[i] - 1);
+ }
}
}
else
--
2.5.5
More information about the wine-patches
mailing list