[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