278 {
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
290
292 return false;
293 }
294
295
296
297
298
299
301 cmd,
303 vk::AccessFlagBits::eTransferWrite,
304 vk::AccessFlagBits::eTransferRead,
306 vk::ImageLayout::eTransferDstOptimal,
307 vk::PipelineStageFlagBits::eTransfer,
308 vk::PipelineStageFlagBits::eTransfer,
309 0u,
310 mip_count
311 );
312
313 vk::ImageMemoryBarrier barrier;
314 barrier.image =
image;
317 barrier.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
318 barrier.subresourceRange.baseArrayLayer = 0;
319 barrier.subresourceRange.layerCount = 1;
320 barrier.subresourceRange.levelCount = 1;
321
322
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
333
334
335
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
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
358
359
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
365 vk::ImageLayout::eTransferSrcOptimal,
367 vk::ImageLayout::eTransferDstOptimal,
368 1u,
369 &blit,
370 vk::Filter::eLinear
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
379
380
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
397
398 src.SetLayoutWithoutEncoding(vk::ImageLayout::eShaderReadOnlyOptimal);
399 src.SetMipMapGenerated();
400
401 return true;
402}
static TextureVK & Cast(Texture &base)
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
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)
std::shared_ptr< Texture > texture
#define VK_QUEUE_FAMILY_IGNORED