panfrost: Separate postfix from emits
[mesa.git] / src / gallium / drivers / panfrost / pan_context.c
index 3002e551f6b83c2e34bed01be3544c489c2c10db..5f39613114a6052808bc024724dbee6365f02785 100644 (file)
@@ -325,15 +325,16 @@ panfrost_draw_vbo(
                                          ctx->instance_count,
                                          &vertex_postfix, &tiler_postfix,
                                          &primitive_size);
-        panfrost_emit_shader_meta(batch, PIPE_SHADER_VERTEX, &vertex_postfix);
-        panfrost_emit_shader_meta(batch, PIPE_SHADER_FRAGMENT, &tiler_postfix);
-        panfrost_emit_sampler_descriptors(batch, PIPE_SHADER_VERTEX, &vertex_postfix);
-        panfrost_emit_sampler_descriptors(batch, PIPE_SHADER_FRAGMENT, &tiler_postfix);
-        panfrost_emit_texture_descriptors(batch, PIPE_SHADER_VERTEX, &vertex_postfix);
-        panfrost_emit_texture_descriptors(batch, PIPE_SHADER_FRAGMENT, &tiler_postfix);
+        vertex_postfix.sampler_descriptor = panfrost_emit_sampler_descriptors(batch, PIPE_SHADER_VERTEX);
+        tiler_postfix.sampler_descriptor = panfrost_emit_sampler_descriptors(batch, PIPE_SHADER_FRAGMENT);
+        vertex_postfix.textures = panfrost_emit_texture_descriptors(batch, PIPE_SHADER_VERTEX);
+        tiler_postfix.textures = panfrost_emit_texture_descriptors(batch, PIPE_SHADER_FRAGMENT);
         panfrost_emit_const_buf(batch, PIPE_SHADER_VERTEX, &vertex_postfix);
         panfrost_emit_const_buf(batch, PIPE_SHADER_FRAGMENT, &tiler_postfix);
-        panfrost_emit_viewport(batch, &tiler_postfix);
+        tiler_postfix.viewport = panfrost_emit_viewport(batch);
+
+        vertex_postfix.shader = panfrost_emit_compute_shader_meta(batch, PIPE_SHADER_VERTEX);
+        tiler_postfix.shader = panfrost_emit_frag_shader_meta(batch);
 
         panfrost_vt_update_primitive_size(ctx, &tiler_prefix, &primitive_size);
 
@@ -486,10 +487,15 @@ panfrost_delete_shader_state(
         for (unsigned i = 0; i < cso->variant_count; ++i) {
                 struct panfrost_shader_state *shader_state = &cso->variants[i];
                 panfrost_bo_unreference(shader_state->bo);
+
+                if (shader_state->upload.rsrc)
+                        pipe_resource_reference(&shader_state->upload.rsrc, NULL);
+
                 shader_state->bo = NULL;
         }
         free(cso->variants);
 
+
         free(so);
 }
 
@@ -1046,14 +1052,15 @@ panfrost_create_depth_stencil_state(struct pipe_context *pipe,
         so->base = *zsa;
 
         pan_pipe_to_stencil(&zsa->stencil[0], &so->stencil_front);
-        pan_pipe_to_stencil(&zsa->stencil[1], &so->stencil_back);
-
         so->stencil_mask_front = zsa->stencil[0].writemask;
 
-        if (zsa->stencil[1].enabled)
+        if (zsa->stencil[1].enabled) {
+                pan_pipe_to_stencil(&zsa->stencil[1], &so->stencil_back);
                 so->stencil_mask_back = zsa->stencil[1].writemask;
-        else
+        } else {
+                so->stencil_back = so->stencil_front;
                 so->stencil_mask_back = so->stencil_mask_front;
+        }
 
         /* Alpha lowered by frontend */
         assert(!zsa->alpha.enabled);