Zebediah Figura : wined3d: Omit GL_MAP_FLUSH_EXPLICIT_BIT for incoherent maps when ARB_MAP_BUFFER_RANGE is used.

Alexandre Julliard julliard at winehq.org
Fri Oct 15 15:40:04 CDT 2021


Module: wine
Branch: master
Commit: 86e4d3aa8c971182661ad07afe0499dd598cb3fe
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=86e4d3aa8c971182661ad07afe0499dd598cb3fe

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Thu Oct 14 23:44:16 2021 -0500

wined3d: Omit GL_MAP_FLUSH_EXPLICIT_BIT for incoherent maps when ARB_MAP_BUFFER_RANGE is used.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/context_gl.c      | 27 +++++++++++++++------------
 dlls/wined3d/resource.c        |  8 ++++++--
 dlls/wined3d/wined3d_private.h |  2 +-
 3 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c
index b08003c697a..4510fe5b155 100644
--- a/dlls/wined3d/context_gl.c
+++ b/dlls/wined3d/context_gl.c
@@ -2712,7 +2712,7 @@ map:
 
     if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
     {
-        map_ptr = GL_EXTCALL(glMapBufferRange(bo->binding, offset, size, wined3d_resource_gl_map_flags(flags)));
+        map_ptr = GL_EXTCALL(glMapBufferRange(bo->binding, offset, size, wined3d_resource_gl_map_flags(bo, flags)));
     }
     else
     {
@@ -2754,21 +2754,24 @@ void wined3d_context_gl_unmap_bo_address(struct wined3d_context_gl *context_gl,
     gl_info = context_gl->gl_info;
     wined3d_context_gl_bind_bo(context_gl, bo->binding, bo->id);
 
-    if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+    if (!bo->coherent)
     {
-        for (i = 0; i < range_count; ++i)
+        if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
         {
-            GL_EXTCALL(glFlushMappedBufferRange(bo->binding,
-                    (UINT_PTR)data->addr + ranges[i].offset, ranges[i].size));
+            for (i = 0; i < range_count; ++i)
+            {
+                GL_EXTCALL(glFlushMappedBufferRange(bo->binding,
+                        (UINT_PTR)data->addr + ranges[i].offset, ranges[i].size));
+            }
         }
-    }
-    else if (!bo->coherent && gl_info->supported[APPLE_FLUSH_BUFFER_RANGE])
-    {
-        for (i = 0; i < range_count; ++i)
+        else if (gl_info->supported[APPLE_FLUSH_BUFFER_RANGE])
         {
-            GL_EXTCALL(glFlushMappedBufferRangeAPPLE(bo->binding,
-                    (uintptr_t)data->addr + ranges[i].offset, ranges[i].size));
-            checkGLcall("glFlushMappedBufferRangeAPPLE");
+            for (i = 0; i < range_count; ++i)
+            {
+                GL_EXTCALL(glFlushMappedBufferRangeAPPLE(bo->binding,
+                        (uintptr_t)data->addr + ranges[i].offset, ranges[i].size));
+                checkGLcall("glFlushMappedBufferRangeAPPLE");
+            }
         }
     }
 
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 8f31996595c..abf07682c76 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -388,12 +388,16 @@ GLbitfield wined3d_resource_gl_storage_flags(const struct wined3d_resource *reso
     return flags;
 }
 
-GLbitfield wined3d_resource_gl_map_flags(DWORD d3d_flags)
+GLbitfield wined3d_resource_gl_map_flags(const struct wined3d_bo_gl *bo, DWORD d3d_flags)
 {
     GLbitfield ret = 0;
 
     if (d3d_flags & WINED3D_MAP_WRITE)
-        ret |= GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
+    {
+        ret |= GL_MAP_WRITE_BIT;
+        if (!bo->coherent)
+            ret |= GL_MAP_FLUSH_EXPLICIT_BIT;
+    }
     if (d3d_flags & WINED3D_MAP_READ)
         ret |= GL_MAP_READ_BIT;
     else
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 161d36ad76c..41956f1f061 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4217,7 +4217,7 @@ void wined3d_resource_free_sysmem(struct wined3d_resource *resource) DECLSPEC_HI
 const struct wined3d_format *wined3d_resource_get_decompress_format(
         const struct wined3d_resource *resource) DECLSPEC_HIDDEN;
 unsigned int wined3d_resource_get_sample_count(const struct wined3d_resource *resource) DECLSPEC_HIDDEN;
-GLbitfield wined3d_resource_gl_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN;
+GLbitfield wined3d_resource_gl_map_flags(const struct wined3d_bo_gl *bo, DWORD d3d_flags) DECLSPEC_HIDDEN;
 GLenum wined3d_resource_gl_legacy_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN;
 GLbitfield wined3d_resource_gl_storage_flags(const struct wined3d_resource *resource) DECLSPEC_HIDDEN;
 BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list