[PATCH 1/2] wined3d: Add sync object after query buffer issue.

Andrew Wesie awesie at gmail.com
Sun Oct 14 12:18:11 CDT 2018


On Sun, Oct 14, 2018 at 9:45 AM Henri Verbeet <hverbeet at gmail.com> wrote:
>
> On Sun, 14 Oct 2018 at 01:09, Andrew Wesie <awesie at gmail.com> wrote:
> > +    GL_EXTCALL(glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT));
> The ARB_buffer_storage spec is written against GL 4.3, but doesn't
> seem to require it. I think that means you need to check for
> ARB_SHADER_IMAGE_LOAD_STORE before using glMemoryBarrier().

That would imply that it is impossible to use non-coherent, persistent
mappings unless we have the ARB_SHADER_IMAGE_LOAD_STORE extension. And
based on the piglit tests, you are probably right. I'll revert back to
using GL_MAP_COHERENT_BIT unless I can make a good case for the
non-coherent mapping.

>
> > +    /* NVIDIA requires a sync object. */
> I think I'd phrase that as "The ARB_buffer_storage spec requires …",
> or just quote the relevant lines from the spec literally, and then add
> a note that NVIDIA appears to enforce that, while Mesa doesn't.

After further investigation, I don't believe that this statement is
accurate. If I modify the implementation to avoid ARB_buffer_storage
entirely (e.g. use glBufferData, never map the buffer, etc.), the sync
object is still required to avoid NVIDIA crashing. I'm more inclined
to indicate that this is a driver-specific workaround.

You can demonstrate the bad behavior on NVIDIA with a simple patch to
the piglit query_buffer_object tests (which also do not use
ARB_buffer_storage):

diff --git a/tests/spec/arb_query_buffer_object/qbo.c
b/tests/spec/arb_query_buffer_object/qbo.c
index 3ba11ee26..bfedefce0 100644
--- a/tests/spec/arb_query_buffer_object/qbo.c
+++ b/tests/spec/arb_query_buffer_object/qbo.c
@@ -138,7 +138,10 @@ run_subtest(void)
                else if (result_type == GL_UNSIGNED_INT)
                        glGetQueryObjectuivARB(query, GL_QUERY_RESULT,
BUFFER_OFFSET(0));
                else
-                       glGetQueryObjectui64v(query, GL_QUERY_RESULT,
BUFFER_OFFSET(0));
+        {
+            for (unsigned int i = 0; i < 100000; i++)
+                glGetQueryObjectui64v(query, GL_QUERY_RESULT,
BUFFER_OFFSET(0));
+        }
        } else {
                if (result_type == GL_INT) {
                        glGetQueryObjectivARB(query,
GL_QUERY_RESULT_AVAILABLE, BUFFER_OFFSET(8));



More information about the wine-devel mailing list