radv: merge radv_write_scissors() with radv_emit_scissor()
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28551>
This commit is contained in:
committed by
Marge Bot
parent
16b6b17889
commit
fa0ec3af88
@@ -2120,12 +2120,52 @@ radv_emit_viewport(struct radv_cmd_buffer *cmd_buffer)
|
||||
}
|
||||
}
|
||||
|
||||
static VkRect2D
|
||||
radv_scissor_from_viewport(const VkViewport *viewport)
|
||||
{
|
||||
float scale[3], translate[3];
|
||||
VkRect2D rect;
|
||||
|
||||
radv_get_viewport_xform(viewport, scale, translate);
|
||||
|
||||
rect.offset.x = translate[0] - fabsf(scale[0]);
|
||||
rect.offset.y = translate[1] - fabsf(scale[1]);
|
||||
rect.extent.width = ceilf(translate[0] + fabsf(scale[0])) - rect.offset.x;
|
||||
rect.extent.height = ceilf(translate[1] + fabsf(scale[1])) - rect.offset.y;
|
||||
|
||||
return rect;
|
||||
}
|
||||
|
||||
static VkRect2D
|
||||
radv_intersect_scissor(const VkRect2D *a, const VkRect2D *b)
|
||||
{
|
||||
VkRect2D ret;
|
||||
ret.offset.x = MAX2(a->offset.x, b->offset.x);
|
||||
ret.offset.y = MAX2(a->offset.y, b->offset.y);
|
||||
ret.extent.width = MIN2(a->offset.x + a->extent.width, b->offset.x + b->extent.width) - ret.offset.x;
|
||||
ret.extent.height = MIN2(a->offset.y + a->extent.height, b->offset.y + b->extent.height) - ret.offset.y;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
radv_emit_scissor(struct radv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic;
|
||||
struct radeon_cmdbuf *cs = cmd_buffer->cs;
|
||||
|
||||
radv_write_scissors(cmd_buffer->cs, d->vk.vp.scissor_count, d->vk.vp.scissors, d->vk.vp.viewports);
|
||||
if (!d->vk.vp.scissor_count)
|
||||
return;
|
||||
|
||||
radeon_set_context_reg_seq(cs, R_028250_PA_SC_VPORT_SCISSOR_0_TL, d->vk.vp.scissor_count * 2);
|
||||
for (unsigned i = 0; i < d->vk.vp.scissor_count; i++) {
|
||||
VkRect2D viewport_scissor = radv_scissor_from_viewport(d->vk.vp.viewports + i);
|
||||
VkRect2D scissor = radv_intersect_scissor(&d->vk.vp.scissors[i], &viewport_scissor);
|
||||
|
||||
radeon_emit(
|
||||
cs, S_028250_TL_X(scissor.offset.x) | S_028250_TL_Y(scissor.offset.y) | S_028250_WINDOW_OFFSET_DISABLE(1));
|
||||
radeon_emit(cs, S_028254_BR_X(scissor.offset.x + scissor.extent.width) |
|
||||
S_028254_BR_Y(scissor.offset.y + scissor.extent.height));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -206,8 +206,6 @@ void radv_emit_compute(struct radv_device *device, struct radeon_cmdbuf *cs);
|
||||
|
||||
void radv_create_gfx_config(struct radv_device *device);
|
||||
|
||||
void radv_write_scissors(struct radeon_cmdbuf *cs, int count, const VkRect2D *scissors, const VkViewport *viewports);
|
||||
|
||||
void radv_cs_emit_write_event_eop(struct radeon_cmdbuf *cs, enum amd_gfx_level gfx_level, enum radv_queue_family qf,
|
||||
unsigned event, unsigned event_flags, unsigned dst_sel, unsigned data_sel,
|
||||
uint64_t va, uint32_t new_fence, uint64_t gfx9_eop_bug_va);
|
||||
|
||||
@@ -680,53 +680,6 @@ radv_get_viewport_xform(const VkViewport *viewport, float scale[3], float transl
|
||||
translate[2] = n;
|
||||
}
|
||||
|
||||
static VkRect2D
|
||||
radv_scissor_from_viewport(const VkViewport *viewport)
|
||||
{
|
||||
float scale[3], translate[3];
|
||||
VkRect2D rect;
|
||||
|
||||
radv_get_viewport_xform(viewport, scale, translate);
|
||||
|
||||
rect.offset.x = translate[0] - fabsf(scale[0]);
|
||||
rect.offset.y = translate[1] - fabsf(scale[1]);
|
||||
rect.extent.width = ceilf(translate[0] + fabsf(scale[0])) - rect.offset.x;
|
||||
rect.extent.height = ceilf(translate[1] + fabsf(scale[1])) - rect.offset.y;
|
||||
|
||||
return rect;
|
||||
}
|
||||
|
||||
static VkRect2D
|
||||
radv_intersect_scissor(const VkRect2D *a, const VkRect2D *b)
|
||||
{
|
||||
VkRect2D ret;
|
||||
ret.offset.x = MAX2(a->offset.x, b->offset.x);
|
||||
ret.offset.y = MAX2(a->offset.y, b->offset.y);
|
||||
ret.extent.width = MIN2(a->offset.x + a->extent.width, b->offset.x + b->extent.width) - ret.offset.x;
|
||||
ret.extent.height = MIN2(a->offset.y + a->extent.height, b->offset.y + b->extent.height) - ret.offset.y;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
radv_write_scissors(struct radeon_cmdbuf *cs, int count, const VkRect2D *scissors, const VkViewport *viewports)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!count)
|
||||
return;
|
||||
|
||||
radeon_set_context_reg_seq(cs, R_028250_PA_SC_VPORT_SCISSOR_0_TL, count * 2);
|
||||
for (i = 0; i < count; i++) {
|
||||
VkRect2D viewport_scissor = radv_scissor_from_viewport(viewports + i);
|
||||
VkRect2D scissor = radv_intersect_scissor(&scissors[i], &viewport_scissor);
|
||||
|
||||
radeon_emit(
|
||||
cs, S_028250_TL_X(scissor.offset.x) | S_028250_TL_Y(scissor.offset.y) | S_028250_WINDOW_OFFSET_DISABLE(1));
|
||||
radeon_emit(cs, S_028254_BR_X(scissor.offset.x + scissor.extent.width) |
|
||||
S_028254_BR_Y(scissor.offset.y + scissor.extent.height));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
radv_cs_emit_write_event_eop(struct radeon_cmdbuf *cs, enum amd_gfx_level gfx_level, enum radv_queue_family qf,
|
||||
unsigned event, unsigned event_flags, unsigned dst_sel, unsigned data_sel, uint64_t va,
|
||||
|
||||
Reference in New Issue
Block a user