Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | List of all members
impeller::BlitGenerateMipmapCommandVK Struct Reference

#include <blit_command_vk.h>

Inheritance diagram for impeller::BlitGenerateMipmapCommandVK:
impeller::BlitGenerateMipmapCommand impeller::BlitEncodeVK impeller::BlitCommand impeller::BackendCast< BlitEncodeVK, BlitCommand >

Public Member Functions

 ~BlitGenerateMipmapCommandVK () override
 
std::string GetLabel () const override
 
bool Encode (CommandEncoderVK &encoder) const override
 
- Public Member Functions inherited from impeller::BlitEncodeVK
virtual ~BlitEncodeVK ()
 

Additional Inherited Members

- Static Public Member Functions inherited from impeller::BackendCast< BlitEncodeVK, BlitCommand >
static BlitEncodeVKCast (BlitCommand &base)
 
static const BlitEncodeVKCast (const BlitCommand &base)
 
static BlitEncodeVKCast (BlitCommand *base)
 
static const BlitEncodeVKCast (const BlitCommand *base)
 
- Public Attributes inherited from impeller::BlitGenerateMipmapCommand
std::shared_ptr< Texturetexture
 
- Public Attributes inherited from impeller::BlitCommand
std::string label
 

Detailed Description

Definition at line 56 of file blit_command_vk.h.

Constructor & Destructor Documentation

◆ ~BlitGenerateMipmapCommandVK()

impeller::BlitGenerateMipmapCommandVK::~BlitGenerateMipmapCommandVK ( )
overridedefault

Member Function Documentation

◆ Encode()

bool impeller::BlitGenerateMipmapCommandVK::Encode ( CommandEncoderVK encoder) const
overridevirtual

Implements impeller::BlitEncodeVK.

Definition at line 278 of file blit_command_vk.cc.

