diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index 339c1041f0e..b1ad47d6f43 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -36,7 +36,6 @@ panvk_entrypoints = custom_target( libpanvk_files = files( 'panvk_buffer.c', - 'panvk_cmd_buffer.c', 'panvk_cmd_pool.c', 'panvk_device_memory.c', 'panvk_descriptor_set.c', diff --git a/src/panfrost/vulkan/panvk_cmd_buffer.c b/src/panfrost/vulkan/panvk_cmd_buffer.c deleted file mode 100644 index 999ad908a17..00000000000 --- a/src/panfrost/vulkan/panvk_cmd_buffer.c +++ /dev/null @@ -1,437 +0,0 @@ -/* - * Copyright © 2021 Collabora Ltd. - * - * Derived from tu_cmd_buffer.c which is: - * Copyright © 2016 Red Hat. - * Copyright © 2016 Bas Nieuwenhuizen - * Copyright © 2015 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "panvk_cmd_buffer.h" -#include "panvk_buffer.h" -#include "panvk_cmd_pool.h" -#include "panvk_device.h" -#include "panvk_entrypoints.h" -#include "panvk_physical_device.h" -#include "panvk_pipeline.h" -#include "panvk_pipeline_layout.h" - -#include "pan_encoder.h" -#include "pan_props.h" - -#include "util/rounding.h" - -#include "vk_alloc.h" -#include "vk_format.h" -#include "vk_framebuffer.h" - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, - uint32_t bindingCount, const VkBuffer *pBuffers, - const VkDeviceSize *pOffsets) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - struct panvk_descriptor_state *desc_state = - panvk_cmd_get_desc_state(cmdbuf, GRAPHICS); - - assert(firstBinding + bindingCount <= MAX_VBS); - - for (uint32_t i = 0; i < bindingCount; i++) { - VK_FROM_HANDLE(panvk_buffer, buffer, pBuffers[i]); - - cmdbuf->state.vb.bufs[firstBinding + i].address = - panvk_buffer_gpu_ptr(buffer, pOffsets[i]); - cmdbuf->state.vb.bufs[firstBinding + i].size = - panvk_buffer_range(buffer, pOffsets[i], VK_WHOLE_SIZE); - } - - cmdbuf->state.vb.count = - MAX2(cmdbuf->state.vb.count, firstBinding + bindingCount); - desc_state->vs_attrib_bufs = desc_state->vs_attribs = 0; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, - VkDeviceSize offset, VkIndexType indexType) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - VK_FROM_HANDLE(panvk_buffer, buf, buffer); - - cmdbuf->state.ib.buffer = buf; - cmdbuf->state.ib.offset = offset; - switch (indexType) { - case VK_INDEX_TYPE_UINT16: - cmdbuf->state.ib.index_size = 16; - break; - case VK_INDEX_TYPE_UINT32: - cmdbuf->state.ib.index_size = 32; - break; - case VK_INDEX_TYPE_NONE_KHR: - cmdbuf->state.ib.index_size = 0; - break; - case VK_INDEX_TYPE_UINT8_EXT: - cmdbuf->state.ib.index_size = 8; - break; - default: - unreachable("Invalid index type\n"); - } -} - -static void -panvk_set_dyn_ssbo_pointers(struct panvk_descriptor_state *desc_state, - unsigned dyn_ssbo_offset, - struct panvk_descriptor_set *set) -{ - struct panvk_sysvals *sysvals = &desc_state->sysvals; - - for (unsigned i = 0; i < set->layout->num_dyn_ssbos; i++) { - const struct panvk_buffer_desc *ssbo = - &desc_state->dyn.ssbos[dyn_ssbo_offset + i]; - - sysvals->dyn_ssbos[dyn_ssbo_offset + i] = (struct panvk_ssbo_addr){ - .base_addr = panvk_buffer_gpu_ptr(ssbo->buffer, ssbo->offset), - .size = panvk_buffer_range(ssbo->buffer, ssbo->offset, ssbo->size), - }; - } - - desc_state->sysvals_ptr = 0; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer, - VkPipelineBindPoint pipelineBindPoint, - VkPipelineLayout layout, uint32_t firstSet, - uint32_t descriptorSetCount, - const VkDescriptorSet *pDescriptorSets, - uint32_t dynamicOffsetCount, - const uint32_t *pDynamicOffsets) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - VK_FROM_HANDLE(panvk_pipeline_layout, playout, layout); - - struct panvk_descriptor_state *descriptors_state = - &cmdbuf->bind_points[pipelineBindPoint].desc_state; - - unsigned dynoffset_idx = 0; - for (unsigned i = 0; i < descriptorSetCount; ++i) { - unsigned idx = i + firstSet; - VK_FROM_HANDLE(panvk_descriptor_set, set, pDescriptorSets[i]); - - descriptors_state->sets[idx] = set; - - if (set->layout->num_dyn_ssbos || set->layout->num_dyn_ubos) { - unsigned dyn_ubo_offset = playout->sets[idx].dyn_ubo_offset; - unsigned dyn_ssbo_offset = playout->sets[idx].dyn_ssbo_offset; - - for (unsigned b = 0; b < set->layout->binding_count; b++) { - for (unsigned e = 0; e < set->layout->bindings[b].array_size; e++) { - struct panvk_buffer_desc *bdesc = NULL; - - if (set->layout->bindings[b].type == - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) { - bdesc = &descriptors_state->dyn.ubos[dyn_ubo_offset++]; - *bdesc = - set->dyn_ubos[set->layout->bindings[b].dyn_ubo_idx + e]; - } else if (set->layout->bindings[b].type == - VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) { - bdesc = &descriptors_state->dyn.ssbos[dyn_ssbo_offset++]; - *bdesc = - set->dyn_ssbos[set->layout->bindings[b].dyn_ssbo_idx + e]; - } - - if (bdesc) { - bdesc->offset += pDynamicOffsets[dynoffset_idx++]; - } - } - } - } - - if (set->layout->num_dyn_ssbos) { - panvk_set_dyn_ssbo_pointers(descriptors_state, - playout->sets[idx].dyn_ssbo_offset, set); - } - - if (set->layout->num_dyn_ssbos) - descriptors_state->dirty |= PANVK_DYNAMIC_SSBO; - - if (set->layout->num_ubos || set->layout->num_dyn_ubos || - set->layout->num_dyn_ssbos || set->layout->desc_ubo_size) - descriptors_state->ubos = 0; - - if (set->layout->num_textures) - descriptors_state->textures = 0; - - if (set->layout->num_samplers) - descriptors_state->samplers = 0; - - if (set->layout->num_imgs) { - descriptors_state->vs_attrib_bufs = - descriptors_state->non_vs_attrib_bufs = 0; - descriptors_state->vs_attribs = descriptors_state->non_vs_attribs = 0; - } - } - - assert(dynoffset_idx == dynamicOffsetCount); -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, - VkShaderStageFlags stageFlags, uint32_t offset, - uint32_t size, const void *pValues) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - - memcpy(cmdbuf->push_constants + offset, pValues, size); - - if (stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) { - struct panvk_descriptor_state *desc_state = - panvk_cmd_get_desc_state(cmdbuf, GRAPHICS); - - desc_state->ubos = 0; - desc_state->push_constants = 0; - } - - if (stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) { - struct panvk_descriptor_state *desc_state = - panvk_cmd_get_desc_state(cmdbuf, COMPUTE); - - desc_state->ubos = 0; - desc_state->push_constants = 0; - } -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdBindPipeline(VkCommandBuffer commandBuffer, - VkPipelineBindPoint pipelineBindPoint, - VkPipeline _pipeline) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - VK_FROM_HANDLE(panvk_pipeline, pipeline, _pipeline); - - cmdbuf->bind_points[pipelineBindPoint].pipeline = pipeline; - cmdbuf->state.fs_rsd = 0; - - if (pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) { - cmdbuf->state.varyings = pipeline->varyings; - - if (!(pipeline->dynamic_state_mask & - BITFIELD_BIT(VK_DYNAMIC_STATE_VIEWPORT))) { - cmdbuf->state.viewport = pipeline->viewport; - cmdbuf->state.dirty |= PANVK_DYNAMIC_VIEWPORT; - } - if (!(pipeline->dynamic_state_mask & - BITFIELD_BIT(VK_DYNAMIC_STATE_SCISSOR))) { - cmdbuf->state.scissor = pipeline->scissor; - cmdbuf->state.dirty |= PANVK_DYNAMIC_SCISSOR; - } - } - - /* Sysvals are passed through UBOs, we need dirty the UBO array if the - * pipeline contain shaders using sysvals. - */ - cmdbuf->bind_points[pipelineBindPoint].desc_state.ubos = 0; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, - uint32_t viewportCount, const VkViewport *pViewports) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - assert(viewportCount == 1); - assert(!firstViewport); - - cmdbuf->state.viewport = pViewports[0]; - cmdbuf->state.vpd = 0; - cmdbuf->state.dirty |= PANVK_DYNAMIC_VIEWPORT; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, - uint32_t scissorCount, const VkRect2D *pScissors) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - assert(scissorCount == 1); - assert(!firstScissor); - - cmdbuf->state.scissor = pScissors[0]; - cmdbuf->state.vpd = 0; - cmdbuf->state.dirty |= PANVK_DYNAMIC_SCISSOR; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - - cmdbuf->state.rast.line_width = lineWidth; - cmdbuf->state.dirty |= PANVK_DYNAMIC_LINE_WIDTH; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdSetDepthBias(VkCommandBuffer commandBuffer, - float depthBiasConstantFactor, float depthBiasClamp, - float depthBiasSlopeFactor) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - - cmdbuf->state.rast.depth_bias.constant_factor = depthBiasConstantFactor; - cmdbuf->state.rast.depth_bias.clamp = depthBiasClamp; - cmdbuf->state.rast.depth_bias.slope_factor = depthBiasSlopeFactor; - cmdbuf->state.dirty |= PANVK_DYNAMIC_DEPTH_BIAS; - cmdbuf->state.fs_rsd = 0; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdSetBlendConstants(VkCommandBuffer commandBuffer, - const float blendConstants[4]) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - - for (unsigned i = 0; i < 4; i++) - cmdbuf->state.blend.constants[i] = CLAMP(blendConstants[i], 0.0f, 1.0f); - - cmdbuf->state.dirty |= PANVK_DYNAMIC_BLEND_CONSTANTS; - cmdbuf->state.fs_rsd = 0; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, - float maxDepthBounds) -{ - panvk_stub(); -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, - VkStencilFaceFlags faceMask, - uint32_t compareMask) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - - if (faceMask & VK_STENCIL_FACE_FRONT_BIT) - cmdbuf->state.zs.s_front.compare_mask = compareMask; - - if (faceMask & VK_STENCIL_FACE_BACK_BIT) - cmdbuf->state.zs.s_back.compare_mask = compareMask; - - cmdbuf->state.dirty |= PANVK_DYNAMIC_STENCIL_COMPARE_MASK; - cmdbuf->state.fs_rsd = 0; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, - VkStencilFaceFlags faceMask, uint32_t writeMask) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - - if (faceMask & VK_STENCIL_FACE_FRONT_BIT) - cmdbuf->state.zs.s_front.write_mask = writeMask; - - if (faceMask & VK_STENCIL_FACE_BACK_BIT) - cmdbuf->state.zs.s_back.write_mask = writeMask; - - cmdbuf->state.dirty |= PANVK_DYNAMIC_STENCIL_WRITE_MASK; - cmdbuf->state.fs_rsd = 0; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdSetStencilReference(VkCommandBuffer commandBuffer, - VkStencilFaceFlags faceMask, uint32_t reference) -{ - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - - if (faceMask & VK_STENCIL_FACE_FRONT_BIT) - cmdbuf->state.zs.s_front.ref = reference; - - if (faceMask & VK_STENCIL_FACE_BACK_BIT) - cmdbuf->state.zs.s_back.ref = reference; - - cmdbuf->state.dirty |= PANVK_DYNAMIC_STENCIL_REFERENCE; - cmdbuf->state.fs_rsd = 0; -} - -void -panvk_cmd_preload_fb_after_batch_split(struct panvk_cmd_buffer *cmdbuf) -{ - for (unsigned i = 0; i < cmdbuf->state.fb.info.rt_count; i++) { - if (cmdbuf->state.fb.info.rts[i].view) { - cmdbuf->state.fb.info.rts[i].clear = false; - cmdbuf->state.fb.info.rts[i].preload = true; - } - } - - if (cmdbuf->state.fb.info.zs.view.zs) { - cmdbuf->state.fb.info.zs.clear.z = false; - cmdbuf->state.fb.info.zs.preload.z = true; - } - - if (cmdbuf->state.fb.info.zs.view.s || - (cmdbuf->state.fb.info.zs.view.zs && - util_format_is_depth_and_stencil( - cmdbuf->state.fb.info.zs.view.zs->format))) { - cmdbuf->state.fb.info.zs.clear.s = false; - cmdbuf->state.fb.info.zs.preload.s = true; - } -} - -struct panvk_batch * -panvk_cmd_open_batch(struct panvk_cmd_buffer *cmdbuf) -{ - assert(!cmdbuf->state.batch); - cmdbuf->state.batch = - vk_zalloc(&cmdbuf->vk.pool->alloc, sizeof(*cmdbuf->state.batch), 8, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - util_dynarray_init(&cmdbuf->state.batch->jobs, NULL); - util_dynarray_init(&cmdbuf->state.batch->event_ops, NULL); - assert(cmdbuf->state.batch); - return cmdbuf->state.batch; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer _buffer, - VkDeviceSize offset, uint32_t drawCount, uint32_t stride) -{ - panvk_stub(); -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer _buffer, - VkDeviceSize offset, uint32_t drawCount, - uint32_t stride) -{ - panvk_stub(); -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t base_x, - uint32_t base_y, uint32_t base_z, uint32_t x, uint32_t y, - uint32_t z) -{ - panvk_stub(); -} - -VKAPI_ATTR void VKAPI_CALL -panvk_CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer _buffer, - VkDeviceSize offset) -{ - panvk_stub(); -} diff --git a/src/panfrost/vulkan/panvk_cmd_buffer.h b/src/panfrost/vulkan/panvk_cmd_buffer.h index 8ecbcb8dc37..23532d53b46 100644 --- a/src/panfrost/vulkan/panvk_cmd_buffer.h +++ b/src/panfrost/vulkan/panvk_cmd_buffer.h @@ -6,6 +6,10 @@ #ifndef PANVK_CMD_BUFFER_H #define PANVK_CMD_BUFFER_H +#ifndef PAN_ARCH +#error "PAN_ARCH must be defined" +#endif + #include #include "vulkan/runtime/vk_command_buffer.h" @@ -22,12 +26,12 @@ #include "util/list.h" +#include "genxml/gen_macros.h" + #define MAX_BIND_POINTS 2 /* compute + graphics */ #define MAX_VBS 16 #define MAX_PUSH_CONSTANTS_SIZE 128 -#define TILER_DESC_WORDS 56 - struct panvk_batch { struct list_head node; struct util_dynarray jobs; @@ -47,8 +51,10 @@ struct panvk_batch { mali_ptr fragment_job; struct { struct pan_tiler_context ctx; - struct panfrost_ptr descs; - uint32_t templ[TILER_DESC_WORDS]; + struct panfrost_ptr heap_desc; + struct panfrost_ptr ctx_desc; + struct mali_tiler_heap_packed heap_templ; + struct mali_tiler_context_packed ctx_templ; } tiler; struct pan_tls_info tlsinfo; unsigned wls_total_size; @@ -192,13 +198,11 @@ VK_DEFINE_HANDLE_CASTS(panvk_cmd_buffer, vk.base, VkCommandBuffer, #define panvk_cmd_get_desc_state(cmdbuf, bindpoint) \ &(cmdbuf)->bind_points[VK_PIPELINE_BIND_POINT_##bindpoint].desc_state -struct panvk_batch *panvk_cmd_open_batch(struct panvk_cmd_buffer *cmdbuf); - -void panvk_cmd_preload_fb_after_batch_split(struct panvk_cmd_buffer *cmdbuf); - -#if PAN_ARCH extern const struct vk_command_buffer_ops panvk_per_arch(cmd_buffer_ops); +struct panvk_batch * +panvk_per_arch(cmd_open_batch)(struct panvk_cmd_buffer *cmdbuf); + void panvk_per_arch(cmd_close_batch)(struct panvk_cmd_buffer *cmdbuf); void panvk_per_arch(cmd_get_tiler_context)(struct panvk_cmd_buffer *cmdbuf, @@ -213,6 +217,5 @@ void panvk_per_arch(cmd_prepare_tiler_context)(struct panvk_cmd_buffer *cmdbuf); void panvk_per_arch(emit_viewport)(const VkViewport *viewport, const VkRect2D *scissor, void *vpd); -#endif #endif diff --git a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c index 7b17eeb5ec4..58ec5767382 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c @@ -175,7 +175,7 @@ panvk_per_arch(cmd_close_batch)(struct panvk_cmd_buffer *cmdbuf) struct panfrost_ptr preload_jobs[2]; unsigned num_preload_jobs = GENX(pan_preload_fb)( &dev->meta.blitter.cache, &cmdbuf->desc_pool.base, &batch->jc, - &cmdbuf->state.fb.info, batch->tls.gpu, batch->tiler.descs.gpu, + &cmdbuf->state.fb.info, batch->tls.gpu, batch->tiler.ctx_desc.gpu, preload_jobs); for (unsigned i = 0; i < num_preload_jobs; i++) util_dynarray_append(&batch->jobs, void *, preload_jobs[i].cpu); @@ -592,32 +592,33 @@ panvk_per_arch(cmd_get_tiler_context)(struct panvk_cmd_buffer *cmdbuf, struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); struct panvk_batch *batch = cmdbuf->state.batch; - if (batch->tiler.descs.cpu) + if (batch->tiler.ctx_desc.cpu) return; - batch->tiler.descs = pan_pool_alloc_desc_aggregate( - &cmdbuf->desc_pool.base, PAN_DESC(TILER_CONTEXT), PAN_DESC(TILER_HEAP)); - STATIC_ASSERT(sizeof(batch->tiler.templ) >= - pan_size(TILER_CONTEXT) + pan_size(TILER_HEAP)); + batch->tiler.heap_desc = + pan_pool_alloc_desc(&cmdbuf->desc_pool.base, TILER_HEAP); + batch->tiler.ctx_desc = + pan_pool_alloc_desc(&cmdbuf->desc_pool.base, TILER_CONTEXT); - pan_pack((void *)((uint8_t *)batch->tiler.templ + pan_size(TILER_CONTEXT)), - TILER_HEAP, cfg) { + pan_pack(&batch->tiler.heap_templ, TILER_HEAP, cfg) { cfg.size = pan_kmod_bo_size(dev->tiler_heap->bo); cfg.base = dev->tiler_heap->addr.dev; cfg.bottom = dev->tiler_heap->addr.dev; cfg.top = cfg.base + cfg.size; } - pan_pack(batch->tiler.templ, TILER_CONTEXT, cfg) { + pan_pack(&batch->tiler.ctx_templ, TILER_CONTEXT, cfg) { cfg.hierarchy_mask = 0x28; cfg.fb_width = width; cfg.fb_height = height; - cfg.heap = batch->tiler.descs.gpu + pan_size(TILER_CONTEXT); + cfg.heap = batch->tiler.heap_desc.gpu; } - memcpy(batch->tiler.descs.cpu, batch->tiler.templ, - pan_size(TILER_CONTEXT) + pan_size(TILER_HEAP)); - batch->tiler.ctx.bifrost = batch->tiler.descs.gpu; + memcpy(batch->tiler.heap_desc.cpu, &batch->tiler.heap_templ, + sizeof(batch->tiler.heap_templ)); + memcpy(batch->tiler.ctx_desc.cpu, &batch->tiler.ctx_templ, + sizeof(batch->tiler.ctx_templ)); + batch->tiler.ctx.bifrost = batch->tiler.ctx_desc.gpu; } void @@ -1202,6 +1203,43 @@ panvk_draw_prepare_tiler_job(struct panvk_cmd_buffer *cmdbuf, ; } +static void +panvk_cmd_preload_fb_after_batch_split(struct panvk_cmd_buffer *cmdbuf) +{ + for (unsigned i = 0; i < cmdbuf->state.fb.info.rt_count; i++) { + if (cmdbuf->state.fb.info.rts[i].view) { + cmdbuf->state.fb.info.rts[i].clear = false; + cmdbuf->state.fb.info.rts[i].preload = true; + } + } + + if (cmdbuf->state.fb.info.zs.view.zs) { + cmdbuf->state.fb.info.zs.clear.z = false; + cmdbuf->state.fb.info.zs.preload.z = true; + } + + if (cmdbuf->state.fb.info.zs.view.s || + (cmdbuf->state.fb.info.zs.view.zs && + util_format_is_depth_and_stencil( + cmdbuf->state.fb.info.zs.view.zs->format))) { + cmdbuf->state.fb.info.zs.clear.s = false; + cmdbuf->state.fb.info.zs.preload.s = true; + } +} + +struct panvk_batch * +panvk_per_arch(cmd_open_batch)(struct panvk_cmd_buffer *cmdbuf) +{ + assert(!cmdbuf->state.batch); + cmdbuf->state.batch = + vk_zalloc(&cmdbuf->vk.pool->alloc, sizeof(*cmdbuf->state.batch), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + util_dynarray_init(&cmdbuf->state.batch->jobs, NULL); + util_dynarray_init(&cmdbuf->state.batch->event_ops, NULL); + assert(cmdbuf->state.batch); + return cmdbuf->state.batch; +} + static void panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) { @@ -1217,7 +1255,7 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) if (batch->jc.job_index >= (UINT16_MAX - 3)) { panvk_per_arch(cmd_close_batch)(cmdbuf); panvk_cmd_preload_fb_after_batch_split(cmdbuf); - batch = panvk_cmd_open_batch(cmdbuf); + batch = panvk_per_arch(cmd_open_batch)(cmdbuf); } if (pipeline->rast.enable) @@ -1406,7 +1444,7 @@ panvk_per_arch(CmdPipelineBarrier2)(VkCommandBuffer commandBuffer, if (cmdbuf->state.batch) { panvk_per_arch(cmd_close_batch)(cmdbuf); panvk_cmd_preload_fb_after_batch_split(cmdbuf); - panvk_cmd_open_batch(cmdbuf); + panvk_per_arch(cmd_open_batch)(cmdbuf); } } @@ -1424,7 +1462,7 @@ panvk_add_set_event_operation(struct panvk_cmd_buffer *cmdbuf, /* No open batch, let's create a new one so this operation happens in * the right order. */ - panvk_cmd_open_batch(cmdbuf); + panvk_per_arch(cmd_open_batch)(cmdbuf); util_dynarray_append(&cmdbuf->state.batch->event_ops, struct panvk_cmd_event_op, op); panvk_per_arch(cmd_close_batch)(cmdbuf); @@ -1436,7 +1474,7 @@ panvk_add_set_event_operation(struct panvk_cmd_buffer *cmdbuf, struct panvk_cmd_event_op, op); panvk_per_arch(cmd_close_batch)(cmdbuf); panvk_cmd_preload_fb_after_batch_split(cmdbuf); - panvk_cmd_open_batch(cmdbuf); + panvk_per_arch(cmd_open_batch)(cmdbuf); } } @@ -1451,7 +1489,7 @@ panvk_add_wait_event_operation(struct panvk_cmd_buffer *cmdbuf, if (cmdbuf->state.batch == NULL) { /* No open batch, let's create a new one and have it wait for this event. */ - panvk_cmd_open_batch(cmdbuf); + panvk_per_arch(cmd_open_batch)(cmdbuf); util_dynarray_append(&cmdbuf->state.batch->event_ops, struct panvk_cmd_event_op, op); } else { @@ -1462,7 +1500,7 @@ panvk_add_wait_event_operation(struct panvk_cmd_buffer *cmdbuf, cmdbuf->state.batch->jc.first_job) { panvk_per_arch(cmd_close_batch)(cmdbuf); panvk_cmd_preload_fb_after_batch_split(cmdbuf); - panvk_cmd_open_batch(cmdbuf); + panvk_per_arch(cmd_open_batch)(cmdbuf); } util_dynarray_append(&cmdbuf->state.batch->event_ops, struct panvk_cmd_event_op, op); @@ -1627,7 +1665,7 @@ panvk_per_arch(CmdDispatch)(VkCommandBuffer commandBuffer, uint32_t x, }; panvk_per_arch(cmd_close_batch)(cmdbuf); - struct panvk_batch *batch = panvk_cmd_open_batch(cmdbuf); + struct panvk_batch *batch = panvk_per_arch(cmd_open_batch)(cmdbuf); struct panvk_cmd_bind_point_state *bind_point_state = panvk_cmd_get_bind_point_state(cmdbuf, COMPUTE); @@ -1828,7 +1866,7 @@ panvk_per_arch(CmdBeginRendering)(VkCommandBuffer commandBuffer, VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); panvk_cmd_begin_rendering_init_fbinfo(cmdbuf, pRenderingInfo); - panvk_cmd_open_batch(cmdbuf); + panvk_per_arch(cmd_open_batch)(cmdbuf); } VKAPI_ATTR void VKAPI_CALL @@ -1839,3 +1877,366 @@ panvk_per_arch(CmdEndRendering)(VkCommandBuffer commandBuffer) panvk_per_arch(cmd_close_batch)(cmdbuf); cmdbuf->state.batch = NULL; } + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdBindVertexBuffers)(VkCommandBuffer commandBuffer, + uint32_t firstBinding, + uint32_t bindingCount, + const VkBuffer *pBuffers, + const VkDeviceSize *pOffsets) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + struct panvk_descriptor_state *desc_state = + panvk_cmd_get_desc_state(cmdbuf, GRAPHICS); + + assert(firstBinding + bindingCount <= MAX_VBS); + + for (uint32_t i = 0; i < bindingCount; i++) { + VK_FROM_HANDLE(panvk_buffer, buffer, pBuffers[i]); + + cmdbuf->state.vb.bufs[firstBinding + i].address = + panvk_buffer_gpu_ptr(buffer, pOffsets[i]); + cmdbuf->state.vb.bufs[firstBinding + i].size = + panvk_buffer_range(buffer, pOffsets[i], VK_WHOLE_SIZE); + } + + cmdbuf->state.vb.count = + MAX2(cmdbuf->state.vb.count, firstBinding + bindingCount); + desc_state->vs_attrib_bufs = desc_state->vs_attribs = 0; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdBindIndexBuffer)(VkCommandBuffer commandBuffer, + VkBuffer buffer, VkDeviceSize offset, + VkIndexType indexType) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + VK_FROM_HANDLE(panvk_buffer, buf, buffer); + + cmdbuf->state.ib.buffer = buf; + cmdbuf->state.ib.offset = offset; + switch (indexType) { + case VK_INDEX_TYPE_UINT16: + cmdbuf->state.ib.index_size = 16; + break; + case VK_INDEX_TYPE_UINT32: + cmdbuf->state.ib.index_size = 32; + break; + case VK_INDEX_TYPE_NONE_KHR: + cmdbuf->state.ib.index_size = 0; + break; + case VK_INDEX_TYPE_UINT8_EXT: + cmdbuf->state.ib.index_size = 8; + break; + default: + unreachable("Invalid index type\n"); + } +} + +static void +panvk_set_dyn_ssbo_pointers(struct panvk_descriptor_state *desc_state, + unsigned dyn_ssbo_offset, + struct panvk_descriptor_set *set) +{ + struct panvk_sysvals *sysvals = &desc_state->sysvals; + + for (unsigned i = 0; i < set->layout->num_dyn_ssbos; i++) { + const struct panvk_buffer_desc *ssbo = + &desc_state->dyn.ssbos[dyn_ssbo_offset + i]; + + sysvals->dyn_ssbos[dyn_ssbo_offset + i] = (struct panvk_ssbo_addr){ + .base_addr = panvk_buffer_gpu_ptr(ssbo->buffer, ssbo->offset), + .size = panvk_buffer_range(ssbo->buffer, ssbo->offset, ssbo->size), + }; + } + + desc_state->sysvals_ptr = 0; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdBindDescriptorSets)( + VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, + const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount, + const uint32_t *pDynamicOffsets) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + VK_FROM_HANDLE(panvk_pipeline_layout, playout, layout); + + struct panvk_descriptor_state *descriptors_state = + &cmdbuf->bind_points[pipelineBindPoint].desc_state; + + unsigned dynoffset_idx = 0; + for (unsigned i = 0; i < descriptorSetCount; ++i) { + unsigned idx = i + firstSet; + VK_FROM_HANDLE(panvk_descriptor_set, set, pDescriptorSets[i]); + + descriptors_state->sets[idx] = set; + + if (set->layout->num_dyn_ssbos || set->layout->num_dyn_ubos) { + unsigned dyn_ubo_offset = playout->sets[idx].dyn_ubo_offset; + unsigned dyn_ssbo_offset = playout->sets[idx].dyn_ssbo_offset; + + for (unsigned b = 0; b < set->layout->binding_count; b++) { + for (unsigned e = 0; e < set->layout->bindings[b].array_size; e++) { + struct panvk_buffer_desc *bdesc = NULL; + + if (set->layout->bindings[b].type == + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) { + bdesc = &descriptors_state->dyn.ubos[dyn_ubo_offset++]; + *bdesc = + set->dyn_ubos[set->layout->bindings[b].dyn_ubo_idx + e]; + } else if (set->layout->bindings[b].type == + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) { + bdesc = &descriptors_state->dyn.ssbos[dyn_ssbo_offset++]; + *bdesc = + set->dyn_ssbos[set->layout->bindings[b].dyn_ssbo_idx + e]; + } + + if (bdesc) { + bdesc->offset += pDynamicOffsets[dynoffset_idx++]; + } + } + } + } + + if (set->layout->num_dyn_ssbos) { + panvk_set_dyn_ssbo_pointers(descriptors_state, + playout->sets[idx].dyn_ssbo_offset, set); + } + + if (set->layout->num_dyn_ssbos) + descriptors_state->dirty |= PANVK_DYNAMIC_SSBO; + + if (set->layout->num_ubos || set->layout->num_dyn_ubos || + set->layout->num_dyn_ssbos || set->layout->desc_ubo_size) + descriptors_state->ubos = 0; + + if (set->layout->num_textures) + descriptors_state->textures = 0; + + if (set->layout->num_samplers) + descriptors_state->samplers = 0; + + if (set->layout->num_imgs) { + descriptors_state->vs_attrib_bufs = + descriptors_state->non_vs_attrib_bufs = 0; + descriptors_state->vs_attribs = descriptors_state->non_vs_attribs = 0; + } + } + + assert(dynoffset_idx == dynamicOffsetCount); +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdPushConstants)(VkCommandBuffer commandBuffer, + VkPipelineLayout layout, + VkShaderStageFlags stageFlags, uint32_t offset, + uint32_t size, const void *pValues) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + + memcpy(cmdbuf->push_constants + offset, pValues, size); + + if (stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) { + struct panvk_descriptor_state *desc_state = + panvk_cmd_get_desc_state(cmdbuf, GRAPHICS); + + desc_state->ubos = 0; + desc_state->push_constants = 0; + } + + if (stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) { + struct panvk_descriptor_state *desc_state = + panvk_cmd_get_desc_state(cmdbuf, COMPUTE); + + desc_state->ubos = 0; + desc_state->push_constants = 0; + } +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdBindPipeline)(VkCommandBuffer commandBuffer, + VkPipelineBindPoint pipelineBindPoint, + VkPipeline _pipeline) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + VK_FROM_HANDLE(panvk_pipeline, pipeline, _pipeline); + + cmdbuf->bind_points[pipelineBindPoint].pipeline = pipeline; + cmdbuf->state.fs_rsd = 0; + + if (pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) { + cmdbuf->state.varyings = pipeline->varyings; + + if (!(pipeline->dynamic_state_mask & + BITFIELD_BIT(VK_DYNAMIC_STATE_VIEWPORT))) { + cmdbuf->state.viewport = pipeline->viewport; + cmdbuf->state.dirty |= PANVK_DYNAMIC_VIEWPORT; + } + if (!(pipeline->dynamic_state_mask & + BITFIELD_BIT(VK_DYNAMIC_STATE_SCISSOR))) { + cmdbuf->state.scissor = pipeline->scissor; + cmdbuf->state.dirty |= PANVK_DYNAMIC_SCISSOR; + } + } + + /* Sysvals are passed through UBOs, we need dirty the UBO array if the + * pipeline contain shaders using sysvals. + */ + cmdbuf->bind_points[pipelineBindPoint].desc_state.ubos = 0; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdSetViewport)(VkCommandBuffer commandBuffer, + uint32_t firstViewport, uint32_t viewportCount, + const VkViewport *pViewports) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + assert(viewportCount == 1); + assert(!firstViewport); + + cmdbuf->state.viewport = pViewports[0]; + cmdbuf->state.vpd = 0; + cmdbuf->state.dirty |= PANVK_DYNAMIC_VIEWPORT; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdSetScissor)(VkCommandBuffer commandBuffer, + uint32_t firstScissor, uint32_t scissorCount, + const VkRect2D *pScissors) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + assert(scissorCount == 1); + assert(!firstScissor); + + cmdbuf->state.scissor = pScissors[0]; + cmdbuf->state.vpd = 0; + cmdbuf->state.dirty |= PANVK_DYNAMIC_SCISSOR; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdSetLineWidth)(VkCommandBuffer commandBuffer, float lineWidth) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + + cmdbuf->state.rast.line_width = lineWidth; + cmdbuf->state.dirty |= PANVK_DYNAMIC_LINE_WIDTH; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdSetDepthBias)(VkCommandBuffer commandBuffer, + float depthBiasConstantFactor, + float depthBiasClamp, + float depthBiasSlopeFactor) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + + cmdbuf->state.rast.depth_bias.constant_factor = depthBiasConstantFactor; + cmdbuf->state.rast.depth_bias.clamp = depthBiasClamp; + cmdbuf->state.rast.depth_bias.slope_factor = depthBiasSlopeFactor; + cmdbuf->state.dirty |= PANVK_DYNAMIC_DEPTH_BIAS; + cmdbuf->state.fs_rsd = 0; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdSetBlendConstants)(VkCommandBuffer commandBuffer, + const float blendConstants[4]) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + + for (unsigned i = 0; i < 4; i++) + cmdbuf->state.blend.constants[i] = CLAMP(blendConstants[i], 0.0f, 1.0f); + + cmdbuf->state.dirty |= PANVK_DYNAMIC_BLEND_CONSTANTS; + cmdbuf->state.fs_rsd = 0; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdSetDepthBounds)(VkCommandBuffer commandBuffer, + float minDepthBounds, float maxDepthBounds) +{ + panvk_stub(); +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdSetStencilCompareMask)(VkCommandBuffer commandBuffer, + VkStencilFaceFlags faceMask, + uint32_t compareMask) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + + if (faceMask & VK_STENCIL_FACE_FRONT_BIT) + cmdbuf->state.zs.s_front.compare_mask = compareMask; + + if (faceMask & VK_STENCIL_FACE_BACK_BIT) + cmdbuf->state.zs.s_back.compare_mask = compareMask; + + cmdbuf->state.dirty |= PANVK_DYNAMIC_STENCIL_COMPARE_MASK; + cmdbuf->state.fs_rsd = 0; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdSetStencilWriteMask)(VkCommandBuffer commandBuffer, + VkStencilFaceFlags faceMask, + uint32_t writeMask) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + + if (faceMask & VK_STENCIL_FACE_FRONT_BIT) + cmdbuf->state.zs.s_front.write_mask = writeMask; + + if (faceMask & VK_STENCIL_FACE_BACK_BIT) + cmdbuf->state.zs.s_back.write_mask = writeMask; + + cmdbuf->state.dirty |= PANVK_DYNAMIC_STENCIL_WRITE_MASK; + cmdbuf->state.fs_rsd = 0; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdSetStencilReference)(VkCommandBuffer commandBuffer, + VkStencilFaceFlags faceMask, + uint32_t reference) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + + if (faceMask & VK_STENCIL_FACE_FRONT_BIT) + cmdbuf->state.zs.s_front.ref = reference; + + if (faceMask & VK_STENCIL_FACE_BACK_BIT) + cmdbuf->state.zs.s_back.ref = reference; + + cmdbuf->state.dirty |= PANVK_DYNAMIC_STENCIL_REFERENCE; + cmdbuf->state.fs_rsd = 0; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdDrawIndirect)(VkCommandBuffer commandBuffer, VkBuffer _buffer, + VkDeviceSize offset, uint32_t drawCount, + uint32_t stride) +{ + panvk_stub(); +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdDrawIndexedIndirect)(VkCommandBuffer commandBuffer, + VkBuffer _buffer, VkDeviceSize offset, + uint32_t drawCount, uint32_t stride) +{ + panvk_stub(); +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdDispatchBase)(VkCommandBuffer commandBuffer, uint32_t base_x, + uint32_t base_y, uint32_t base_z, uint32_t x, + uint32_t y, uint32_t z) +{ + panvk_stub(); +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdDispatchIndirect)(VkCommandBuffer commandBuffer, + VkBuffer _buffer, VkDeviceSize offset) +{ + panvk_stub(); +} diff --git a/src/panfrost/vulkan/panvk_vX_meta_blit.c b/src/panfrost/vulkan/panvk_vX_meta_blit.c index 5b9bcfe060f..a3ee7778bf9 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_blit.c +++ b/src/panfrost/vulkan/panvk_vX_meta_blit.c @@ -127,7 +127,7 @@ panvk_meta_blit(struct panvk_cmd_buffer *cmdbuf, if (ctx.dst.cur_layer < 0) continue; - struct panvk_batch *batch = panvk_cmd_open_batch(cmdbuf); + struct panvk_batch *batch = panvk_per_arch(cmd_open_batch)(cmdbuf); mali_ptr tsd, tiler; views[0].first_layer = views[0].last_layer = ctx.dst.cur_layer; @@ -139,7 +139,7 @@ panvk_meta_blit(struct panvk_cmd_buffer *cmdbuf, panvk_per_arch(cmd_prepare_tiler_context)(cmdbuf); tsd = batch->tls.gpu; - tiler = batch->tiler.descs.gpu; + tiler = batch->tiler.ctx_desc.gpu; struct panfrost_ptr job = GENX(pan_blit)(&ctx, &cmdbuf->desc_pool.base, &batch->jc, tsd, tiler); diff --git a/src/panfrost/vulkan/panvk_vX_meta_clear.c b/src/panfrost/vulkan/panvk_vX_meta_clear.c index 1060be57e16..b12a2797c34 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_clear.c +++ b/src/panfrost/vulkan/panvk_vX_meta_clear.c @@ -288,7 +288,7 @@ panvk_meta_clear_attachment(struct panvk_cmd_buffer *cmdbuf, unsigned rt, enum glsl_base_type base_type = panvk_meta_get_format_type(pfmt); - mali_ptr tiler = batch->tiler.descs.gpu; + mali_ptr tiler = batch->tiler.ctx_desc.gpu; mali_ptr tsd = batch->tls.gpu; mali_ptr pushconsts = 0, rsd = 0; @@ -367,7 +367,7 @@ panvk_meta_clear_color_img(struct panvk_cmd_buffer *cmdbuf, for (unsigned layer = range->baseArrayLayer; layer < range->baseArrayLayer + layer_count; layer++) { view.first_layer = view.last_layer = layer; - panvk_cmd_open_batch(cmdbuf); + panvk_per_arch(cmd_open_batch)(cmdbuf); panvk_per_arch(cmd_alloc_fb_desc)(cmdbuf); panvk_per_arch(cmd_close_batch)(cmdbuf); } @@ -446,7 +446,7 @@ panvk_meta_clear_zs_img(struct panvk_cmd_buffer *cmdbuf, for (unsigned layer = range->baseArrayLayer; layer < range->baseArrayLayer + layer_count; layer++) { view.first_layer = view.last_layer = layer; - panvk_cmd_open_batch(cmdbuf); + panvk_per_arch(cmd_open_batch)(cmdbuf); panvk_per_arch(cmd_alloc_fb_desc)(cmdbuf); panvk_per_arch(cmd_close_batch)(cmdbuf); } diff --git a/src/panfrost/vulkan/panvk_vX_meta_copy.c b/src/panfrost/vulkan/panvk_vX_meta_copy.c index a81ea7f36ec..97b07ca55d1 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_copy.c +++ b/src/panfrost/vulkan/panvk_vX_meta_copy.c @@ -674,7 +674,7 @@ panvk_meta_copy_img2img(struct panvk_cmd_buffer *cmdbuf, mali_ptr src_coords = pan_pool_upload_aligned( &cmdbuf->desc_pool.base, src_rect, sizeof(src_rect), 64); - struct panvk_batch *batch = panvk_cmd_open_batch(cmdbuf); + struct panvk_batch *batch = panvk_per_arch(cmd_open_batch)(cmdbuf); dstview.first_layer = dstview.last_layer = l + first_dst_layer; batch->blit.src = src->bo; @@ -686,7 +686,7 @@ panvk_meta_copy_img2img(struct panvk_cmd_buffer *cmdbuf, mali_ptr tsd, tiler; tsd = batch->tls.gpu; - tiler = batch->tiler.descs.gpu; + tiler = batch->tiler.ctx_desc.gpu; struct panfrost_ptr job; @@ -1114,7 +1114,7 @@ panvk_meta_copy_buf2img(struct panvk_cmd_buffer *cmdbuf, mali_ptr src_coords = pan_pool_upload_aligned( &cmdbuf->desc_pool.base, src_rect, sizeof(src_rect), 64); - struct panvk_batch *batch = panvk_cmd_open_batch(cmdbuf); + struct panvk_batch *batch = panvk_per_arch(cmd_open_batch)(cmdbuf); view.first_layer = view.last_layer = l + first_layer; batch->blit.src = buf->bo; @@ -1126,7 +1126,7 @@ panvk_meta_copy_buf2img(struct panvk_cmd_buffer *cmdbuf, mali_ptr tsd, tiler; tsd = batch->tls.gpu; - tiler = batch->tiler.descs.gpu; + tiler = batch->tiler.ctx_desc.gpu; struct panfrost_ptr job; @@ -1531,7 +1531,7 @@ panvk_meta_copy_img2buf(struct panvk_cmd_buffer *cmdbuf, panvk_per_arch(cmd_close_batch)(cmdbuf); - struct panvk_batch *batch = panvk_cmd_open_batch(cmdbuf); + struct panvk_batch *batch = panvk_per_arch(cmd_open_batch)(cmdbuf); struct pan_tls_info tlsinfo = {0}; @@ -1716,7 +1716,7 @@ panvk_meta_copy_buf2buf(struct panvk_cmd_buffer *cmdbuf, panvk_per_arch(cmd_close_batch)(cmdbuf); - struct panvk_batch *batch = panvk_cmd_open_batch(cmdbuf); + struct panvk_batch *batch = panvk_per_arch(cmd_open_batch)(cmdbuf); panvk_per_arch(cmd_alloc_tls_desc)(cmdbuf, false); @@ -1865,7 +1865,7 @@ panvk_meta_fill_buf(struct panvk_cmd_buffer *cmdbuf, panvk_per_arch(cmd_close_batch)(cmdbuf); - struct panvk_batch *batch = panvk_cmd_open_batch(cmdbuf); + struct panvk_batch *batch = panvk_per_arch(cmd_open_batch)(cmdbuf); panvk_per_arch(cmd_alloc_tls_desc)(cmdbuf, false); @@ -1914,7 +1914,7 @@ panvk_meta_update_buf(struct panvk_cmd_buffer *cmdbuf, panvk_per_arch(cmd_close_batch)(cmdbuf); - struct panvk_batch *batch = panvk_cmd_open_batch(cmdbuf); + struct panvk_batch *batch = panvk_per_arch(cmd_open_batch)(cmdbuf); panvk_per_arch(cmd_alloc_tls_desc)(cmdbuf, false); diff --git a/src/panfrost/vulkan/panvk_vX_queue.c b/src/panfrost/vulkan/panvk_vX_queue.c index ef4f55dab50..d7fde3add7d 100644 --- a/src/panfrost/vulkan/panvk_vX_queue.c +++ b/src/panfrost/vulkan/panvk_vX_queue.c @@ -48,9 +48,11 @@ panvk_queue_submit_batch(struct panvk_queue *queue, struct panvk_batch *batch, memset((*job), 0, 4 * 4); /* Reset the tiler before re-issuing the batch */ - if (batch->tiler.descs.cpu) { - memcpy(batch->tiler.descs.cpu, batch->tiler.templ, - pan_size(TILER_CONTEXT) + pan_size(TILER_HEAP)); + if (batch->tiler.ctx_desc.cpu) { + memcpy(batch->tiler.heap_desc.cpu, &batch->tiler.heap_templ, + sizeof(batch->tiler.heap_templ)); + memcpy(batch->tiler.ctx_desc.cpu, &batch->tiler.ctx_templ, + sizeof(batch->tiler.ctx_templ)); } }