gallium: let state trackers tell u_vbuf whether user VBOs are possible
authorMarek Olšák <marek.olsak@amd.com>
Fri, 10 Feb 2017 00:09:27 +0000 (01:09 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 14 Feb 2017 20:47:51 +0000 (21:47 +0100)
This can affect whether u_vbuf will be enabled or not.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/auxiliary/cso_cache/cso_context.c
src/gallium/auxiliary/cso_cache/cso_context.h
src/gallium/auxiliary/util/u_tests.c
src/gallium/auxiliary/util/u_vbuf.c
src/gallium/auxiliary/util/u_vbuf.h
src/gallium/state_trackers/nine/device9.c
src/gallium/state_trackers/xa/xa_context.c
src/gallium/tests/trivial/quad-tex.c
src/gallium/tests/trivial/tri.c
src/mesa/state_tracker/st_context.c

index 469ab9cdbc6de72a0fda974d3be26b665af0d6a5..0f12304fe50eca8877ded5b91d3cdfd24982c0e3 100644 (file)
@@ -277,18 +277,19 @@ sanitize_hash(struct cso_hash *hash, enum cso_cache_type type,
    }
 }
 
-static void cso_init_vbuf(struct cso_context *cso)
+static void cso_init_vbuf(struct cso_context *cso, unsigned flags)
 {
    struct u_vbuf_caps caps;
 
    /* Install u_vbuf if there is anything unsupported. */
-   if (u_vbuf_get_caps(cso->pipe->screen, &caps)) {
+   if (u_vbuf_get_caps(cso->pipe->screen, &caps, flags)) {
       cso->vbuf = u_vbuf_create(cso->pipe, &caps,
                                 cso->aux_vertex_buffer_index);
    }
 }
 
-struct cso_context *cso_create_context( struct pipe_context *pipe )
+struct cso_context *
+cso_create_context(struct pipe_context *pipe, unsigned u_vbuf_flags)
 {
    struct cso_context *ctx = CALLOC_STRUCT(cso_context);
    if (!ctx)
@@ -306,7 +307,7 @@ struct cso_context *cso_create_context( struct pipe_context *pipe )
 
    ctx->aux_vertex_buffer_index = 0; /* 0 for now */
 
-   cso_init_vbuf(ctx);
+   cso_init_vbuf(ctx, u_vbuf_flags);
 
    /* Enable for testing: */
    if (0) cso_set_maximum_cache_size( ctx->cache, 4 );
index 29e5e33171ea9711649ec7417b203212c8aea8f2..2a65354a7f496252c06b387b8b3450fcf6ba1afb 100644 (file)
@@ -41,7 +41,8 @@ extern "C" {
 struct cso_context;
 struct u_vbuf;
 
-struct cso_context *cso_create_context( struct pipe_context *pipe );
+struct cso_context *cso_create_context(struct pipe_context *pipe,
+                                       unsigned u_vbuf_flags);
 void cso_destroy_context( struct cso_context *cso );
 
 
index c33c1f69e837a7514a32fc07e516cfd528ec16c7..687e5118d7c300d347757fa07070d73242dc0d29 100644 (file)
@@ -304,7 +304,7 @@ tgsi_vs_window_space_position(struct pipe_context *ctx)
       return;
    }
 
-   cso = cso_create_context(ctx);
+   cso = cso_create_context(ctx, 0);
    cb = util_create_texture2d(ctx->screen, 256, 256,
                               PIPE_FORMAT_R8G8B8A8_UNORM);
    util_set_common_states_and_clear(cso, ctx, cb);
@@ -364,7 +364,7 @@ null_sampler_view(struct pipe_context *ctx, unsigned tgsi_tex_target)
       return;
    }
 
-   cso = cso_create_context(ctx);
+   cso = cso_create_context(ctx, 0);
    cb = util_create_texture2d(ctx->screen, 256, 256,
                               PIPE_FORMAT_R8G8B8A8_UNORM);
    util_set_common_states_and_clear(cso, ctx, cb);
@@ -406,7 +406,7 @@ null_constant_buffer(struct pipe_context *ctx)
    bool pass = true;
    static const float zero[] = {0, 0, 0, 0};
 
-   cso = cso_create_context(ctx);
+   cso = cso_create_context(ctx, 0);
    cb = util_create_texture2d(ctx->screen, 256, 256,
                               PIPE_FORMAT_R8G8B8A8_UNORM);
    util_set_common_states_and_clear(cso, ctx, cb);
@@ -462,7 +462,7 @@ null_fragment_shader(struct pipe_context *ctx)
    struct pipe_query *query;
    union pipe_query_result qresult;
 
-   cso = cso_create_context(ctx);
+   cso = cso_create_context(ctx, 0);
    cb = util_create_texture2d(ctx->screen, 256, 256,
                               PIPE_FORMAT_R8G8B8A8_UNORM);
    util_set_common_states_and_clear(cso, ctx, cb);
index c26a923c7f3cc9f60b93e0ebdfc81298881cc8a7..f040f4a882d287e432bb75c519d7b41b38ccc8f3 100644 (file)
@@ -255,7 +255,8 @@ 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)
+boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
+                        unsigned flags)
 {
    unsigned i;
    boolean fallback = FALSE;
@@ -293,7 +294,7 @@ boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps)
    if (!caps->buffer_offset_unaligned ||
        !caps->buffer_stride_unaligned ||
        !caps->velem_src_offset_unaligned ||
-       !caps->user_vertex_buffers) {
+       (!(flags & U_VBUF_FLAG_NO_USER_VBOS) && !caps->user_vertex_buffers)) {
       fallback = TRUE;
    }
 
