Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Macros | Functions
GrVkGpu.cpp File Reference
#include "src/gpu/ganesh/vk/GrVkGpu.h"
#include "include/core/SkTextureCompressionType.h"
#include "include/gpu/GrBackendSemaphore.h"
#include "include/gpu/GrBackendSurface.h"
#include "include/gpu/GrContextOptions.h"
#include "include/gpu/GrDirectContext.h"
#include "include/gpu/ganesh/vk/GrVkBackendSemaphore.h"
#include "include/gpu/ganesh/vk/GrVkBackendSurface.h"
#include "include/gpu/vk/GrVkTypes.h"
#include "include/gpu/vk/VulkanExtensions.h"
#include "include/private/base/SkTo.h"
#include "src/base/SkRectMemcpy.h"
#include "src/core/SkCompressedDataUtils.h"
#include "src/core/SkMipmap.h"
#include "src/core/SkTraceEvent.h"
#include "src/gpu/DataUtils.h"
#include "src/gpu/ganesh/GrBackendUtils.h"
#include "src/gpu/ganesh/GrDataUtils.h"
#include "src/gpu/ganesh/GrDirectContextPriv.h"
#include "src/gpu/ganesh/GrGeometryProcessor.h"
#include "src/gpu/ganesh/GrGpuResourceCacheAccess.h"
#include "src/gpu/ganesh/GrNativeRect.h"
#include "src/gpu/ganesh/GrPipeline.h"
#include "src/gpu/ganesh/GrPixmap.h"
#include "src/gpu/ganesh/GrRenderTarget.h"
#include "src/gpu/ganesh/GrResourceProvider.h"
#include "src/gpu/ganesh/GrTexture.h"
#include "src/gpu/ganesh/GrThreadSafePipelineBuilder.h"
#include "src/gpu/ganesh/SkGr.h"
#include "src/gpu/ganesh/image/SkImage_Ganesh.h"
#include "src/gpu/ganesh/surface/SkSurface_Ganesh.h"
#include "src/gpu/ganesh/vk/GrVkBuffer.h"
#include "src/gpu/ganesh/vk/GrVkCommandBuffer.h"
#include "src/gpu/ganesh/vk/GrVkCommandPool.h"
#include "src/gpu/ganesh/vk/GrVkFramebuffer.h"
#include "src/gpu/ganesh/vk/GrVkImage.h"
#include "src/gpu/ganesh/vk/GrVkOpsRenderPass.h"
#include "src/gpu/ganesh/vk/GrVkPipeline.h"
#include "src/gpu/ganesh/vk/GrVkPipelineState.h"
#include "src/gpu/ganesh/vk/GrVkRenderPass.h"
#include "src/gpu/ganesh/vk/GrVkResourceProvider.h"
#include "src/gpu/ganesh/vk/GrVkSemaphore.h"
#include "src/gpu/ganesh/vk/GrVkTexture.h"
#include "src/gpu/ganesh/vk/GrVkTextureRenderTarget.h"
#include "src/gpu/vk/VulkanAMDMemoryAllocator.h"
#include "src/gpu/vk/VulkanInterface.h"
#include "src/gpu/vk/VulkanMemory.h"
#include "src/gpu/vk/VulkanUtilsPriv.h"
#include "include/gpu/vk/VulkanTypes.h"
#include "include/private/gpu/vk/SkiaVulkan.h"

Go to the source code of this file.

Macros

#define VK_CALL(X)   GR_VK_CALL(this->vkInterface(), X)
 
#define VK_CALL_RET(RET, X)   GR_VK_CALL_RESULT(this, RET, X)
 

Functions

static void add_transfer_dst_buffer_mem_barrier (GrVkGpu *gpu, GrVkBuffer *dst, size_t offset, size_t size, bool after)
 
