16 std::shared_ptr<TextureSourceVK> source)
17 :
Texture(source->GetTextureDescriptor()),
18 context_(
std::move(context)),
19 source_(
std::move(source)) {
27 void TextureVK::SetLabel(std::string_view label) {
29 if (!has_validation_layers_) {
32 auto context = context_.lock();
42 void TextureVK::SetLabel(std::string_view label, std::string_view trailing) {
44 auto context = context_.lock();
55 bool TextureVK::OnSetContents(
const uint8_t* contents,
58 if (!IsValid() || !contents) {
65 if (length != desc.GetByteSizeOfBaseMipLevel()) {
70 auto context = context_.lock();
72 VALIDATION_LOG <<
"Context died before setting contents on texture.";
77 context->GetResourceAllocator()->CreateBufferWithCopy(contents, length);
79 if (!staging_buffer) {
84 auto cmd_buffer = context->CreateCommandBuffer();
92 if (!cmd_buffer_vk.Track(staging_buffer) || !cmd_buffer_vk.Track(source_)) {
96 const auto& vk_cmd_buffer = cmd_buffer_vk.GetCommandBuffer();
99 barrier.cmd_buffer = vk_cmd_buffer;
100 barrier.new_layout = vk::ImageLayout::eTransferDstOptimal;
101 barrier.src_access = {};
102 barrier.src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
103 barrier.dst_access = vk::AccessFlagBits::eTransferWrite;
104 barrier.dst_stage = vk::PipelineStageFlagBits::eTransfer;
110 vk::BufferImageCopy copy;
111 copy.bufferOffset = 0u;
112 copy.bufferRowLength = 0u;
113 copy.bufferImageHeight = 0u;
114 copy.imageOffset.x = 0u;
115 copy.imageOffset.y = 0u;
116 copy.imageOffset.z = 0u;
117 copy.imageExtent.width = desc.size.width;
118 copy.imageExtent.height = desc.size.height;
119 copy.imageExtent.depth = 1u;
120 copy.imageSubresource.aspectMask =
122 copy.imageSubresource.mipLevel = 0u;
123 copy.imageSubresource.baseArrayLayer = slice;
124 copy.imageSubresource.layerCount = 1u;
126 vk_cmd_buffer.copyBufferToImage(
137 barrier.cmd_buffer = vk_cmd_buffer;
138 barrier.src_access = vk::AccessFlagBits::eColorAttachmentWrite |
139 vk::AccessFlagBits::eTransferWrite;
140 barrier.src_stage = vk::PipelineStageFlagBits::eColorAttachmentOutput |
141 vk::PipelineStageFlagBits::eTransfer;
142 barrier.dst_access = vk::AccessFlagBits::eShaderRead;
143 barrier.dst_stage = vk::PipelineStageFlagBits::eFragmentShader;
145 barrier.new_layout = vk::ImageLayout::eShaderReadOnlyOptimal;
152 return context->GetCommandQueue()->Submit({cmd_buffer}).ok();
155 bool TextureVK::OnSetContents(std::shared_ptr<const fml::Mapping> mapping,
159 return OnSetContents(mapping->GetMapping(), mapping->GetSize(), slice);
162 bool TextureVK::IsValid()
const {
171 return source_->GetImage();
175 return source_->GetImageView();
183 return source_ ? source_->SetLayout(barrier).ok() :
false;
187 vk::ImageLayout layout)
const {
188 return source_ ? source_->SetLayoutWithoutEncoding(layout)
189 : vk::ImageLayout::eUndefined;
193 return source_ ? source_->GetLayout() : vk::ImageLayout::eUndefined;
197 return source_->GetRenderTargetView();
202 source_->SetCachedFrameData(
data, sample_count);
207 return source_->GetCachedFrameData(sample_count);
215 return source_->IsSwapchainImage();
223 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
const FramebufferAndRenderPass & GetCachedFrameData(SampleCount sample_count) const
void SetMipMapGenerated()
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)
bool SetLayout(const BarrierVK &barrier) const
vk::ImageLayout GetLayout() const
vk::Image GetImage() const
void SetCachedFrameData(const FramebufferAndRenderPass &data, SampleCount sample_count)
bool HasValidationLayers()
constexpr vk::ImageAspectFlags ToImageAspectFlags(PixelFormat format)
Defines an operations and memory access barrier on a resource.
std::shared_ptr< const fml::Mapping > data