[Mesa-dev] [PATCH 3/3] radv: use indirect buffer for initial gfx state.
Bas Nieuwenhuizen
bas at basnieuwenhuizen.nl
Mon Feb 13 08:16:28 UTC 2017
Series is
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
On Mon, Feb 13, 2017, at 05:15, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This puts the common gfx state for the device into an
> indirect buffer, and just calls out to it, on CIK and above.
>
> This is taken from what radeonsi does.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/amd/vulkan/radv_cmd_buffer.c | 16 +++++++++++++++-
> src/amd/vulkan/radv_device.c | 9 +++++++++
> src/amd/vulkan/radv_private.h | 7 +++++++
> src/amd/vulkan/si_cmd_buffer.c | 31 +++++++++++++++++++++++++++++++
> 4 files changed, 62 insertions(+), 1 deletion(-)
>
> diff --git a/src/amd/vulkan/radv_cmd_buffer.c
> b/src/amd/vulkan/radv_cmd_buffer.c
> index f9325ff..d58439f 100644
> --- a/src/amd/vulkan/radv_cmd_buffer.c
> +++ b/src/amd/vulkan/radv_cmd_buffer.c
> @@ -1603,6 +1603,20 @@ VkResult radv_ResetCommandBuffer(
> return VK_SUCCESS;
> }
>
> +static void emit_gfx_buffer_state(struct radv_cmd_buffer *cmd_buffer)
> +{
> + struct radv_device *device = cmd_buffer->device;
> + if (device->gfx_init) {
> + uint64_t va =
> device->ws->buffer_get_va(device->gfx_init);
> + device->ws->cs_add_buffer(cmd_buffer->cs,
> device->gfx_init, 8);
> + radeon_emit(cmd_buffer->cs,
> PKT3(PKT3_INDIRECT_BUFFER_CIK, 2, 0));
> + radeon_emit(cmd_buffer->cs, va);
> + radeon_emit(cmd_buffer->cs, (va >> 32) & 0xffff);
> + radeon_emit(cmd_buffer->cs, device->gfx_init_size_dw &
> 0xffff);
> + } else
> + si_init_config(cmd_buffer);
> +}
> +
> VkResult radv_BeginCommandBuffer(
> VkCommandBuffer commandBuffer,
> const VkCommandBufferBeginInfo *pBeginInfo)
> @@ -1624,7 +1638,7 @@ VkResult radv_BeginCommandBuffer(
> RADV_CMD_FLAG_INV_SMEM_L1 |
> RADV_CMD_FLUSH_AND_INV_FRAMEBUFFER |
> RADV_CMD_FLAG_INV_GLOBAL_L2;
> - si_init_config(cmd_buffer);
> + emit_gfx_buffer_state(cmd_buffer);
> radv_set_db_count_control(cmd_buffer);
> si_emit_cache_flush(cmd_buffer);
> break;
> diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
> index fff3125..d770a3b 100644
> --- a/src/amd/vulkan/radv_device.c
> +++ b/src/amd/vulkan/radv_device.c
> @@ -949,6 +949,9 @@ VkResult radv_CreateDevice(
> goto fail;
> }
>
> + if (device->physical_device->rad_info.chip_class >= CIK)
> + cik_create_gfx_config(device);
> +
> *pDevice = radv_device_to_handle(device);
> return VK_SUCCESS;
>
> @@ -956,6 +959,9 @@ fail:
> if (device->trace_bo)
> device->ws->buffer_destroy(device->trace_bo);
>
> + if (device->gfx_init)
> + device->ws->buffer_destroy(device->gfx_init);
> +
> for (unsigned i = 0; i < RADV_MAX_QUEUE_FAMILIES; i++) {
> for (unsigned q = 0; q < device->queue_count[i]; q++)
> radv_queue_finish(&device->queues[i][q]);
> @@ -976,6 +982,9 @@ void radv_DestroyDevice(
> if (device->trace_bo)
> device->ws->buffer_destroy(device->trace_bo);
>
> + if (device->gfx_init)
> + device->ws->buffer_destroy(device->gfx_init);
> +
> for (unsigned i = 0; i < RADV_MAX_QUEUE_FAMILIES; i++) {
> for (unsigned q = 0; q < device->queue_count[i]; q++)
> radv_queue_finish(&device->queues[i][q]);
> diff --git a/src/amd/vulkan/radv_private.h
> b/src/amd/vulkan/radv_private.h
> index cdf4885..e26dfbc 100644
> --- a/src/amd/vulkan/radv_private.h
> +++ b/src/amd/vulkan/radv_private.h
> @@ -511,6 +511,10 @@ struct radv_device {
> float sample_locations_8x[8][2];
> float sample_locations_16x[16][2];
>
> + /* CIK and later */
> + uint32_t gfx_init_size_dw;
> + struct radeon_winsys_bo *gfx_init;
> +
> struct radeon_winsys_bo *trace_bo;
> uint32_t *trace_id_ptr;
>
> @@ -758,6 +762,9 @@ bool radv_cmd_buffer_uses_mec(struct radv_cmd_buffer
> *cmd_buffer);
>
> void si_init_compute(struct radv_cmd_buffer *cmd_buffer);
> void si_init_config(struct radv_cmd_buffer *cmd_buffer);
> +
> +void cik_create_gfx_config(struct radv_device *device);
> +
> void si_write_viewport(struct radeon_winsys_cs *cs, int first_vp,
> int count, const VkViewport *viewports);
> void si_write_scissors(struct radeon_winsys_cs *cs, int first,
> diff --git a/src/amd/vulkan/si_cmd_buffer.c
> b/src/amd/vulkan/si_cmd_buffer.c
> index a4048cd..07870cc 100644
> --- a/src/amd/vulkan/si_cmd_buffer.c
> +++ b/src/amd/vulkan/si_cmd_buffer.c
> @@ -432,9 +432,40 @@ si_emit_config(struct radv_physical_device
> *physical_device,
> void si_init_config(struct radv_cmd_buffer *cmd_buffer)
> {
> struct radv_physical_device *physical_device = cmd_buffer->device->physical_device;
> +
> si_emit_config(physical_device, cmd_buffer->cs);
> }
>
> +void
> +cik_create_gfx_config(struct radv_device *device)
> +{
> + struct radeon_winsys_cs *cs = device->ws->cs_create(device->ws,
> RING_GFX);
> + if (!cs)
> + return;
> +
> + si_emit_config(device->physical_device, cs);
> +
> + device->gfx_init = device->ws->buffer_create(device->ws,
> + cs->cdw * 4, 4096,
> + RADEON_DOMAIN_GTT,
> +
> RADEON_FLAG_CPU_ACCESS);
> + if (!device->gfx_init)
> + goto fail;
> +
> + void *map = device->ws->buffer_map(device->gfx_init);
> + if (!map) {
> + device->ws->buffer_destroy(device->gfx_init);
> + device->gfx_init = NULL;
> + goto fail;
> + }
> + memcpy(map, cs->buf, cs->cdw * 4);
> +
> + device->ws->buffer_unmap(device->gfx_init);
> + device->gfx_init_size_dw = cs->cdw;
> +fail:
> + device->ws->cs_destroy(cs);
> +}
> +
> static void
> get_viewport_xform(const VkViewport *viewport,
> float scale[3], float translate[3])
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list