static size_t fill_in_compressed_regions (GrStagingBufferManager *stagingBufferManager, TArray< VkBufferImageCopy > *regions, TArray< size_t > *individualMipOffsets, GrStagingBufferManager::Slice *slice, SkTextureCompressionType compression, VkFormat vkFormat, SkISize dimensions, skgpu::Mipmapped mipmapped)
 
static bool check_image_info (const GrVkCaps &caps, const GrVkImageInfo &info, bool needsAllocation, uint32_t graphicsQueueIndex)
 
static bool check_tex_image_info (const GrVkCaps &caps, const GrVkImageInfo &info)
 
static bool check_rt_image_info (const GrVkCaps &caps, const GrVkImageInfo &info, bool resolveOnly)
 
bool copy_src_data (char *mapPtr, VkFormat vkFormat, const TArray< size_t > &individualMipOffsets, const GrPixmap srcData[], int numMipLevels)
 
void set_layout_and_queue_from_mutable_state (GrVkGpu *gpu, GrVkImage *image, VkImageLayout newLayout, uint32_t newQueueFamilyIndex)
 

Macro Definition Documentation

◆ VK_CALL

#define VK_CALL (   X)    GR_VK_CALL(this->vkInterface(), X)

Definition at line 63 of file GrVkGpu.cpp.

◆ VK_CALL_RET

#define VK_CALL_RET (   RET,
  X 
)    GR_VK_CALL_RESULT(this, RET, X)

Definition at line 64 of file GrVkGpu.cpp.

Function Documentation

◆ add_transfer_dst_buffer_mem_barrier()

static void add_transfer_dst_buffer_mem_barrier ( GrVkGpu gpu,
GrVkBuffer dst,
size_t  offset,
size_t  size,
bool  after 
)
static

Definition at line 566 of file GrVkGpu.cpp.

570 {
571 if (dst->intendedType() != GrGpuBufferType::kIndex &&
572 dst->intendedType() != GrGpuBufferType::kVertex) {
573 return;
574 }
575
576 VkAccessFlags srcAccessMask = dst->intendedType() == GrGpuBufferType::kIndex
580
583
584 if (after) {
585 using std::swap;
586 swap(srcAccessMask, dstAccessMask );
587 swap(srcPipelineStageFlags, dstPipelineStageFlags);
588 }
589
590 VkBufferMemoryBarrier bufferMemoryBarrier = {
592 nullptr, // pNext
593 srcAccessMask, // srcAccessMask
594 dstAccessMask, // dstAccessMask
595 VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
596 VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
597 dst->vkBuffer(), // buffer
598 offset, // offset
599 size, // size
600 };
601
602 gpu->addBufferMemoryBarrier(srcPipelineStageFlags,
603 dstPipelineStageFlags,
604 /*byRegion=*/false,
605 &bufferMemoryBarrier);
606}
void addBufferMemoryBarrier(const GrManagedResource *, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, bool byRegion, VkBufferMemoryBarrier *barrier) const
Definition GrVkGpu.cpp:2143
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
dst
Definition cp.py:12
static void swap(TArray< T, M > &a, TArray< T, M > &b)
Definition SkTArray.h:737
Point offset
VkFlags VkAccessFlags
@ VK_ACCESS_TRANSFER_WRITE_BIT
@ VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT
@ VK_ACCESS_INDEX_READ_BIT
VkPipelineStageFlagBits
@ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
@ VK_PIPELINE_STAGE_TRANSFER_BIT
#define VK_QUEUE_FAMILY_IGNORED
@ VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER

◆ check_image_info()

static bool check_image_info ( const GrVkCaps caps,
const GrVkImageInfo info,
bool  needsAllocation,
uint32_t  graphicsQueueIndex 
)
static

Definition at line 1291 of file GrVkGpu.cpp.

