radeonsi: don't pass si_shader to si_compile_llvm
[mesa.git] / src / gallium / drivers / radeonsi / si_compute.c
index ed9147cc91e911d878b0e13329e264d1096625f2..3562bd846e7d194d1a4c07f341ecc9703b57c218 100644 (file)
 
 #define MAX_GLOBAL_BUFFERS 20
 
-/* XXX: Even though we don't pass the scratch buffer via user sgprs any more
- * LLVM still expects that we specify 4 USER_SGPRS so it can remain compatible
- * with older mesa. */
-#define NUM_USER_SGPRS 4
-
 struct si_compute {
        struct si_context *ctx;
 
@@ -72,16 +67,16 @@ static void init_scratch_buffer(struct si_context *sctx, struct si_compute *prog
                                program->shader.binary.global_symbol_offsets[i];
                unsigned scratch_bytes_needed;
 
-               si_shader_binary_read_config(sctx->screen,
-                                               &program->shader, offset);
-               scratch_bytes_needed = program->shader.scratch_bytes_per_wave;
+               si_shader_binary_read_config(&program->shader.binary,
+                                            &program->shader.config, offset);
+               scratch_bytes_needed = program->shader.config.scratch_bytes_per_wave;
                scratch_bytes = MAX2(scratch_bytes, scratch_bytes_needed);
        }
 
        if (scratch_bytes == 0)
                return;
 
-       program->shader.scratch_bo = (struct r600_resource*)
+       program->shader.scratch_bo =
                                si_resource_create_custom(sctx->b.b.screen,
                                PIPE_USAGE_DEFAULT,
                                scratch_bytes * scratch_waves);
@@ -92,7 +87,7 @@ static void init_scratch_buffer(struct si_context *sctx, struct si_compute *prog
         * to the maximum bytes needed, so it can compute the stride
         * correctly.
         */
-       program->shader.scratch_bytes_per_wave = scratch_bytes;
+       program->shader.config.scratch_bytes_per_wave = scratch_bytes;
 
        /* Patch the shader with the scratch buffer address. */
        si_shader_apply_scratch_relocs(sctx,
@@ -127,8 +122,10 @@ static void *si_create_compute_state(
                for (i = 0; i < program->num_kernels; i++) {
                        LLVMModuleRef mod = radeon_llvm_get_kernel_module(program->llvm_ctx, i,
                                                         code, header->num_bytes);
-                       si_compile_llvm(sctx->screen, &program->kernels[i], sctx->tm,
-                                       mod);
+                       si_compile_llvm(sctx->screen, &program->kernels[i].binary,
+                                       &program->kernels[i].config, sctx->tm,
+                                       mod, &sctx->b.debug, TGSI_PROCESSOR_COMPUTE);
+                       si_shader_binary_upload(sctx->screen, &program->kernels[i]);
                        LLVMDisposeModule(mod);
                }
        }
@@ -141,7 +138,10 @@ static void *si_create_compute_state(
         * the shader code to the GPU.
         */
        init_scratch_buffer(sctx, program);
-       si_shader_binary_read(sctx->screen, &program->shader);
+       si_shader_binary_read(sctx->screen, &program->shader.binary,
+                             &program->shader.config, &sctx->b.debug,
+                             TGSI_PROCESSOR_COMPUTE);
+       si_shader_binary_upload(sctx->screen, &program->shader);
 
 #endif
        program->input_buffer = si_resource_create_custom(sctx->b.b.screen,
@@ -227,7 +227,7 @@ static void si_launch_grid(
                uint32_t pc, const void *input)
 {
        struct si_context *sctx = (struct si_context*)ctx;
-       struct radeon_winsys_cs *cs = sctx->b.rings.gfx.cs;
+       struct radeon_winsys_cs *cs = sctx->b.gfx.cs;
        struct si_compute *program = sctx->cs_shader_state.program;
        struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
        struct r600_resource *input_buffer = program->input_buffer;
@@ -238,7 +238,6 @@ static void si_launch_grid(
        uint64_t kernel_args_va;
        uint64_t scratch_buffer_va = 0;
        uint64_t shader_va;
-       unsigned arg_user_sgpr_count = NUM_USER_SGPRS;
        unsigned i;
        struct si_shader *shader = &program->shader;
        unsigned lds_blocks;
@@ -253,10 +252,10 @@ static void si_launch_grid(
        radeon_emit(cs, 0x80000000);
        radeon_emit(cs, 0x80000000);
 
-       sctx->b.flags |= SI_CONTEXT_INV_TC_L1 |
-                        SI_CONTEXT_INV_TC_L2 |
+       sctx->b.flags |= SI_CONTEXT_INV_VMEM_L1 |
+                        SI_CONTEXT_INV_GLOBAL_L2 |
                         SI_CONTEXT_INV_ICACHE |
-                        SI_CONTEXT_INV_KCACHE |
+                        SI_CONTEXT_INV_SMEM_L1 |
                         SI_CONTEXT_FLUSH_WITH_INV_L2 |
                         SI_CONTEXT_FLAG_COMPUTE;
        si_emit_cache_flush(sctx, NULL);
@@ -265,7 +264,7 @@ static void si_launch_grid(
 
 #if HAVE_LLVM >= 0x0306
        /* Read the config information */
-       si_shader_binary_read_config(sctx->screen, shader, pc);
+       si_shader_binary_read_config(&shader->binary, &shader->config, pc);
 #endif
 
        /* Upload the kernel arguments */
@@ -273,8 +272,8 @@ static void si_launch_grid(
        /* The extra num_work_size_bytes are for work group / work item size information */
        kernel_args_size = program->input_size + num_work_size_bytes + 8 /* For scratch va */;
 
-       kernel_args = sctx->b.ws->buffer_map(input_buffer->cs_buf,
-                       sctx->b.rings.gfx.cs, PIPE_TRANSFER_WRITE);
+       kernel_args = sctx->b.ws->buffer_map(input_buffer->buf,
+                       sctx->b.gfx.cs, PIPE_TRANSFER_WRITE);
        for (i = 0; i < 3; i++) {
                kernel_args[i] = grid_layout[i];
                kernel_args[i + 3] = grid_layout[i] * block_layout[i];
@@ -286,17 +285,18 @@ static void si_launch_grid(
 
        memcpy(kernel_args + (num_work_size_bytes / 4), input, program->input_size);
 
-       if (shader->scratch_bytes_per_wave > 0) {
+       if (shader->config.scratch_bytes_per_wave > 0) {
 
                COMPUTE_DBG(sctx->screen, "Waves: %u; Scratch per wave: %u bytes; "
                            "Total Scratch: %u bytes\n", num_waves_for_scratch,
-                           shader->scratch_bytes_per_wave,
-                           shader->scratch_bytes_per_wave *
+                           shader->config.scratch_bytes_per_wave,
+                           shader->config.scratch_bytes_per_wave *
                            num_waves_for_scratch);
 
-               si_pm4_add_bo(pm4, shader->scratch_bo,
-                               RADEON_USAGE_READWRITE,
-                               RADEON_PRIO_SHADER_RESOURCE_RW);
+               radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx,
+                                         shader->scratch_bo,
+                                         RADEON_USAGE_READWRITE,
+                                         RADEON_PRIO_SCRATCH_BUFFER);
 
                scratch_buffer_va = shader->scratch_bo->gpu_address;
        }
@@ -309,15 +309,15 @@ static void si_launch_grid(
        kernel_args_va = input_buffer->gpu_address;
        kernel_args_va += kernel_args_offset;
 
-       si_pm4_add_bo(pm4, input_buffer, RADEON_USAGE_READ,
-               RADEON_PRIO_SHADER_DATA);
+       radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx, input_buffer,
+                                 RADEON_USAGE_READ, RADEON_PRIO_CONST_BUFFER);
 
        si_pm4_set_reg(pm4, R_00B900_COMPUTE_USER_DATA_0, kernel_args_va);
        si_pm4_set_reg(pm4, R_00B900_COMPUTE_USER_DATA_0 + 4, S_008F04_BASE_ADDRESS_HI (kernel_args_va >> 32) | S_008F04_STRIDE(0));
        si_pm4_set_reg(pm4, R_00B900_COMPUTE_USER_DATA_0 + 8, scratch_buffer_va);
        si_pm4_set_reg(pm4, R_00B900_COMPUTE_USER_DATA_0 + 12,
                S_008F04_BASE_ADDRESS_HI(scratch_buffer_va >> 32)
-               |  S_008F04_STRIDE(shader->scratch_bytes_per_wave / 64));
+               |  S_008F04_STRIDE(shader->config.scratch_bytes_per_wave / 64));
 
        si_pm4_set_reg(pm4, R_00B810_COMPUTE_START_X, 0);
        si_pm4_set_reg(pm4, R_00B814_COMPUTE_START_Y, 0);
@@ -337,7 +337,9 @@ static void si_launch_grid(
                if (!buffer) {
                        continue;
                }
-               si_pm4_add_bo(pm4, buffer, RADEON_USAGE_READWRITE, RADEON_PRIO_SHADER_RESOURCE_RW);
+               radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx, buffer,
+                                         RADEON_USAGE_READWRITE,
+                                         RADEON_PRIO_COMPUTE_GLOBAL);
        }
 
        /* This register has been moved to R_00CD20_COMPUTE_MAX_WAVE_ID
@@ -358,26 +360,14 @@ static void si_launch_grid(
 #if HAVE_LLVM >= 0x0306
        shader_va += pc;
 #endif
-       si_pm4_add_bo(pm4, shader->bo, RADEON_USAGE_READ, RADEON_PRIO_SHADER_DATA);
+       radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx, shader->bo,
+                                 RADEON_USAGE_READ, RADEON_PRIO_USER_SHADER);
        si_pm4_set_reg(pm4, R_00B830_COMPUTE_PGM_LO, shader_va >> 8);
        si_pm4_set_reg(pm4, R_00B834_COMPUTE_PGM_HI, shader_va >> 40);
 
-       si_pm4_set_reg(pm4, R_00B848_COMPUTE_PGM_RSRC1,
-               /* We always use at least 3 VGPRS, these come from
-                * TIDIG_COMP_CNT.
-                * XXX: The compiler should account for this.
-                */
-               S_00B848_VGPRS((MAX2(3, shader->num_vgprs) - 1) / 4)
-               /* We always use at least 4 + arg_user_sgpr_count.  The 4 extra
-                * sgprs are from TGID_X_EN, TGID_Y_EN, TGID_Z_EN, TG_SIZE_EN
-                * XXX: The compiler should account for this.
-                */
-               |  S_00B848_SGPRS(((MAX2(4 + arg_user_sgpr_count,
-                                       shader->num_sgprs)) - 1) / 8)
-               |  S_00B028_FLOAT_MODE(shader->float_mode))
-               ;
+       si_pm4_set_reg(pm4, R_00B848_COMPUTE_PGM_RSRC1, shader->config.rsrc1);
 
-       lds_blocks = shader->lds_size;
+       lds_blocks = shader->config.lds_size;
        /* XXX: We are over allocating LDS.  For SI, the shader reports LDS in
         * blocks of 256 bytes, so if there are 4 bytes lds allocated in
         * the shader and 4 bytes allocated by the state tracker, then
@@ -391,17 +381,10 @@ static void si_launch_grid(
 
        assert(lds_blocks <= 0xFF);
 
-       si_pm4_set_reg(pm4, R_00B84C_COMPUTE_PGM_RSRC2,
-               S_00B84C_SCRATCH_EN(shader->scratch_bytes_per_wave > 0)
-               | S_00B84C_USER_SGPR(arg_user_sgpr_count)
-               | S_00B84C_TGID_X_EN(1)
-               | S_00B84C_TGID_Y_EN(1)
-               | S_00B84C_TGID_Z_EN(1)
-               | S_00B84C_TG_SIZE_EN(1)
-               | S_00B84C_TIDIG_COMP_CNT(2)
-               | S_00B84C_LDS_SIZE(lds_blocks)
-               | S_00B84C_EXCP_EN(0))
-               ;
+       shader->config.rsrc2 &= C_00B84C_LDS_SIZE;
+       shader->config.rsrc2 |=  S_00B84C_LDS_SIZE(lds_blocks);
+
+       si_pm4_set_reg(pm4, R_00B84C_COMPUTE_PGM_RSRC2, shader->config.rsrc2);
        si_pm4_set_reg(pm4, R_00B854_COMPUTE_RESOURCE_LIMITS, 0);
 
        si_pm4_set_reg(pm4, R_00B858_COMPUTE_STATIC_THREAD_MGMT_SE0,
@@ -423,7 +406,7 @@ static void si_launch_grid(
                 * COMPUTE_PGM_RSRC2.SCRATCH_EN is enabled.
                 */
                S_00B860_WAVES(num_waves_for_scratch)
-               | S_00B860_WAVESIZE(shader->scratch_bytes_per_wave >> 10))
+               | S_00B860_WAVESIZE(shader->config.scratch_bytes_per_wave >> 10))
                ;
 
        si_pm4_cmd_begin(pm4, PKT3_DISPATCH_DIRECT);
@@ -445,10 +428,10 @@ static void si_launch_grid(
        si_pm4_free_state(sctx, pm4, ~0);
 
        sctx->b.flags |= SI_CONTEXT_CS_PARTIAL_FLUSH |
-                        SI_CONTEXT_INV_TC_L1 |
-                        SI_CONTEXT_INV_TC_L2 |
+                        SI_CONTEXT_INV_VMEM_L1 |
+                        SI_CONTEXT_INV_GLOBAL_L2 |
                         SI_CONTEXT_INV_ICACHE |
-                        SI_CONTEXT_INV_KCACHE |
+                        SI_CONTEXT_INV_SMEM_L1 |
                         SI_CONTEXT_FLAG_COMPUTE;
        si_emit_cache_flush(sctx, NULL);
 }
@@ -465,7 +448,7 @@ static void si_delete_compute_state(struct pipe_context *ctx, void* state){
        if (program->kernels) {
                for (int i = 0; i < program->num_kernels; i++){
                        if (program->kernels[i].bo){
-                               si_shader_destroy(ctx, &program->kernels[i]);
+                               si_shader_destroy(&program->kernels[i]);
                        }
                }
                FREE(program->kernels);
@@ -478,7 +461,7 @@ static void si_delete_compute_state(struct pipe_context *ctx, void* state){
        FREE(program->shader.binary.config);
        FREE(program->shader.binary.rodata);
        FREE(program->shader.binary.global_symbol_offsets);
-       si_shader_destroy(ctx, &program->shader);
+       si_shader_destroy(&program->shader);
 #endif
 
        pipe_resource_reference(