16 _renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO;
20 info.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
21 info.imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL;
25 info.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
26 info.imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL;
33 _renderingInfo.renderArea.offset.x = 0;
34 _renderingInfo.renderArea.offset.y = 0;
35 _renderingInfo.renderArea.extent.width =
getWidth();
36 _renderingInfo.renderArea.extent.height =
getHeight();
37 _renderingInfo.layerCount = 1u;
48 if ( source ==
nullptr || !
IsValid(params) )
74 std::array<VkImageMemoryBarrier2, 2> imageBarriers{};
75 U8 imageBarrierCount = 0u;
83 const bool isDepthTextureIn =
IsDepthTexture( vkTexIn->descriptor()._packing );
84 const bool isDepthTextureOut =
IsDepthTexture( vkTexOut->descriptor()._packing );
93 const VkImageSubresourceRange subResourceIn = {
95 .baseMipLevel =
entry._input._mipOffset,
96 .levelCount =
entry._mipCount,
97 .baseArrayLayer =
entry._input._layerOffset,
98 .layerCount = layerCount
100 const VkImageSubresourceRange subResourceOut = {
102 .baseMipLevel =
entry._output._mipOffset,
103 .levelCount =
entry._mipCount,
104 .baseArrayLayer =
entry._output._layerOffset,
105 .layerCount = layerCount
118 if ( imageBarrierCount > 0u )
120 dependencyInfo.imageMemoryBarrierCount = imageBarrierCount;
121 dependencyInfo.pImageMemoryBarriers = imageBarriers.data();
123 VK_PROFILE( vkCmdPipelineBarrier2, cmdBuffer, &dependencyInfo );
124 imageBarrierCount = 0u;
128 U8 blitRegionCount = 0u;
131 for (
U8 mip = 0u; mip <
entry._mipCount; ++mip )
133 const VkImageSubresourceLayers srcSubResource = {
134 .aspectMask = VkImageAspectFlags(
entry._input._index ==
RT_DEPTH_ATTACHMENT_IDX ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT ),
135 .mipLevel =
to_U32(
entry._input._mipOffset + mip ),
136 .baseArrayLayer =
entry._input._layerOffset,
137 .layerCount = layerCount,
140 const VkImageSubresourceLayers dstSubResource = {
141 .aspectMask = VkImageAspectFlags(
entry._output._index ==
RT_DEPTH_ATTACHMENT_IDX ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT ),
142 .mipLevel =
to_U32(
entry._output._mipOffset + mip ),
143 .baseArrayLayer =
entry._output._layerOffset,
144 .layerCount = layerCount,
147 VkImageBlit2& blitRegion = blitRegions[blitRegionCount++];
150 .sType = VK_STRUCTURE_TYPE_IMAGE_BLIT_2,
151 .srcSubresource = srcSubResource,
152 .dstSubresource = dstSubResource,
155 blitRegion.srcOffsets[0] = blitRegion.dstOffsets[0] = {
161 blitRegion.srcOffsets[1] = {
162 .x = vkTexIn->width(),
163 .y = vkTexIn->height(),
167 blitRegion.dstOffsets[1] = {
168 .x = vkTexOut->width(),
169 .y = vkTexOut->height(),
174 if ( blitRegionCount > 0u )
176 const VkBlitImageInfo2 blitInfo = {
177 .sType = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2,
178 .srcImage = vkTexIn->image()->_image,
179 .srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
180 .dstImage = vkTexOut->image()->_image,
181 .dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
182 .regionCount = blitRegionCount,
183 .pRegions = blitRegions,
184 .filter = VK_FILTER_NEAREST,
187 VK_PROFILE( vkCmdBlitImage2, cmdBuffer, &blitInfo );
198 if ( imageBarrierCount > 0u )
200 dependencyInfo.imageMemoryBarrierCount = imageBarrierCount;
201 dependencyInfo.pImageMemoryBarriers = imageBarriers.data();
203 VK_PROFILE( vkCmdPipelineBarrier2, cmdBuffer, &dependencyInfo );
204 imageBarrierCount = 0u;
218 thread_local std::array<VkImageMemoryBarrier2, RT_MAX_ATTACHMENT_COUNT * 2> memBarriers{};
219 U8 memBarrierCount = 0u;
265 assert( targetColourLayer.
_cubeFace == 0u );
304 if ( transitionMask[i] )
306 att->_attachmentUsage = usage;
316 DIVIDE_ASSERT( vkTexRender->sampleFlagBits() != VK_SAMPLE_COUNT_1_BIT && vkTexResolve->sampleFlagBits() == VK_SAMPLE_COUNT_1_BIT );
322 if ( att->_descriptor._externalAttachment !=
nullptr)
324 att->_descriptor._externalAttachment->_attachmentUsage = usage;
392 att->_attachmentUsage = usage;
403 DIVIDE_ASSERT(vkTexRender->sampleFlagBits() != VK_SAMPLE_COUNT_1_BIT && vkTexResolve->sampleFlagBits() == VK_SAMPLE_COUNT_1_BIT );
409 if ( att->_descriptor._externalAttachment !=
nullptr )
411 att->_descriptor._externalAttachment->_attachmentUsage = usage;
417 if ( memBarrierCount > 0u )
419 dependencyInfo.imageMemoryBarrierCount = memBarrierCount;
420 dependencyInfo.pImageMemoryBarriers = memBarriers.data();
422 VK_PROFILE( vkCmdPipelineBarrier2, cmdBuffer, &dependencyInfo );
431 static RTTransitionMask s_defaultTransitionMask = {
true,
true,
true,
true,
true };
435 assert(pipelineRenderingCreateInfoOut.sType == VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO);
440 bool needLayeredDepth =
false;
452 needLayeredDepth =
true;
463 U8 stagingIndex = 0u;
475 layerCount = std::max( layerCount, vkTexRender->depth() );
484 assert( targetColourLayer._cubeFace == 0u );
490 imageViewDescriptor._subRange._mipLevels = { descriptor.
_mipWriteLevel, 1u };
493 imageViewDescriptor._resolveTarget =
false;
494 imageViewDescriptor._format = vkTexRender->vkFormat();
499 info.imageView = vkTexRender->
getImageView( imageViewDescriptor );
502 info.clearValue = {};
503 info.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
507 if ( clearPolicy[i]._enabled )
509 *info.clearValue.color.float32 = *clearPolicy[i]._colour._v;
511 info.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
515 info.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
519 info.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
525 imageViewDescriptor._resolveTarget =
true;
529 info.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
532 info.resolveMode = VK_RESOLVE_MODE_AVERAGE_BIT;
533 info.resolveImageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
534 info.resolveImageView =
static_cast<vkTexture*
>(
Get(
_attachments[i]->resolvedTexture()))->getImageView( imageViewDescriptor );
549 pipelineRenderingCreateInfoOut.colorAttachmentCount = stagingIndex;
552 _renderingInfo.colorAttachmentCount = stagingIndex;
566 layerCount = std::max( layerCount, vkTexRender->depth() );
575 assert( targetColourLayer._cubeFace == 0u );
581 imageViewDescriptor._subRange._mipLevels = { descriptor.
_mipWriteLevel, 1u };
584 imageViewDescriptor._resolveTarget =
false;
585 imageViewDescriptor._format = vkTexRender->vkFormat();
609 imageViewDescriptor._resolveTarget =
true;
617 _depthAttachmentInfo.resolveImageLayout = hasStencil ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
621 pipelineRenderingCreateInfoOut.depthAttachmentFormat = vkTexRender->vkFormat();
626 pipelineRenderingCreateInfoOut.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
627 _renderingInfo.pDepthAttachment =
nullptr;
#define PROFILE_SCOPE_AUTO(CATEGORY)
#define PROFILE_SCOPE(NAME, CATEGORY)
#define PROFILE_VK_EVENT_AUTO_AND_CONTEX(BUFFER)
Rough around the edges Adapter pattern abstracting the actual rendering API and access to the GPU.
U16 getWidth() const noexcept
RenderTargetDescriptor _descriptor
virtual bool create()
Init all attachments. Returns false if already called.
U16 getHeight() const noexcept
RTAttachment_uptr _attachments[RT_MAX_ATTACHMENT_COUNT]
bool _attachmentsAutoResolve[RT_MAX_ATTACHMENT_COUNT]
bool _attachmentsUsed[RT_MAX_ATTACHMENT_COUNT]
ImageView getView() const noexcept
static void PushDebugMessage(VkCommandBuffer cmdBuffer, const char *message, U32 id=U32_MAX)
static void PopDebugMessage(VkCommandBuffer cmdBuffer)
void transitionAttachments(VkCommandBuffer cmdBuffer, const RTDrawDescriptor &descriptor, const RTTransitionMask &transitionMask, bool toWrite)
std::array< VkFormat, to_base(RTColourAttachmentSlot::COUNT)> _colourAttachmentFormats
std::array< VkRenderingAttachmentInfo, to_base(RTColourAttachmentSlot::COUNT)> _stagingColourAttachmentInfo
bool create() override
Init all attachments. Returns false if already called.
void begin(VkCommandBuffer cmdBuffer, const RTDrawDescriptor &descriptor, const RTClearDescriptor &clearPolicy, VkPipelineRenderingCreateInfo &pipelineRenderingCreateInfoOut)
void blitFrom(VkCommandBuffer cmdBuffer, vkRenderTarget *source, const RTBlitParams ¶ms) noexcept
RTDrawDescriptor _previousPolicy
VkRenderingAttachmentInfo _depthAttachmentInfo
vkRenderTarget(GFXDevice &context, const RenderTargetDescriptor &descriptor)
std::array< VkImageSubresourceRange, RT_MAX_ATTACHMENT_COUNT > _subresourceRange
std::array< VkRenderingAttachmentInfo, to_base(RTColourAttachmentSlot::COUNT)> _colourAttachmentInfo
void end(VkCommandBuffer cmdBuffer, const RTTransitionMask &mask)
static void TransitionTexture(TransitionType type, const VkImageSubresourceRange &subresourceRange, VkImage image, VkImageMemoryBarrier2 &memBarrier)
VkImageView getImageView(const CachedImageView::Descriptor &descriptor) const
@ SHADER_READ_TO_BLIT_WRITE_DEPTH
@ BLIT_READ_TO_SHADER_READ_DEPTH
@ BLIT_WRITE_TO_SHADER_READ_DEPTH
@ SHADER_READ_TO_DEPTH_ATTACHMENT
@ SHADER_READ_TO_BLIT_READ_COLOUR
@ UNDEFINED_TO_COLOUR_ATTACHMENT
@ SHADER_READ_TO_BLIT_WRITE_COLOUR
@ SHADER_READ_TO_DEPTH_STENCIL_ATTACHMENT
@ UNDEFINED_TO_DEPTH_ATTACHMENT
@ BLIT_READ_TO_SHADER_READ_COLOUR
@ SHADER_READ_TO_COLOUR_ATTACHMENT
@ SHADER_READ_TO_BLIT_READ_DEPTH
@ COLOUR_ATTACHMENT_TO_SHADER_READ
@ DEPTH_ATTACHMENT_TO_SHADER_READ
@ DEPTH_STENCIL_ATTACHMENT_TO_SHADER_READ
@ BLIT_WRITE_TO_SHADER_READ_COLOUR
@ UNDEFINED_TO_DEPTH_STENCIL_ATTACHMENT
static VkImageAspectFlags GetAspectFlags(const TextureDescriptor &descriptor) noexcept
constexpr Optick::Category::Type Graphics
VkDependencyInfo dependencyInfo()
Handle console commands that start with a forward slash.
constexpr U16 MAX_BLIT_ENTRIES
@ RT_DEPTH_STENCIL_ATTACHMENT
constexpr U8 INVALID_INDEX
eastl::fixed_vector< RTBlitEntry, MAX_BLIT_ENTRIES, false > RTBlitParams
constexpr U32 to_U32(const T value)
static constexpr U32 RT_DEPTH_ATTACHMENT_IDX
constexpr U16 to_U16(const T value)
bool IsCubeTexture(TextureType texType) noexcept
bool IsValid(const RTBlitParams ¶ms) noexcept
bool IsDepthTexture(GFXImagePacking packing) noexcept
std::array< RTClearEntry, RT_MAX_ATTACHMENT_COUNT > RTClearDescriptor
bool[RT_MAX_ATTACHMENT_COUNT] RTTransitionMask
FORCE_INLINE T * Get(const Handle< T > handle)
Project const SceneEntry & entry
constexpr auto to_base(const Type value) -> Type
U8 _cubeFace
Ignored for non cube textures.
bool _keepMSAADataAfterResolve
DrawLayerEntry _writeLayers[RT_MAX_ATTACHMENT_COUNT]
bool _layeredRendering
Set to true to bind all image layers to the render target (e.g. for Geometry Shader layered rendering...
#define VK_PROFILE(FUNCTION,...)