1294 {
1295 if (VK_NULL_HANDLE == info.fImage) {
1296 return false;
1297 }
1298
1299 if (VK_NULL_HANDLE == info.fAlloc.fMemory && needsAllocation) {
1300 return false;
1301 }
1302
1303 if (info.fImageLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR && !caps.supportsSwapchain()) {
1304 return false;
1305 }
1306
1307 if (info.fCurrentQueueFamily != VK_QUEUE_FAMILY_IGNORED &&
1308 info.fCurrentQueueFamily != VK_QUEUE_FAMILY_EXTERNAL &&
1309 info.fCurrentQueueFamily != VK_QUEUE_FAMILY_FOREIGN_EXT) {
1310 if (info.fSharingMode == VK_SHARING_MODE_EXCLUSIVE) {
1311 if (info.fCurrentQueueFamily != graphicsQueueIndex) {
1312 return false;
1313 }
1314 } else {
1315 return false;
1316 }
1317 }
1318
1319 if (info.fYcbcrConversionInfo.isValid()) {
1320 if (!caps.supportsYcbcrConversion()) {
1321 return false;
1322 }
1323 if (info.fYcbcrConversionInfo.fExternalFormat != 0) {
1324 return true;
1325 }
1326 }
1327
1328 // We currently require everything to be made with transfer bits set
1329 if (!SkToBool(info.fImageUsageFlags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) ||
1330 !SkToBool(info.fImageUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT)) {
1331 return false;
1332 }
1333
1334 return true;
1335}
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
static constexpr bool SkToBool(const T &x)
Definition SkTo.h:35
bool supportsYcbcrConversion() const
Definition GrVkCaps.h:153
bool supportsSwapchain() const
Definition GrVkCaps.h:126
@ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
@ VK_SHARING_MODE_EXCLUSIVE
@ VK_IMAGE_USAGE_TRANSFER_DST_BIT
@ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
#define VK_QUEUE_FAMILY_FOREIGN_EXT
#define VK_NULL_HANDLE
Definition vulkan_core.h:46
#define VK_QUEUE_FAMILY_EXTERNAL

◆ check_rt_image_info()

static bool check_rt_image_info ( const GrVkCaps caps,
const GrVkImageInfo info,
bool  resolveOnly 
)
static

Definition at line 1379 of file GrVkGpu.cpp.

