panvk: Make panvk_cmd_buffer per-gen
The command buffer state is going to be an object containing per-gen descriptors. Instead of pretending we can have gen-agnostic helpers, let's merge everything in panvk_vX_cmd_buffer.c, and make panvk_cmd_buffer.h a per-gen file. We will split this into sub-files (panvk_cmd_draw, panvk_cmd_desc, ...) further down the road, so we can specialize only specific bits (like descriptor tables, the way we issue draw/dispatch jobs, etc). Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Acked-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Reviewed-by: Mary Guillemard <mary.guillemard@collabora.com> Reviewed-by: Rebecca Mckeever <rebecca.mckeever@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28170>
This commit is contained in:

committed by
Marge Bot

parent
18e03803a7
commit
a790f77169
@@ -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',
|
||||
|
@@ -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();
|
||||
}
|
@@ -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 <stdint.h>
|
||||
|
||||
#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
|
||||
|
@@ -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();
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user