radv: add set_loc_shader_ptr() helper
[mesa.git] / src / amd / vulkan / radv_cmd_buffer.c
index f6b23f6e739903e85ccdff22161635415f32e0cc..3636b2c8d9c075be66a217bee68e2e30ef742a39 100644 (file)
@@ -238,7 +238,7 @@ static VkResult radv_create_cmd_buffer(
                cmd_buffer->queue_family_index = pool->queue_family_index;
 
        } else {
-               /* Init the pool_link so we can safefly call list_del when we destroy
+               /* Init the pool_link so we can safely call list_del when we destroy
                 * the command buffer
                 */
                list_inithead(&cmd_buffer->pool_link);
@@ -347,7 +347,8 @@ radv_cmd_buffer_resize_upload_buf(struct radv_cmd_buffer *cmd_buffer,
                                       new_size, 4096,
                                       RADEON_DOMAIN_GTT,
                                       RADEON_FLAG_CPU_ACCESS|
-                                      RADEON_FLAG_NO_INTERPROCESS_SHARING);
+                                      RADEON_FLAG_NO_INTERPROCESS_SHARING |
+                                      RADEON_FLAG_32BIT);
 
        if (!bo) {
                cmd_buffer->record_result = VK_ERROR_OUT_OF_DEVICE_MEMORY;
@@ -587,9 +588,9 @@ radv_emit_userdata_address(struct radv_cmd_buffer *cmd_buffer,
                return;
        assert(loc->num_sgprs == 2);
        assert(!loc->indirect);
-       radeon_set_sh_reg_seq(cmd_buffer->cs, base_reg + loc->sgpr_idx * 4, 2);
-       radeon_emit(cmd_buffer->cs, va);
-       radeon_emit(cmd_buffer->cs, va >> 32);
+
+       radv_emit_shader_pointer(cmd_buffer->cs,
+                                base_reg + loc->sgpr_idx * 4, va);
 }
 
 static void
@@ -1156,7 +1157,7 @@ radv_load_depth_clear_regs(struct radv_cmd_buffer *cmd_buffer,
 }
 
 /*
- *with DCC some colors don't require CMASK elimiation before being
+ * With DCC some colors don't require CMASK elimination before being
  * used as a texture. This sets a predicate value to determine if the
  * cmask eliminate is required.
  */
@@ -1334,6 +1335,7 @@ radv_emit_index_buffer(struct radv_cmd_buffer *cmd_buffer)
 
 void radv_set_db_count_control(struct radv_cmd_buffer *cmd_buffer)
 {
+       bool has_perfect_queries = cmd_buffer->state.perfect_occlusion_queries_enabled;
        struct radv_pipeline *pipeline = cmd_buffer->state.pipeline;
        uint32_t pa_sc_mode_cntl_1 =
                pipeline ? pipeline->graphics.ms.pa_sc_mode_cntl_1 : 0;
@@ -1342,11 +1344,12 @@ void radv_set_db_count_control(struct radv_cmd_buffer *cmd_buffer)
        if(!cmd_buffer->state.active_occlusion_queries) {
                if (cmd_buffer->device->physical_device->rad_info.chip_class >= CIK) {
                        if (G_028A4C_OUT_OF_ORDER_PRIMITIVE_ENABLE(pa_sc_mode_cntl_1) &&
-                           pipeline->graphics.disable_out_of_order_rast_for_occlusion) {
+                           pipeline->graphics.disable_out_of_order_rast_for_occlusion &&
+                           has_perfect_queries) {
                                /* Re-enable out-of-order rasterization if the
                                 * bound pipeline supports it and if it's has
-                                * been disabled before starting occlusion
-                                * queries.
+                                * been disabled before starting any perfect
+                                * occlusion queries.
                                 */
                                radeon_set_context_reg(cmd_buffer->cs,
                                                       R_028A4C_PA_SC_MODE_CNTL_1,
@@ -1359,22 +1362,22 @@ void radv_set_db_count_control(struct radv_cmd_buffer *cmd_buffer)
        } else {
                const struct radv_subpass *subpass = cmd_buffer->state.subpass;
                uint32_t sample_rate = subpass ? util_logbase2(subpass->max_sample_count) : 0;
-               bool perfect = cmd_buffer->state.perfect_occlusion_queries_enabled;
 
                if (cmd_buffer->device->physical_device->rad_info.chip_class >= CIK) {
                        db_count_control =
-                               S_028004_PERFECT_ZPASS_COUNTS(perfect) |
+                               S_028004_PERFECT_ZPASS_COUNTS(has_perfect_queries) |
                                S_028004_SAMPLE_RATE(sample_rate) |
                                S_028004_ZPASS_ENABLE(1) |
                                S_028004_SLICE_EVEN_ENABLE(1) |
                                S_028004_SLICE_ODD_ENABLE(1);
 
                        if (G_028A4C_OUT_OF_ORDER_PRIMITIVE_ENABLE(pa_sc_mode_cntl_1) &&
-                           pipeline->graphics.disable_out_of_order_rast_for_occlusion) {
+                           pipeline->graphics.disable_out_of_order_rast_for_occlusion &&
+                           has_perfect_queries) {
                                /* If the bound pipeline has enabled
                                 * out-of-order rasterization, we should
-                                * disable it before starting occlusion
-                                * queries.
+                                * disable it before starting any perfect
+                                * occlusion queries.
                                 */
                                pa_sc_mode_cntl_1 &= C_028A4C_OUT_OF_ORDER_PRIMITIVE_ENABLE;
 
@@ -1440,10 +1443,9 @@ emit_stage_descriptor_set_userdata(struct radv_cmd_buffer *cmd_buffer,
 
        assert(!desc_set_loc->indirect);
        assert(desc_set_loc->num_sgprs == 2);
-       radeon_set_sh_reg_seq(cmd_buffer->cs,
-                             base_reg + desc_set_loc->sgpr_idx * 4, 2);
-       radeon_emit(cmd_buffer->cs, va);
-       radeon_emit(cmd_buffer->cs, va >> 32);
+
+       radv_emit_shader_pointer(cmd_buffer->cs,
+                                base_reg + desc_set_loc->sgpr_idx * 4, va);
 }
 
 static void
@@ -2206,6 +2208,12 @@ radv_bind_descriptor_set(struct radv_cmd_buffer *cmd_buffer,
 
        assert(!(set->layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR));
 
+       if (!cmd_buffer->device->use_global_bo_list) {
+               for (unsigned j = 0; j < set->layout->buffer_count; ++j)
+                       if (set->descriptors[j])
+                               radv_cs_add_buffer(ws, cmd_buffer->cs, set->descriptors[j], 7);
+       }
+
        if(set->bo)
                radv_cs_add_buffer(ws, cmd_buffer->cs, set->bo, 8);
 }
@@ -2224,6 +2232,8 @@ void radv_CmdBindDescriptorSets(
        RADV_FROM_HANDLE(radv_pipeline_layout, layout, _layout);
        unsigned dyn_idx = 0;
 
+       const bool no_dynamic_bounds = cmd_buffer->device->instance->debug_flags & RADV_DEBUG_NO_DYNAMIC_BOUNDS;
+
        for (unsigned i = 0; i < descriptorSetCount; ++i) {
                unsigned idx = i + firstSet;
                RADV_FROM_HANDLE(radv_descriptor_set, set, pDescriptorSets[i]);
@@ -2238,7 +2248,7 @@ void radv_CmdBindDescriptorSets(
                        uint64_t va = range->va + pDynamicOffsets[dyn_idx];
                        dst[0] = va;
                        dst[1] = S_008F04_BASE_ADDRESS_HI(va >> 32);
-                       dst[2] = range->size;
+                       dst[2] = no_dynamic_bounds ? 0xffffffffu : range->size;
                        dst[3] = S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
                                 S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
                                 S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |