gallium: let state trackers tell u_vbuf whether user VBOs are possible
This can affect whether u_vbuf will be enabled or not. Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
0561b3c75a
commit
e0f95ddd3e
|
@ -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;
|
struct u_vbuf_caps caps;
|
||||||
|
|
||||||
/* Install u_vbuf if there is anything unsupported. */
|
/* 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->vbuf = u_vbuf_create(cso->pipe, &caps,
|
||||||
cso->aux_vertex_buffer_index);
|
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);
|
struct cso_context *ctx = CALLOC_STRUCT(cso_context);
|
||||||
if (!ctx)
|
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 */
|
ctx->aux_vertex_buffer_index = 0; /* 0 for now */
|
||||||
|
|
||||||
cso_init_vbuf(ctx);
|
cso_init_vbuf(ctx, u_vbuf_flags);
|
||||||
|
|
||||||
/* Enable for testing: */
|
/* Enable for testing: */
|
||||||
if (0) cso_set_maximum_cache_size( ctx->cache, 4 );
|
if (0) cso_set_maximum_cache_size( ctx->cache, 4 );
|
||||||
|
|
|
@ -41,7 +41,8 @@ extern "C" {
|
||||||
struct cso_context;
|
struct cso_context;
|
||||||
struct u_vbuf;
|
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 );
|
void cso_destroy_context( struct cso_context *cso );
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -304,7 +304,7 @@ tgsi_vs_window_space_position(struct pipe_context *ctx)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
cso = cso_create_context(ctx);
|
cso = cso_create_context(ctx, 0);
|
||||||
cb = util_create_texture2d(ctx->screen, 256, 256,
|
cb = util_create_texture2d(ctx->screen, 256, 256,
|
||||||
PIPE_FORMAT_R8G8B8A8_UNORM);
|
PIPE_FORMAT_R8G8B8A8_UNORM);
|
||||||
util_set_common_states_and_clear(cso, ctx, cb);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
cso = cso_create_context(ctx);
|
cso = cso_create_context(ctx, 0);
|
||||||
cb = util_create_texture2d(ctx->screen, 256, 256,
|
cb = util_create_texture2d(ctx->screen, 256, 256,
|
||||||
PIPE_FORMAT_R8G8B8A8_UNORM);
|
PIPE_FORMAT_R8G8B8A8_UNORM);
|
||||||
util_set_common_states_and_clear(cso, ctx, cb);
|
util_set_common_states_and_clear(cso, ctx, cb);
|
||||||
|
@ -406,7 +406,7 @@ null_constant_buffer(struct pipe_context *ctx)
|
||||||
bool pass = true;
|
bool pass = true;
|
||||||
static const float zero[] = {0, 0, 0, 0};
|
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,
|
cb = util_create_texture2d(ctx->screen, 256, 256,
|
||||||
PIPE_FORMAT_R8G8B8A8_UNORM);
|
PIPE_FORMAT_R8G8B8A8_UNORM);
|
||||||
util_set_common_states_and_clear(cso, ctx, cb);
|
util_set_common_states_and_clear(cso, ctx, cb);
|
||||||
|
@ -462,7 +462,7 @@ null_fragment_shader(struct pipe_context *ctx)
|
||||||
struct pipe_query *query;
|
struct pipe_query *query;
|
||||||
union pipe_query_result qresult;
|
union pipe_query_result qresult;
|
||||||
|
|
||||||
cso = cso_create_context(ctx);
|
cso = cso_create_context(ctx, 0);
|
||||||
cb = util_create_texture2d(ctx->screen, 256, 256,
|
cb = util_create_texture2d(ctx->screen, 256, 256,
|
||||||
PIPE_FORMAT_R8G8B8A8_UNORM);
|
PIPE_FORMAT_R8G8B8A8_UNORM);
|
||||||
util_set_common_states_and_clear(cso, ctx, cb);
|
util_set_common_states_and_clear(cso, ctx, cb);
|
||||||
|
|
|
@ -255,7 +255,8 @@ static const struct {
|
||||||
{ PIPE_FORMAT_R8G8B8A8_SSCALED, PIPE_FORMAT_R32G32B32A32_FLOAT },
|
{ 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;
|
unsigned i;
|
||||||
boolean fallback = FALSE;
|
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 ||
|
if (!caps->buffer_offset_unaligned ||
|
||||||
!caps->buffer_stride_unaligned ||
|
!caps->buffer_stride_unaligned ||
|
||||||
!caps->velem_src_offset_unaligned ||
|
!caps->velem_src_offset_unaligned ||
|
||||||
!caps->user_vertex_buffers) {
|
(!(flags & U_VBUF_FLAG_NO_USER_VBOS) && !caps->user_vertex_buffers)) {
|
||||||
fallback = TRUE;
|
fallback = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,8 @@
|
||||||
struct cso_context;
|
struct cso_context;
|
||||||
struct u_vbuf;
|
struct u_vbuf;
|
||||||
|
|
||||||
|
#define U_VBUF_FLAG_NO_USER_VBOS (1 << 0)
|
||||||
|
|
||||||
/* Hardware vertex fetcher limitations can be described by this structure. */
|
/* Hardware vertex fetcher limitations can be described by this structure. */
|
||||||
struct u_vbuf_caps {
|
struct u_vbuf_caps {
|
||||||
enum pipe_format format_translation[PIPE_FORMAT_COUNT];
|
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 *
|
struct u_vbuf *
|
||||||
u_vbuf_create(struct pipe_context *pipe,
|
u_vbuf_create(struct pipe_context *pipe,
|
||||||
|
|
|
@ -199,9 +199,9 @@ NineDevice9_ctor( struct NineDevice9 *This,
|
||||||
This->pipe_sw = This->screen_sw->context_create(This->screen_sw, NULL, 0);
|
This->pipe_sw = This->screen_sw->context_create(This->screen_sw, NULL, 0);
|
||||||
if (!This->pipe_sw) { return E_OUTOFMEMORY; }
|
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 */
|
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; }
|
if (!This->cso_sw) { return E_OUTOFMEMORY; }
|
||||||
|
|
||||||
/* Create first, it messes up our state. */
|
/* Create first, it messes up our state. */
|
||||||
|
|
|
@ -57,7 +57,7 @@ xa_context_create(struct xa_tracker *xa)
|
||||||
|
|
||||||
ctx->xa = xa;
|
ctx->xa = xa;
|
||||||
ctx->pipe = xa->screen->context_create(xa->screen, NULL, 0);
|
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);
|
ctx->shaders = xa_shaders_create(ctx);
|
||||||
renderer_init_state(ctx);
|
renderer_init_state(ctx);
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,7 @@ static void init_prog(struct program *p)
|
||||||
|
|
||||||
/* create the pipe driver context and cso context */
|
/* create the pipe driver context and cso context */
|
||||||
p->pipe = p->screen->context_create(p->screen, NULL, 0);
|
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 */
|
/* set clear color */
|
||||||
p->clear_color.f[0] = 0.3;
|
p->clear_color.f[0] = 0.3;
|
||||||
|
|
|
@ -96,7 +96,7 @@ static void init_prog(struct program *p)
|
||||||
|
|
||||||
/* create the pipe driver context and cso context */
|
/* create the pipe driver context and cso context */
|
||||||
p->pipe = p->screen->context_create(p->screen, NULL, 0);
|
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 */
|
/* set clear color */
|
||||||
p->clear_color.f[0] = 0.3;
|
p->clear_color.f[0] = 0.3;
|
||||||
|
|
|
@ -342,7 +342,7 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
|
||||||
st->has_user_constbuf =
|
st->has_user_constbuf =
|
||||||
screen->get_param(screen, PIPE_CAP_USER_CONSTANT_BUFFERS);
|
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_atoms( st );
|
||||||
st_init_clear(st);
|
st_init_clear(st);
|
||||||
|
|
Loading…
Reference in New Issue