1379 {
1380 if (!caps.isFormatRenderable(info.fFormat, info.fSampleCount)) {
1381 return false;
1382 }
1383 if (!resolveOnly && !SkToBool(info.fImageUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) {
1384 return false;
1385 }
1386 return true;
1387}
bool isFormatRenderable(const GrBackendFormat &format, int sampleCount) const override
@ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT

◆ check_tex_image_info()

static bool check_tex_image_info ( const GrVkCaps caps,
const GrVkImageInfo info 
)
static

Definition at line 1337 of file GrVkGpu.cpp.

1337 {
1338 // We don't support directly importing multisampled textures for sampling from shaders.
1339 if (info.fSampleCount != 1) {
1340 return false;
1341 }
1342
1343 if (info.fYcbcrConversionInfo.isValid() && info.fYcbcrConversionInfo.fExternalFormat != 0) {
1344 return true;
1345 }
1346 if (info.fImageTiling == VK_IMAGE_TILING_OPTIMAL) {
1347 if (!caps.isVkFormatTexturable(info.fFormat)) {
1348 return false;
1349 }
1350 } else if (info.fImageTiling == VK_IMAGE_TILING_LINEAR) {
1351 if (!caps.isVkFormatTexturableLinearly(info.fFormat)) {
1352 return false;
1353 }
1354 } else if (info.fImageTiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
1355 if (!caps.supportsDRMFormatModifiers()) {
1356 return false;
1357 }
1358 // To be technically correct we should query the vulkan support for VkFormat and
1359 // drmFormatModifier pairs to confirm the required feature support is there. However, we
1360 // currently don't have our caps and format tables set up to do this effeciently. So
1361 // instead we just rely on the client's passed in VkImageUsageFlags and assume they we set
1362 // up using valid features (checked below). In practice this should all be safe because
1363 // currently we are setting all drm format modifier textures to have a
1364 // GrTextureType::kExternal so we just really need to be able to read these video VkImage in
1365 // a shader. The video decoder isn't going to give us VkImages that don't support being
1366 // sampled.
1367 } else {
1369 }
1370
1371 // We currently require all textures to be made with sample support
1372 if (!SkToBool(info.fImageUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT)) {
1373 return false;
1374 }
1375
1376 return true;
1377}
#define SkUNREACHABLE
Definition SkAssert.h:135
bool isVkFormatTexturable(VkFormat) const
bool supportsDRMFormatModifiers() const
Definition GrVkCaps.h:168
bool isVkFormatTexturableLinearly(VkFormat format) const
Definition GrVkCaps.h:67
@ VK_IMAGE_TILING_OPTIMAL
@ VK_IMAGE_TILING_LINEAR
@ VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT
@ VK_IMAGE_USAGE_SAMPLED_BIT

◆ copy_src_data()

bool copy_src_data ( char *  mapPtr,
VkFormat  vkFormat,
const TArray< size_t > &  individualMipOffsets,
const GrPixmap  srcData[],
int  numMipLevels 
)

Definition at line 1641 of file GrVkGpu.cpp.

1645 {
1646 SkASSERT(srcData && numMipLevels);
1648 SkASSERT(individualMipOffsets.size() == numMipLevels);
1649 SkASSERT(mapPtr);
1650
1651 size_t bytesPerPixel = skgpu::VkFormatBytesPerBlock(vkFormat);
1652
1653 for (int level = 0; level < numMipLevels; ++level) {
1654 const size_t trimRB = srcData[level].info().width() * bytesPerPixel;
1655
1656 SkRectMemcpy(mapPtr + individualMipOffsets[level], trimRB,
1657 srcData[level].addr(), srcData[level].rowBytes(),
1658 trimRB, srcData[level].height());
1659 }
1660 return true;
1661}
#define SkASSERT(cond)
Definition SkAssert.h:116
static void SkRectMemcpy(void *dst, size_t dstRB, const void *src, size_t srcRB, size_t trimRowBytes, int rowCount)
int width() const
Definition GrImageInfo.h:54
const GrImageInfo & info() const
Definition GrPixmap.h:17
int size() const
Definition SkTArray.h:416
static constexpr size_t VkFormatBytesPerBlock(VkFormat vkFormat)
static constexpr bool VkFormatIsCompressed(VkFormat vkFormat)
int32_t height

◆ fill_in_compressed_regions()

static size_t fill_in_compressed_regions ( GrStagingBufferManager stagingBufferManager,
TArray< VkBufferImageCopy > *  regions,
TArray< size_t > *  individualMipOffsets,
GrStagingBufferManager::Slice slice,
SkTextureCompressionType  compression,
VkFormat  vkFormat,
SkISize  dimensions,
skgpu::Mipmapped  mipmapped 
)
static

Definition at line 897 of file GrVkGpu.cpp.

904 {
906 int numMipLevels = 1;
907 if (mipmapped == skgpu::Mipmapped::kYes) {
908 numMipLevels = SkMipmap::ComputeLevelCount(dimensions.width(), dimensions.height()) + 1;
909 }
910
911 regions->reserve_exact(regions->size() + numMipLevels);
912 individualMipOffsets->reserve_exact(individualMipOffsets->size() + numMipLevels);
913
914 size_t bytesPerBlock = skgpu::VkFormatBytesPerBlock(vkFormat);
915
916 size_t bufferSize = SkCompressedDataSize(
917 compression, dimensions, individualMipOffsets, mipmapped == skgpu::Mipmapped::kYes);
918 SkASSERT(individualMipOffsets->size() == numMipLevels);
919
920 // Get a staging buffer slice to hold our mip data.
921 // Vulkan requires offsets in the buffer to be aligned to multiple of the texel size and 4
922 size_t alignment = bytesPerBlock;
923 switch (alignment & 0b11) {
924 case 0: break; // alignment is already a multiple of 4.
925 case 2: alignment *= 2; break; // alignment is a multiple of 2 but not 4.
926 default: alignment *= 4; break; // alignment is not a multiple of 2.
927 }
928 *slice = stagingBufferManager->allocateStagingBufferSlice(bufferSize, alignment);
929 if (!slice->fBuffer) {
930 return 0;
931 }
932
933 for (int i = 0; i < numMipLevels; ++i) {
934 VkBufferImageCopy& region = regions->push_back();
935 memset(&region, 0, sizeof(VkBufferImageCopy));
936 region.bufferOffset = slice->fOffset + (*individualMipOffsets)[i];
937 SkISize revisedDimensions = skgpu::CompressedDimensions(compression, dimensions);
938 region.bufferRowLength = revisedDimensions.width();
939 region.bufferImageHeight = revisedDimensions.height();
940 region.imageSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, SkToU32(i), 0, 1};
941 region.imageOffset = {0, 0, 0};
942 region.imageExtent = {SkToU32(dimensions.width()),
943 SkToU32(dimensions.height()), 1};
944
945 dimensions = {std::max(1, dimensions.width() /2),
946 std::max(1, dimensions.height()/2)};
947 }
948
949 return bufferSize;
950}
size_t SkCompressedDataSize(SkTextureCompressionType type, SkISize dimensions, TArray< size_t > *individualMipOffsets, bool mipmapped)
constexpr uint32_t SkToU32(S x)
Definition SkTo.h:26
Slice allocateStagingBufferSlice(size_t size, size_t requiredAlignment=1)
static int ComputeLevelCount(int baseWidth, int baseHeight)
Definition SkMipmap.cpp:134
void reserve_exact(int n)
Definition SkTArray.h:176
ClipOpAndAA opAA SkRegion region
Definition SkRecords.h:238
SkISize CompressedDimensions(SkTextureCompressionType type, SkISize baseDimensions)
constexpr int32_t width() const
Definition SkSize.h:36
constexpr int32_t height() const
Definition SkSize.h:37
@ VK_IMAGE_ASPECT_COLOR_BIT

