summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <[email protected]>2019-07-12 16:35:47 -0700
committerAlyssa Rosenzweig <[email protected]>2019-07-15 08:03:34 -0700
commitd375d127a9e1a68d5290177b82728510e5cc5a61 (patch)
tree2ec78bd7547db21509ea4b39d03a236572052acb
parentc6b59db5b43fd78beb3b371a7db6738acc2bcddd (diff)
panfrost: Upload vertex descriptors to *transient* memory
It's not legal to reuse the vertex shader descriptor across frames now that we patch it at draw-time, so upload to transient memory. Ideally, we could be smarter about this such that subsequent draws with the same vertex shader and same patched state would reuse the descriptor, but for now, let's simply achieve correctness. Signed-off-by: Alyssa Rosenzweig <[email protected]>
-rw-r--r--src/gallium/drivers/panfrost/pan_context.c30
-rw-r--r--src/gallium/drivers/panfrost/pan_context.h1
2 files changed, 20 insertions, 11 deletions
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index 4bbf5230c6c..7171841693c 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -972,7 +972,8 @@ static mali_ptr
panfrost_patch_shader_state(
struct panfrost_context *ctx,
struct panfrost_shader_state *ss,
- enum pipe_shader_type stage)
+ enum pipe_shader_type stage,
+ bool should_upload)
{
ss->tripipe->texture_count = ctx->sampler_view_count[stage];
ss->tripipe->sampler_count = ctx->sampler_count[stage];
@@ -982,7 +983,18 @@ panfrost_patch_shader_state(
unsigned ubo_count = panfrost_ubo_count(ctx, stage);
ss->tripipe->midgard1.uniform_buffer_count = ubo_count;
- return ss->tripipe_gpu;
+ /* We can't reuse over frames; that's not safe. The descriptor must be
+ * transient uploaded */
+
+ if (should_upload) {
+ return panfrost_upload_transient(ctx,
+ ss->tripipe,
+ sizeof(struct mali_shader_meta));
+ }
+
+ /* If we don't need an upload, don't bother */
+ return 0;
+
}
/* Go through dirty flags and actualise them in the cmdstream. */
@@ -1019,13 +1031,16 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
ctx->payload_tiler.postfix.occlusion_counter = ctx->occlusion_query->transfer.gpu;
}
+ /* TODO: Does it make sense to dirty track VS? We need the transient
+ * uploads */
+ ctx->dirty |= PAN_DIRTY_VS;
if (ctx->dirty & PAN_DIRTY_VS) {
assert(ctx->vs);
struct panfrost_shader_state *vs = &ctx->vs->variants[ctx->vs->active_variant];
ctx->payload_vertex.postfix._shader_upper =
- panfrost_patch_shader_state(ctx, vs, PIPE_SHADER_VERTEX) >> 4;
+ panfrost_patch_shader_state(ctx, vs, PIPE_SHADER_VERTEX, true) >> 4;
}
if (ctx->dirty & (PAN_DIRTY_RASTERIZER | PAN_DIRTY_VS)) {
@@ -1047,7 +1062,7 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
assert(ctx->fs);
struct panfrost_shader_state *variant = &ctx->fs->variants[ctx->fs->active_variant];
- panfrost_patch_shader_state(ctx, variant, PIPE_SHADER_FRAGMENT);
+ panfrost_patch_shader_state(ctx, variant, PIPE_SHADER_FRAGMENT, false);
#define COPY(name) ctx->fragment_shader_core.name = variant->tripipe->name
@@ -2066,12 +2081,7 @@ panfrost_bind_shader_state(
}
}
- /* Allocate the mapped descriptor ahead-of-time. */
- struct panfrost_context *ctx = pan_context(pctx);
- struct panfrost_transfer transfer = panfrost_allocate_chunk(ctx, sizeof(struct mali_shader_meta), HEAP_DESCRIPTOR);
-
- variants->variants[variant].tripipe = (struct mali_shader_meta *) transfer.cpu;
- variants->variants[variant].tripipe_gpu = transfer.gpu;
+ variants->variants[variant].tripipe = malloc(sizeof(struct mali_shader_meta));
}
diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
index cd9a034975d..111edc934c9 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -216,7 +216,6 @@ struct panfrost_shader_state {
/* Compiled, mapped descriptor, ready for the hardware */
bool compiled;
struct mali_shader_meta *tripipe;
- mali_ptr tripipe_gpu;
/* Non-descript information */
int uniform_count;