[PATCH 4/5] wined3d: Add core context support for A8_UNORM render targets.

Józef Kucia jkucia at codeweavers.com
Mon Oct 1 11:01:15 CDT 2018


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=44655
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/cs.c              |  8 ++++++++
 dlls/wined3d/glsl_shader.c     | 11 +++++++----
 dlls/wined3d/shader.c          | 10 ++++++++++
 dlls/wined3d/utils.c           |  3 ++-
 dlls/wined3d/wined3d_private.h |  3 ++-
 5 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 2aae559a6cb9..af1dbef84ce1 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -1084,9 +1084,17 @@ void wined3d_cs_emit_set_scissor_rects(struct wined3d_cs *cs, unsigned int rect_
 static void wined3d_cs_exec_set_rendertarget_view(struct wined3d_cs *cs, const void *data)
 {
     const struct wined3d_cs_set_rendertarget_view *op = data;
+    BOOL prev_alpha_swizzle, curr_alpha_swizzle;
+    struct wined3d_rendertarget_view *prev;
 
+    prev = cs->state.fb->render_targets[op->view_idx];
     cs->fb.render_targets[op->view_idx] = op->view;
     device_invalidate_state(cs->device, STATE_FRAMEBUFFER);
+
+    prev_alpha_swizzle = prev && prev->format->id == WINED3DFMT_A8_UNORM;
+    curr_alpha_swizzle = op->view && op->view->format->id == WINED3DFMT_A8_UNORM;
+    if (prev_alpha_swizzle != curr_alpha_swizzle)
+        device_invalidate_state(cs->device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL));
 }
 
 void wined3d_cs_emit_set_rendertarget_view(struct wined3d_cs *cs, unsigned int view_idx,
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 0db7fdc038b0..32f82d6c3d0a 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -7694,11 +7694,12 @@ static void shader_glsl_enable_extensions(struct wined3d_string_buffer *buffer,
 
 static void shader_glsl_generate_color_output(struct wined3d_string_buffer *buffer,
         const struct wined3d_gl_info *gl_info, const struct wined3d_shader *shader,
-        struct wined3d_string_buffer_list *string_buffers)
+        const struct ps_compile_args *args, struct wined3d_string_buffer_list *string_buffers)
 {
     const struct wined3d_shader_signature *output_signature = &shader->output_signature;
     struct wined3d_string_buffer *src, *assignment;
     enum wined3d_data_type dst_data_type;
+    const char *swizzle;
     unsigned int i;
 
     if (output_signature->element_count)
@@ -7721,7 +7722,8 @@ static void shader_glsl_generate_color_output(struct wined3d_string_buffer *buff
             shader_addline(buffer, "color_out%u = ", output->semantic_idx);
             string_buffer_sprintf(src, "ps_out[%u]", output->semantic_idx);
             shader_glsl_sprintf_cast(assignment, src->buffer, dst_data_type, WINED3D_DATA_FLOAT);
-            shader_addline(buffer, "%s;\n", assignment->buffer);
+            swizzle = args->rt_alpha_swizzle & (1u << output->semantic_idx) ? ".argb" : "";
+            shader_addline(buffer, "%s%s;\n", assignment->buffer, swizzle);
         }
         string_buffer_release(string_buffers, src);
         string_buffer_release(string_buffers, assignment);
@@ -7733,7 +7735,8 @@ static void shader_glsl_generate_color_output(struct wined3d_string_buffer *buff
         while (mask)
         {
             i = wined3d_bit_scan(&mask);
-            shader_addline(buffer, "color_out%u = ps_out[%u];\n", i, i);
+            swizzle = args->rt_alpha_swizzle & (1u << i) ? ".argb" : "";
+            shader_addline(buffer, "color_out%u = ps_out[%u]%s;\n", i, i, swizzle);
         }
     }
 }
@@ -7761,7 +7764,7 @@ static void shader_glsl_generate_ps_epilogue(const struct wined3d_gl_info *gl_in
         shader_addline(buffer, "gl_SampleMask[0] = floatBitsToInt(sample_mask);\n");
 
     if (!needs_legacy_glsl_syntax(gl_info))
-        shader_glsl_generate_color_output(buffer, gl_info, shader, string_buffers);
+        shader_glsl_generate_color_output(buffer, gl_info, shader, args, string_buffers);
 }
 
 /* Context activation is done by the caller. */
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 62ec97154141..09681725b5a7 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -4124,6 +4124,16 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3
 
     args->render_offscreen = shader->reg_maps.vpos && gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS]
             ? context->render_offscreen : 0;
+
+    if (!gl_info->supported[WINED3D_GL_LEGACY_CONTEXT])
+    {
+        for (i = 0; i < ARRAY_SIZE(state->fb->render_targets); ++i)
+        {
+            struct wined3d_rendertarget_view *rtv = state->fb->render_targets[i];
+            if (rtv && rtv->format->id == WINED3DFMT_A8_UNORM)
+                args->rt_alpha_swizzle |= 1u << i;
+        }
+    }
 }
 
 static HRESULT pixel_shader_init(struct wined3d_shader *shader, struct wined3d_device *device,
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 05579db5b2b4..e3df24ade40d 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -1519,7 +1519,8 @@ static const struct wined3d_format_texture_info format_texture_info[] =
             ARB_TEXTURE_RG,             NULL},
     {WINED3DFMT_A8_UNORM,               GL_R8,                            GL_R8,                                  0,
             GL_RED,                     GL_UNSIGNED_BYTE,                 0,
-            WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+            WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
+            | WINED3DFMT_FLAG_RENDERTARGET,
             ARB_TEXTURE_RG,             NULL},
     {WINED3DFMT_A8_UNORM,               GL_ALPHA8,                        GL_ALPHA8,                              0,
             GL_ALPHA,                   GL_UNSIGNED_BYTE,                 0,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 9135189d026c..5f7f6fd39795 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1345,7 +1345,8 @@ struct ps_compile_args
     DWORD flatshading : 1;
     DWORD alpha_test_func : 3;
     DWORD render_offscreen : 1;
-    DWORD padding : 26;
+    DWORD rt_alpha_swizzle : 8; /* MAX_RENDER_TARGET_VIEWS, 8 */
+    DWORD padding : 18;
 };
 
 enum fog_src_type
-- 
2.16.4




More information about the wine-devel mailing list