OSDN Git Service

radv: Set correct registers for merged shader rings.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Mon, 16 Oct 2017 21:57:46 +0000 (23:57 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Thu, 19 Oct 2017 20:25:39 +0000 (22:25 +0200)
We need different regs to end up in s0/s1.

Reviewed-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_device.c

index b9cd676..7f306db 100644 (file)
@@ -1580,19 +1580,31 @@ radv_get_preamble_cs(struct radv_queue *queue,
                }
 
                if (descriptor_bo) {
-                       uint32_t regs[] = {R_00B030_SPI_SHADER_USER_DATA_PS_0,
-                                          R_00B130_SPI_SHADER_USER_DATA_VS_0,
-                                          R_00B230_SPI_SHADER_USER_DATA_GS_0,
-                                          R_00B330_SPI_SHADER_USER_DATA_ES_0,
-                                          R_00B430_SPI_SHADER_USER_DATA_HS_0,
-                                          R_00B530_SPI_SHADER_USER_DATA_LS_0};
-
                        uint64_t va = radv_buffer_get_va(descriptor_bo);
-
-                       for (int i = 0; i < ARRAY_SIZE(regs); ++i) {
-                               radeon_set_sh_reg_seq(cs, regs[i], 2);
-                               radeon_emit(cs, va);
-                               radeon_emit(cs, va >> 32);
+                       if (queue->device->physical_device->rad_info.chip_class >= GFX9) {
+                               uint32_t regs[] = {R_00B030_SPI_SHADER_USER_DATA_PS_0,
+                                               R_00B130_SPI_SHADER_USER_DATA_VS_0,
+                                               R_00B208_SPI_SHADER_USER_DATA_ADDR_LO_GS,
+                                               R_00B408_SPI_SHADER_USER_DATA_ADDR_LO_HS};
+
+                               for (int i = 0; i < ARRAY_SIZE(regs); ++i) {
+                                       radeon_set_sh_reg_seq(cs, regs[i], 2);
+                                       radeon_emit(cs, va);
+                                       radeon_emit(cs, va >> 32);
+                               }
+                       } else {
+                               uint32_t regs[] = {R_00B030_SPI_SHADER_USER_DATA_PS_0,
+                                               R_00B130_SPI_SHADER_USER_DATA_VS_0,
+                                               R_00B230_SPI_SHADER_USER_DATA_GS_0,
+                                               R_00B330_SPI_SHADER_USER_DATA_ES_0,
+                                               R_00B430_SPI_SHADER_USER_DATA_HS_0,
+                                               R_00B530_SPI_SHADER_USER_DATA_LS_0};
+
+                               for (int i = 0; i < ARRAY_SIZE(regs); ++i) {
+                                       radeon_set_sh_reg_seq(cs, regs[i], 2);
+                                       radeon_emit(cs, va);
+                                       radeon_emit(cs, va >> 32);
+                               }
                        }
                }