278 {
279 auto& src = TextureVK::Cast(*texture);
280
281 const auto size = src.GetTextureDescriptor().size;
282 uint32_t mip_count = src.GetTextureDescriptor().mip_count;
283
284 if (mip_count < 2u) {
285 return true;
286 }
287
288 const auto& image = src.GetImage();
289 const auto& cmd = encoder.GetCommandBuffer();
290
291 if (!encoder.Track(texture)) {
292 return false;
293 }
294
295 // Initialize all mip levels to be in TransferDst mode. Later, in a loop,
296 // after writing to that mip level, we'll first switch its layout to
297 // TransferSrc to prepare the mip level after it, use the image as the source
298 // of the blit, before finally switching it to ShaderReadOnly so its available
299 // for sampling in a shader.
301 cmd, // command buffer
302 image, // image
303 vk::AccessFlagBits::eTransferWrite, // src access mask
304 vk::AccessFlagBits::eTransferRead, // dst access mask
305 src.GetLayout(), // old layout
306 vk::ImageLayout::eTransferDstOptimal, // new layout
307 vk::PipelineStageFlagBits::eTransfer, // src stage
308 vk::PipelineStageFlagBits::eTransfer, // dst stage
309 0u, // mip level
310 mip_count // mip level count
311 );
312
313 vk::ImageMemoryBarrier barrier;
314 barrier.image = image;
315 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
316 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
317 barrier.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
318 barrier.subresourceRange.baseArrayLayer = 0;
319 barrier.subresourceRange.layerCount = 1;
320 barrier.subresourceRange.levelCount = 1;
321
322 // Blit from the mip level N - 1 to mip level N.
323 size_t width = size.width;
324 size_t height = size.height;
325 for (size_t mip_level = 1u; mip_level < mip_count; mip_level++) {
326 barrier.subresourceRange.baseMipLevel = mip_level - 1;
327 barrier.oldLayout = vk::ImageLayout::eTransferDstOptimal;
328 barrier.newLayout = vk::ImageLayout::eTransferSrcOptimal;
329 barrier.srcAccessMask = vk::AccessFlagBits::eTransferWrite;
330 barrier.dstAccessMask = vk::AccessFlagBits::eTransferRead;
331
332 // We just finished writing to the previous (N-1) mip level or it was the
333 // base mip level. These were initialized to TransferDst earler. We are now
334 // going to read from it to write to the current level (N) . So it must be
335 // converted to TransferSrc.
336 cmd.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer,
337 vk::PipelineStageFlagBits::eTransfer, {}, {}, {},
338 {barrier});
339
340 vk::ImageBlit blit;
341 blit.srcSubresource.aspectMask = vk::ImageAspectFlagBits::eColor;
342 blit.srcSubresource.baseArrayLayer = 0u;
343 blit.srcSubresource.layerCount = 1u;
344 blit.srcSubresource.mipLevel = mip_level - 1;
345
346 blit.dstSubresource.aspectMask = vk::ImageAspectFlagBits::eColor;
347 blit.dstSubresource.baseArrayLayer = 0u;
348 blit.dstSubresource.layerCount = 1u;
349 blit.dstSubresource.mipLevel = mip_level;
350
351 // offsets[0] is origin.
352 blit.srcOffsets[1].x = std::max<int32_t>(width, 1u);
353 blit.srcOffsets[1].y = std::max<int32_t>(height, 1u);
354 blit.srcOffsets[1].z = 1u;
355
356 width = width / 2;
357 height = height / 2;
358
359 // offsets[0] is origin.
360 blit.dstOffsets[1].x = std::max<int32_t>(width, 1u);
361 blit.dstOffsets[1].y = std::max<int32_t>(height, 1u);
362 blit.dstOffsets[1].z = 1u;
363
364 cmd.blitImage(image, // src image
365 vk::ImageLayout::eTransferSrcOptimal, // src layout
366 image, // dst image
367 vk::ImageLayout::eTransferDstOptimal, // dst layout
368 1u, // region count
369 &blit, // regions
370 vk::Filter::eLinear // filter
371 );
372
373 barrier.oldLayout = vk::ImageLayout::eTransferSrcOptimal;
374 barrier.newLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
375 barrier.srcAccessMask = vk::AccessFlagBits::eTransferRead;
376 barrier.dstAccessMask = vk::AccessFlagBits::eShaderRead;
377
378 // Now that the blit is done, the image at the previous level (N-1)
379 // is done reading from (TransferSrc)/ Now we must prepare it to be read
380 // from a shader (ShaderReadOnly).
381 cmd.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer,
382 vk::PipelineStageFlagBits::eFragmentShader, {}, {}, {},
383 {barrier});
384 }
385
386 barrier.subresourceRange.baseMipLevel = mip_count - 1;
387 barrier.oldLayout = vk::ImageLayout::eTransferDstOptimal;
388 barrier.newLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
389 barrier.srcAccessMask = vk::AccessFlagBits::eTransferWrite;
390 barrier.dstAccessMask = vk::AccessFlagBits::eShaderRead;
391
392 cmd.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer,
393 vk::PipelineStageFlagBits::eFragmentShader, {}, {}, {},
394 {barrier});
395
396 // We modified the layouts of this image from underneath it. Tell it its new
397 // state so it doesn't try to perform redundant transitions under the hood.
398 src.SetLayoutWithoutEncoding(vk::ImageLayout::eShaderReadOnlyOptimal);
399 src.SetMipMapGenerated();
400
401 return true;
402}
static TextureVK & Cast(Texture &base)
sk_sp< SkImage > image
Definition examples.cpp:29
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
Definition switches.h:259
static void InsertImageMemoryBarrier(const vk::CommandBuffer &cmd, const vk::Image &image, vk::AccessFlags src_access_mask, vk::AccessFlags dst_access_mask, vk::ImageLayout old_layout, vk::ImageLayout new_layout, vk::PipelineStageFlags src_stage, vk::PipelineStageFlags dst_stage, uint32_t base_mip_level, uint32_t mip_level_count=1u)
int32_t height
int32_t width
std::shared_ptr< Texture > texture
#define VK_QUEUE_FAMILY_IGNORED

◆ GetLabel()

std::string impeller::BlitGenerateMipmapCommandVK::GetLabel ( ) const
overridevirtual

Implements impeller::BlitEncodeVK.

Definition at line 274 of file blit_command_vk.cc.

274 {
275 return label;
276}

The documentation for this struct was generated from the following files: