15 std::shared_ptr<TextureSourceVK> source)
16 :
Texture(source->GetTextureDescriptor()),
17 context_(
std::move(context)),
18 source_(
std::move(source)) {
26 void TextureVK::SetLabel(std::string_view label) {
28 if (!has_validation_layers_) {
31 auto context = context_.lock();
41 void TextureVK::SetLabel(std::string_view label, std::string_view trailing) {
43 auto context = context_.lock();
54 bool TextureVK::OnSetContents(
const uint8_t* contents,
57 if (!IsValid() || !contents) {
64 if (length != desc.GetByteSizeOfBaseMipLevel()) {
69 auto context = context_.lock();
71 VALIDATION_LOG <<
"Context died before setting contents on texture.";
76 context->GetResourceAllocator()->CreateBufferWithCopy(contents, length);
78 if (!staging_buffer) {
83 auto cmd_buffer = context->CreateCommandBuffer();
91 if (!cmd_buffer_vk.Track(staging_buffer) || !cmd_buffer_vk.Track(source_)) {
95 const auto& vk_cmd_buffer = cmd_buffer_vk.GetCommandBuffer();
98 barrier.cmd_buffer = vk_cmd_buffer;
99 barrier.new_layout = vk::ImageLayout::eTransferDstOptimal;
100 barrier.src_access = {};
101 barrier.src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
102 barrier.dst_access = vk::AccessFlagBits::eTransferWrite;
103 barrier.dst_stage = vk::PipelineStageFlagBits::eTransfer;
109 vk::BufferImageCopy copy;
110 copy.bufferOffset = 0u;
111 copy.bufferRowLength = 0u;
112 copy.bufferImageHeight = 0u;
113 copy.imageOffset.x = 0u;
114 copy.imageOffset.y = 0u;
115 copy.imageOffset.z = 0u;
116 copy.imageExtent.width = desc.size.width;
117 copy.imageExtent.height = desc.size.height;
118 copy.imageExtent.depth = 1u;
119 copy.imageSubresource.aspectMask =
121 copy.imageSubresource.mipLevel = 0u;
122 copy.imageSubresource.baseArrayLayer = slice;
123 copy.imageSubresource.layerCount = 1u;
125 vk_cmd_buffer.copyBufferToImage(
136 barrier.cmd_buffer = vk_cmd_buffer;
137 barrier.src_access = vk::AccessFlagBits::eColorAttachmentWrite |
138 vk::AccessFlagBits::eTransferWrite;
139 barrier.src_stage = vk::PipelineStageFlagBits::eColorAttachmentOutput |
140 vk::PipelineStageFlagBits::eTransfer;
141 barrier.dst_access = vk::AccessFlagBits::eShaderRead;
142 barrier.dst_stage = vk::PipelineStageFlagBits::eFragmentShader;
144 barrier.new_layout = vk::ImageLayout::eShaderReadOnlyOptimal;
151 return context->GetCommandQueue()->Submit({cmd_buffer}).ok();
154 bool TextureVK::OnSetContents(std::shared_ptr<const fml::Mapping> mapping,
158 return OnSetContents(mapping->GetMapping(), mapping->GetSize(), slice);
161 bool TextureVK::IsValid()
const {
170 return source_->GetImage();
174 return source_->GetImageView();
182 return source_ ? source_->SetLayout(barrier).ok() :
false;
186 vk::ImageLayout layout)
const {
187 return source_ ? source_->SetLayoutWithoutEncoding(layout)
188 : vk::ImageLayout::eUndefined;
192 return source_ ? source_->GetLayout() : vk::ImageLayout::eUndefined;
196 return source_->GetRenderTargetView();
201 source_->SetCachedFramebuffer(framebuffer);
206 source_->SetCachedRenderPass(render_pass);
210 return source_->GetCachedFramebuffer();
214 return source_->GetCachedRenderPass();
222 return source_->IsSwapchainImage();
230 std::shared_ptr<YUVConversionVK> conversion = source_->GetYUVConversion();
static ContextVK & Cast(Context &base)
bool SetDebugName(T handle, std::string_view label) const
vk::Buffer GetBuffer() const
std::shared_ptr< SamplerVK > CreateVariantForConversion(std::shared_ptr< YUVConversionVK > conversion) const
const TextureDescriptor & GetTextureDescriptor() const
vk::ImageView GetImageView() const
std::shared_ptr< const TextureSourceVK > GetTextureSource() const
bool IsSwapchainImage() const
vk::ImageView GetRenderTargetView() const
void SetCachedFramebuffer(const SharedHandleVK< vk::Framebuffer > &framebuffer)
void SetMipMapGenerated()
SharedHandleVK< vk::RenderPass > GetCachedRenderPass() const
vk::ImageLayout SetLayoutWithoutEncoding(vk::ImageLayout layout) const
std::shared_ptr< SamplerVK > GetImmutableSamplerVariant(const SamplerVK &sampler) const
ISize GetSize() const override
TextureVK(std::weak_ptr< Context > context, std::shared_ptr< TextureSourceVK > source)
SharedHandleVK< vk::Framebuffer > GetCachedFramebuffer() const
bool SetLayout(const BarrierVK &barrier) const
vk::ImageLayout GetLayout() const
void SetCachedRenderPass(const SharedHandleVK< vk::RenderPass > &render_pass)
vk::Image GetImage() const
std::shared_ptr< SharedObjectVKT< T > > SharedHandleVK
bool HasValidationLayers()
constexpr vk::ImageAspectFlags ToImageAspectFlags(PixelFormat format)
Defines an operations and memory access barrier on a resource.