gallium: put u_vbuf_get_caps return values into u_vbuf_caps
authorMarek Olšák <marek.olsak@amd.com>
Mon, 30 Dec 2019 03:02:28 +0000 (22:02 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 8 Jan 2020 18:40:59 +0000 (13:40 -0500)
Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/auxiliary/cso_cache/cso_context.c
src/gallium/auxiliary/cso_cache/cso_context.h
src/gallium/auxiliary/util/u_vbuf.c
src/gallium/auxiliary/util/u_vbuf.h
src/mesa/state_tracker/st_context.c

index d9e1309c5ccc02f3f29b96256bd90abe7cef38f8..ae98a5c89cc6b681ea8545c63b6d580097a798f8 100644 (file)
@@ -287,15 +287,20 @@ sanitize_hash(struct cso_hash *hash, enum cso_cache_type type,
 static void cso_init_vbuf(struct cso_context *cso, unsigned flags)
 {
    struct u_vbuf_caps caps;
+   bool uses_user_vertex_buffers = !(flags & CSO_NO_USER_VERTEX_BUFFERS);
 
-   /* Install u_vbuf if there is anything unsupported. */
-   if (u_vbuf_get_caps(cso->pipe->screen, &caps, flags)) {
+   u_vbuf_get_caps(cso->pipe->screen, &caps);
+
+   /* Enable u_vbuf if needed. */
+   if (caps.fallback_always ||
+       (uses_user_vertex_buffers &&
+        caps.fallback_only_for_user_vbuffers)) {
       cso->vbuf = u_vbuf_create(cso->pipe, &caps);
    }
 }
 
 struct cso_context *
-cso_create_context(struct pipe_context *pipe, unsigned u_vbuf_flags)
+cso_create_context(struct pipe_context *pipe, unsigned flags)
 {
    struct cso_context *ctx = CALLOC_STRUCT(cso_context);
    if (!ctx)
@@ -311,7 +316,7 @@ cso_create_context(struct pipe_context *pipe, unsigned u_vbuf_flags)
    ctx->pipe = pipe;
    ctx->sample_mask = ~0;
 
-   cso_init_vbuf(ctx, u_vbuf_flags);
+   cso_init_vbuf(ctx, flags);
 
    /* Enable for testing: */
    if (0) cso_set_maximum_cache_size( ctx->cache, 4 );
index d3501fb92e9dc0b49ff160ff52b517b14a739c4b..de8c60fd2c12d9176e373657ed249ec1b3b2a02d 100644 (file)
@@ -41,8 +41,10 @@ extern "C" {
 struct cso_context;
 struct u_vbuf;
 
+#define CSO_NO_USER_VERTEX_BUFFERS (1 << 0)
+
 struct cso_context *cso_create_context(struct pipe_context *pipe,
-                                       unsigned u_vbuf_flags);
+                                       unsigned flags);
 void cso_destroy_context( struct cso_context *cso );
 struct pipe_context *cso_get_pipe_context(struct cso_context *cso);
 
index 8d50092b4c40eb00d38d838bcf37ff11199e5c15..9bed8d45230c4777d6c2fc65404d453f36e3d4e8 100644 (file)
@@ -255,11 +255,11 @@ static const struct {
    { PIPE_FORMAT_R8G8B8A8_SSCALED,     PIPE_FORMAT_R32G32B32A32_FLOAT },
 };
 
-boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
-                        unsigned flags)
+void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps)
 {
    unsigned i;
-   boolean fallback = FALSE;
+
+   memset(caps, 0, sizeof(*caps));
 
    /* I'd rather have a bitfield of which formats are supported and a static
     * table of the translations indexed by format, but since we don't have C99
@@ -275,7 +275,7 @@ boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
       if (!screen->is_format_supported(screen, format, PIPE_BUFFER, 0, 0,
                                        PIPE_BIND_VERTEX_BUFFER)) {
          caps->format_translation[format] = vbuf_format_fallbacks[i].to;
-         fallback = TRUE;
+         caps->fallback_always = true;
       }
    }
 
@@ -295,16 +295,15 @@ boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
 
    /* OpenGL 2.0 requires a minimum of 16 vertex buffers */
    if (caps->max_vertex_buffers < 16)
-      fallback = TRUE;
+      caps->fallback_always = true;
 
    if (!caps->buffer_offset_unaligned ||
        !caps->buffer_stride_unaligned ||
-       !caps->velem_src_offset_unaligned ||
-       (!(flags & U_VBUF_FLAG_NO_USER_VBOS) && !caps->user_vertex_buffers)) {
-      fallback = TRUE;
-   }
+       !caps->velem_src_offset_unaligned)
+      caps->fallback_always = true;
 
-   return fallback;
+   if (!caps->fallback_always && !caps->user_vertex_buffers)
+      caps->fallback_only_for_user_vbuffers = true;
 }
 
 struct u_vbuf *
index 797fbb7681f1a706595e8733292f7658a3180cfe..3e64d067e62c25eba1d2bdf3f7d5c26bc1a80b36 100644 (file)
@@ -40,8 +40,6 @@
 struct cso_context;
 struct u_vbuf;
 
-#define U_VBUF_FLAG_NO_USER_VBOS (1 << 0)
-
 /* Hardware vertex fetcher limitations can be described by this structure. */
 struct u_vbuf_caps {
    enum pipe_format format_translation[PIPE_FORMAT_COUNT];
@@ -57,11 +55,13 @@ struct u_vbuf_caps {
 
    /* Maximum number of vertex buffers */
    unsigned max_vertex_buffers:6;
+
+   bool fallback_always;
+   bool fallback_only_for_user_vbuffers;
 };
 
 
-boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
-                        unsigned flags);
+void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps);
 
 struct u_vbuf *
 u_vbuf_create(struct pipe_context *pipe, struct u_vbuf_caps *caps);
index 72e1a50bca34bc9df3964cf394b074be5611a9f2..e6a5b65dc22ea94fd9d0ea1575a6d647b4f1b631 100644 (file)
@@ -586,9 +586,9 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
     * profile, so that u_vbuf is bypassed completely if there is nothing else
     * to do.
     */
-   unsigned vbuf_flags =
-      ctx->API == API_OPENGL_CORE ? U_VBUF_FLAG_NO_USER_VBOS : 0;
-   st->cso_context = cso_create_context(pipe, vbuf_flags);
+   unsigned cso_flags =
+      ctx->API == API_OPENGL_CORE ? CSO_NO_USER_VERTEX_BUFFERS : 0;
+   st->cso_context = cso_create_context(pipe, cso_flags);
 
    st_init_atoms(st);
    st_init_clear(st);