Series is Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
On Mon, Feb 13, 2017, at 05:15, Dave Airlie wrote: > From: Dave Airlie <airl...@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 <airl...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev