radv: Implement VK_EXT_discard_rectangles.
Tested with a modified deferred demo and no regressions in a 1.0.2 mustpass run. Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -91,6 +91,7 @@ radv_bind_dynamic_state(struct radv_cmd_buffer *cmd_buffer,
|
||||
*/
|
||||
dest->viewport.count = src->viewport.count;
|
||||
dest->scissor.count = src->scissor.count;
|
||||
dest->discard_rectangle.count = src->discard_rectangle.count;
|
||||
|
||||
if (copy_mask & RADV_DYNAMIC_VIEWPORT) {
|
||||
if (memcmp(&dest->viewport.viewports, &src->viewport.viewports,
|
||||
@@ -168,6 +169,16 @@ radv_bind_dynamic_state(struct radv_cmd_buffer *cmd_buffer,
|
||||
}
|
||||
}
|
||||
|
||||
if (copy_mask & RADV_DYNAMIC_DISCARD_RECTANGLE) {
|
||||
if (memcmp(&dest->discard_rectangle.rectangles, &src->discard_rectangle.rectangles,
|
||||
src->discard_rectangle.count * sizeof(VkRect2D))) {
|
||||
typed_memcpy(dest->discard_rectangle.rectangles,
|
||||
src->discard_rectangle.rectangles,
|
||||
src->discard_rectangle.count);
|
||||
dest_mask |= RADV_DYNAMIC_DISCARD_RECTANGLE;
|
||||
}
|
||||
}
|
||||
|
||||
cmd_buffer->state.dirty |= dest_mask;
|
||||
}
|
||||
|
||||
@@ -1098,6 +1109,8 @@ radv_emit_graphics_pipeline(struct radv_cmd_buffer *cmd_buffer)
|
||||
}
|
||||
radeon_set_context_reg(cmd_buffer->cs, R_028A6C_VGT_GS_OUT_PRIM_TYPE, pipeline->graphics.gs_out);
|
||||
|
||||
radeon_set_context_reg(cmd_buffer->cs, R_02820C_PA_SC_CLIPRECT_RULE, pipeline->graphics.pa_sc_cliprect_rule);
|
||||
|
||||
if (unlikely(cmd_buffer->device->trace_bo))
|
||||
radv_save_pipeline(cmd_buffer, pipeline, RING_GFX);
|
||||
|
||||
@@ -1134,6 +1147,22 @@ radv_emit_scissor(struct radv_cmd_buffer *cmd_buffer)
|
||||
cmd_buffer->state.pipeline->graphics.ms.pa_sc_mode_cntl_0 | S_028A48_VPORT_SCISSOR_ENABLE(count ? 1 : 0));
|
||||
}
|
||||
|
||||
static void
|
||||
radv_emit_discard_rectangle(struct radv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
if (!cmd_buffer->state.dynamic.discard_rectangle.count)
|
||||
return;
|
||||
|
||||
radeon_set_context_reg_seq(cmd_buffer->cs, R_028210_PA_SC_CLIPRECT_0_TL,
|
||||
cmd_buffer->state.dynamic.discard_rectangle.count * 2);
|
||||
for (unsigned i = 0; i < cmd_buffer->state.dynamic.discard_rectangle.count; ++i) {
|
||||
VkRect2D rect = cmd_buffer->state.dynamic.discard_rectangle.rectangles[i];
|
||||
radeon_emit(cmd_buffer->cs, S_028210_TL_X(rect.offset.x) | S_028210_TL_Y(rect.offset.y));
|
||||
radeon_emit(cmd_buffer->cs, S_028214_BR_X(rect.offset.x + rect.extent.width) |
|
||||
S_028214_BR_Y(rect.offset.y + rect.extent.height));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
radv_emit_line_width(struct radv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
@@ -1627,6 +1656,9 @@ radv_cmd_buffer_flush_dynamic_state(struct radv_cmd_buffer *cmd_buffer)
|
||||
RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS))
|
||||
radv_emit_depth_biais(cmd_buffer);
|
||||
|
||||
if (cmd_buffer->state.dirty & RADV_CMD_DIRTY_DYNAMIC_DISCARD_RECTANGLE)
|
||||
radv_emit_discard_rectangle(cmd_buffer);
|
||||
|
||||
cmd_buffer->state.dirty &= ~RADV_CMD_DIRTY_DYNAMIC_ALL;
|
||||
}
|
||||
|
||||
@@ -2882,6 +2914,25 @@ void radv_CmdSetStencilReference(
|
||||
cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE;
|
||||
}
|
||||
|
||||
void radv_CmdSetDiscardRectangleEXT(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t firstDiscardRectangle,
|
||||
uint32_t discardRectangleCount,
|
||||
const VkRect2D* pDiscardRectangles)
|
||||
{
|
||||
RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
struct radv_cmd_state *state = &cmd_buffer->state;
|
||||
MAYBE_UNUSED const uint32_t total_count = firstDiscardRectangle + discardRectangleCount;
|
||||
|
||||
assert(firstDiscardRectangle < MAX_DISCARD_RECTANGLES);
|
||||
assert(total_count >= 1 && total_count <= MAX_DISCARD_RECTANGLES);
|
||||
|
||||
typed_memcpy(&state->dynamic.discard_rectangle.rectangles[firstDiscardRectangle],
|
||||
pDiscardRectangles, discardRectangleCount);
|
||||
|
||||
state->dirty |= RADV_CMD_DIRTY_DYNAMIC_DISCARD_RECTANGLE;
|
||||
}
|
||||
|
||||
void radv_CmdExecuteCommands(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t commandBufferCount,
|
||||
|
||||
Reference in New Issue
Block a user