index 9e8b135fb79f4b6ac571f117963a585eb07c4ad1..ddfa844d27f2e28e07f5db5e3d009432b28b5a23 100644 (file)
@@ -40,6 +40,8 @@
 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];
@@ -55,7 +57,8 @@ struct u_vbuf_caps {
 };
 
 
-boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps);
+boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
+                        unsigned flags);
 
 struct u_vbuf *
 u_vbuf_create(struct pipe_context *pipe,
index 92bc72ce28d656ba8ab54bac2a0315bf0297b912..b9b7a637d703ff8664f1995f8b94f77abfe1818b 100644 (file)
@@ -199,9 +199,9 @@ NineDevice9_ctor( struct NineDevice9 *This,
     This->pipe_sw = This->screen_sw->context_create(This->screen_sw, NULL, 0);
     if (!This->pipe_sw) { return E_OUTOFMEMORY; }
 
-    This->context.cso = cso_create_context(This->context.pipe);
+    This->context.cso = cso_create_context(This->context.pipe, 0);
     if (!This->context.cso) { return E_OUTOFMEMORY; } /* also a guess */
-    This->cso_sw = cso_create_context(This->pipe_sw);
+    This->cso_sw = cso_create_context(This->pipe_sw, 0);
     if (!This->cso_sw) { return E_OUTOFMEMORY; }
 
     /* Create first, it messes up our state. */
index 715b48d7c84bf159002b44b2340c9f9987685c8e..1f4717056a9a2c31bdc593ea20fbf8486d84463f 100644 (file)
@@ -57,7 +57,7 @@ xa_context_create(struct xa_tracker *xa)
 
     ctx->xa = xa;
     ctx->pipe = xa->screen->context_create(xa->screen, NULL, 0);
-    ctx->cso = cso_create_context(ctx->pipe);
+    ctx->cso = cso_create_context(ctx->pipe, 0);
     ctx->shaders = xa_shaders_create(ctx);
     renderer_init_state(ctx);
 
index c72c5fe2391a00024a79b8a3e4e71627de425457..6e9957aac9c2f1ba7d59f97a18bd0cea18dd314c 100644 (file)
@@ -101,7 +101,7 @@ static void init_prog(struct program *p)
 
        /* create the pipe driver context and cso context */
        p->pipe = p->screen->context_create(p->screen, NULL, 0);
-       p->cso = cso_create_context(p->pipe);
+       p->cso = cso_create_context(p->pipe, 0);
 
        /* set clear color */
        p->clear_color.f[0] = 0.3;
index 914f5e75fa9f84a955de7bfd927bbdc0356533b6..a2031696f029a7dd5324bcae4bdfec37e3c88b2c 100644 (file)
@@ -96,7 +96,7 @@ static void init_prog(struct program *p)
 
        /* create the pipe driver context and cso context */
        p->pipe = p->screen->context_create(p->screen, NULL, 0);
-       p->cso = cso_create_context(p->pipe);
+       p->cso = cso_create_context(p->pipe, 0);
 
        /* set clear color */
        p->clear_color.f[0] = 0.3;
index 3d0455f93263b29c7643690ebce6cae4faab1bd8..4b9d913f6392dbb8476314bdc89d6dfe55a96a2c 100644 (file)
@@ -342,7 +342,7 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
    st->has_user_constbuf =
       screen->get_param(screen, PIPE_CAP_USER_CONSTANT_BUFFERS);
 
-   st->cso_context = cso_create_context(pipe);
+   st->cso_context = cso_create_context(pipe, 0);
 
    st_init_atoms( st );
    st_init_clear(st);