◆ set_layout_and_queue_from_mutable_state()

void set_layout_and_queue_from_mutable_state ( GrVkGpu gpu,
GrVkImage image,
VkImageLayout  newLayout,
uint32_t  newQueueFamilyIndex 
)

Definition at line 1915 of file GrVkGpu.cpp.

1917 {
1918 // Even though internally we use this helper for getting src access flags and stages they
1919 // can also be used for general dst flags since we don't know exactly what the client
1920 // plans on using the image for.
1921 if (newLayout == VK_IMAGE_LAYOUT_UNDEFINED) {
1922 newLayout = image->currentLayout();
1923 }
1925 VkAccessFlags dstAccess = GrVkImage::LayoutToSrcAccessMask(newLayout);
1926
1927 uint32_t currentQueueFamilyIndex = image->currentQueueFamilyIndex();
1928 auto isSpecialQueue = [](uint32_t queueFamilyIndex) {
1929 return queueFamilyIndex == VK_QUEUE_FAMILY_EXTERNAL ||
1930 queueFamilyIndex == VK_QUEUE_FAMILY_FOREIGN_EXT;
1931 };
1932 if (isSpecialQueue(currentQueueFamilyIndex) && isSpecialQueue(newQueueFamilyIndex)) {
1933 // It is illegal to have both the new and old queue be special queue families (i.e. external
1934 // or foreign).
1935 return;
1936 }
1937
1938 image->setImageLayoutAndQueueIndex(gpu, newLayout, dstAccess, dstStage, false,
1939 newQueueFamilyIndex);
1940}
static VkAccessFlags LayoutToSrcAccessMask(const VkImageLayout layout)
static VkPipelineStageFlags LayoutToPipelineSrcStageFlags(const VkImageLayout layout)
sk_sp< SkImage > image
Definition examples.cpp:29
VkFlags VkPipelineStageFlags
@ VK_IMAGE_LAYOUT_UNDEFINED