freedreno/ir3: Pass stream output info to ir3_shader_from_nir
authorKristian H. Kristensen <hoegsberg@google.com>
Fri, 1 May 2020 06:24:27 +0000 (23:24 -0700)
committerMarge Bot <eric+marge@anholt.net>
Fri, 1 May 2020 16:26:31 +0000 (16:26 +0000)
We need shader->stream_output filled out when we layout the push
constants in ir3_setup_const_state(). Otherwise
const_state->offsets.tfbo ends up as ~0, which doesn't work.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4562>

src/freedreno/ir3/ir3_shader.c
src/freedreno/ir3/ir3_shader.h
src/gallium/drivers/freedreno/ir3/ir3_gallium.c

index 8d768e21c3054a3ff8e2b39effb4d2ff5cd3c98e..420d4ea492a23a25d9a234ac493707890c1bec6b 100644 (file)
@@ -290,7 +290,8 @@ ir3_shader_destroy(struct ir3_shader *shader)
 }
 
 struct ir3_shader *
-ir3_shader_from_nir(struct ir3_compiler *compiler, nir_shader *nir)
+ir3_shader_from_nir(struct ir3_compiler *compiler, nir_shader *nir,
+               struct ir3_stream_output_info *stream_output)
 {
        struct ir3_shader *shader = CALLOC_STRUCT(ir3_shader);
 
@@ -298,6 +299,8 @@ ir3_shader_from_nir(struct ir3_compiler *compiler, nir_shader *nir)
        shader->compiler = compiler;
        shader->id = p_atomic_inc_return(&shader->compiler->shader_count);
        shader->type = nir->info.stage;
+       if (stream_output)
+               memcpy(&shader->stream_output, stream_output, sizeof(shader->stream_output));
 
        NIR_PASS_V(nir, nir_lower_io, nir_var_all, ir3_glsl_type_size,
                           (nir_lower_io_options)0);
index a3b8f917af668eab2443cc71ee4ad022a64d2523..2a9d796224893542daa1cafd3b0bf985decc5270 100644 (file)
@@ -662,7 +662,8 @@ struct ir3_shader {
 void * ir3_shader_assemble(struct ir3_shader_variant *v, uint32_t gpu_id);
 struct ir3_shader_variant * ir3_shader_get_variant(struct ir3_shader *shader,
                struct ir3_shader_key *key, bool binning_pass, bool *created);
-struct ir3_shader * ir3_shader_from_nir(struct ir3_compiler *compiler, nir_shader *nir);
+struct ir3_shader * ir3_shader_from_nir(struct ir3_compiler *compiler, nir_shader *nir,
+               struct ir3_stream_output_info *stream_output);
 void ir3_shader_destroy(struct ir3_shader *shader);
 void ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin, FILE *out);
 uint64_t ir3_shader_outputs(const struct ir3_shader *so);
index 8b8a403b5f4bf8213809730ff04af0117a5cab5a..b52328e2f069d7e384462cd5140572ed08cee7b5 100644 (file)
@@ -131,9 +131,10 @@ ir3_shader_create(struct ir3_compiler *compiler,
                nir = tgsi_to_nir(cso->tokens, screen);
        }
 
-       struct ir3_shader *shader = ir3_shader_from_nir(compiler, nir);
+       struct ir3_stream_output_info stream_output;
+       copy_stream_out(&stream_output, &cso->stream_output);
 
-       copy_stream_out(&shader->stream_output, &cso->stream_output);
+       struct ir3_shader *shader = ir3_shader_from_nir(compiler, nir, &stream_output);
 
        if (fd_mesa_debug & FD_DBG_SHADERDB) {
                /* if shader-db run, create a standard variant immediately
@@ -171,7 +172,7 @@ ir3_shader_create_compute(struct ir3_compiler *compiler,
                nir = tgsi_to_nir(cso->prog, screen);
        }
 
-       struct ir3_shader *shader = ir3_shader_from_nir(compiler, nir);
+       struct ir3_shader *shader = ir3_shader_from_nir(compiler, nir, NULL);
 
        if (fd_mesa_debug & FD_DBG_SHADERDB) {
                /* if shader-db run, create a standard variant immediately