gallium: pass the robust buffer access context flag to drivers
authorMarek Olšák <marek.olsak@amd.com>
Sat, 6 Feb 2016 16:13:07 +0000 (17:13 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 9 Feb 2016 20:19:51 +0000 (21:19 +0100)
radeonsi will not do bounds checking for loads if this is not set.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/include/pipe/p_defines.h
src/mesa/state_tracker/st_manager.c

index 800f16cd2508201e2e510543c6564d8a21ce437d..b01f6ea3dcb61f1262ea469db541a83cc10cd119 100644 (file)
@@ -348,6 +348,12 @@ enum pipe_flush_flags
  */
 #define PIPE_CONTEXT_DEBUG             (1 << 1)
 
+/**
+ * Whether out-of-bounds shader loads must return zero and out-of-bounds
+ * shader stores must be dropped.
+ */
+#define PIPE_CONTEXT_ROBUST_BUFFER_ACCESS (1 << 2)
+
 /**
  * Flags for pipe_context::memory_barrier.
  */
index c16fa0b0c725da0b372cfbb89c411f548a3f6415..84b65369d805016140918237ed7deaca2237d60d 100644 (file)
@@ -636,6 +636,7 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi,
    struct pipe_context *pipe;
    struct gl_config mode;
    gl_api api;
+   unsigned ctx_flags = 0;
 
    if (!(stapi->profile_mask & (1 << attribs->profile)))
       return NULL;
@@ -659,7 +660,10 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi,
       break;
    }
 
-   pipe = smapi->screen->context_create(smapi->screen, NULL, 0);
+   if (attribs->flags & ST_CONTEXT_FLAG_ROBUST_ACCESS)
+      ctx_flags |= PIPE_CONTEXT_ROBUST_BUFFER_ACCESS;
+
+   pipe = smapi->screen->context_create(smapi->screen, NULL, ctx_flags);
    if (!pipe) {
       *error = ST_CONTEXT_ERROR_NO_MEMORY;
       return NULL;