63#define VK_CALL(X) GR_VK_CALL(this->vkInterface(), X)
64#define VK_CALL_RET(RET, X) GR_VK_CALL_RESULT(this, RET, X)
81 backendContext.
fGetProc(
"vkEnumerateInstanceVersion",
83 uint32_t instanceVersion = 0;
84 if (!localEnumerateInstanceVersion) {
87 VkResult err = localEnumerateInstanceVersion(&instanceVersion);
89 SkDebugf(
"Failed to enumerate instance version. Err: %d\n", err);
96 backendContext.
fGetProc(
"vkGetPhysicalDeviceProperties",
100 if (!localGetPhysicalDeviceProperties) {
104 localGetPhysicalDeviceProperties(backendContext.
fPhysicalDevice, &physDeviceProperties);
105 uint32_t physDevVersion = physDeviceProperties.
apiVersion;
110 instanceVersion = std::min(instanceVersion, apiVersion);
111 physDevVersion = std::min(physDevVersion, apiVersion);
122 if (!interface->validate(instanceVersion, physDevVersion, backendContext.
fVkExtensions)) {
141 if (!interface->validate(instanceVersion, physDevVersion, &extensions)) {
153 features2.
pNext =
nullptr;
156 features2, instanceVersion, physDevVersion,
161 features.
pNext =
nullptr;
181 features, instanceVersion, physDevVersion, extensions,
201 SkDEBUGFAIL(
"No supplied vulkan memory allocator and unable to create one internally.");
205 std::unique_ptr<GrVkGpu> vkGpu(
new GrVkGpu(direct,
213 !vkGpu->vkCaps().supportsProtectedContent()) {
225 uint32_t instanceVersion,
226 uint32_t physicalDeviceVersion,
229 , fInterface(
std::move(interface))
230 , fMemoryAllocator(
std::move(memoryAllocator))
231 , fVkCaps(
std::move(caps))
232 , fPhysicalDevice(backendContext.fPhysicalDevice)
233 , fDevice(backendContext.fDevice)
234 , fQueue(backendContext.fQueue)
235 , fQueueIndex(backendContext.fGraphicsQueueIndex)
236 , fResourceProvider(this)
237 , fStagingBufferManager(this)
238 , fDisconnected(false)
239 , fProtectedContext(backendContext.fProtectedContext)
240 , fDeviceLostContext(backendContext.fDeviceLostContext)
241 , fDeviceLostProc(backendContext.fDeviceLostProc) {
250 fResourceProvider.
init();
260void GrVkGpu::destroyResources() {
263 fMainCmdPool->
close();
270 fMainCmdPool->
unref();
271 fMainCmdPool =
nullptr;
274 for (
int i = 0; i < fSemaphoresToWaitOn.
size(); ++i) {
275 fSemaphoresToWaitOn[i]->unref();
277 fSemaphoresToWaitOn.
clear();
279 for (
int i = 0; i < fSemaphoresToSignal.
size(); ++i) {
280 fSemaphoresToSignal[i]->unref();
282 fSemaphoresToSignal.
clear();
284 fStagingBufferManager.
reset();
293 if (!fDisconnected) {
294 this->destroyResources();
298 fMemoryAllocator.
reset();
304 if (!fDisconnected) {
305 this->destroyResources();
307 fSemaphoresToWaitOn.
clear();
308 fSemaphoresToSignal.
clear();
309 fMainCmdBuffer =
nullptr;
310 fDisconnected =
true;
334 if (!fCachedOpsRenderPass) {
335 fCachedOpsRenderPass = std::make_unique<GrVkOpsRenderPass>(
this);
345 (this->vkCaps().supportsDiscardableMSAAForDMSAA() &&
363 bool withResolve =
false;
366 if (useMSAASurface && this->
vkCaps().renderTargetSupportsDiscardableMSAA(vkRT)) {
390 if (!fCachedOpsRenderPass->set(rt, std::move(framebuffer), origin, bounds, localColorInfo,
391 stencilInfo, resolveInfo, selfDepFlags, loadFromResolve,
395 return fCachedOpsRenderPass.get();
398bool GrVkGpu::submitCommandBuffer(SyncQueue sync) {
403 SkASSERT(!fCachedOpsRenderPass || !fCachedOpsRenderPass->isActive());
406 fSemaphoresToSignal.
empty() && fSemaphoresToWaitOn.
empty()) {
417 fMainCmdBuffer->
end(
this);
419 fMainCmdPool->
close();
420 bool didSubmit = fMainCmdBuffer->
submitToQueue(
this, fQueue, fSemaphoresToSignal,
421 fSemaphoresToWaitOn);
423 if (didSubmit && sync == kForce_SyncQueue) {
434 for (
int i = 0; i < fSemaphoresToWaitOn.
size(); ++i) {
435 fSemaphoresToWaitOn[i]->unref();
437 fSemaphoresToWaitOn.
clear();
444 for (
int i = 0; i < fSemaphoresToSignal.
size(); ++i) {
445 fSemaphoresToSignal[i]->unref();
447 fSemaphoresToSignal.
clear();
450 fMainCmdPool->
unref();
455 fMainCmdBuffer->
begin(
this);
457 fMainCmdBuffer =
nullptr;
500 bool prepForTexSampling) {
508 if (!mipLevelCount || !texels[0].fPixels) {
513 bool success =
false;
516 if (mipLevelCount > 1) {
517 SkDebugf(
"Can't upload mipmap data to linear tiled texture");
527 if (!this->submitCommandBuffer(kForce_SyncQueue)) {
531 success = this->uploadTexDataLinear(texImage,
535 texels[0].fRowBytes);
538 success = this->uploadTexDataOptimal(texImage,
543 if (1 == mipLevelCount) {
548 if (prepForTexSampling) {
586 swap(srcAccessMask, dstAccessMask );
587 swap(srcPipelineStageFlags, dstPipelineStageFlags);
603 dstPipelineStageFlags,
605 &bufferMemoryBarrier);
620 copyRegion.
size = size;
654 if ((bufferOffset & 0x3) || (bufferOffset % bpp)) {
667 if (!transferBuffer) {
671 if (bufferColorType != this->
vkCaps().transferColorType(
format, surfaceColorType)) {
681 region.bufferOffset = bufferOffset;
682 region.bufferRowLength = (uint32_t)(rowBytes/bpp);
683 region.bufferImageHeight = 0;
685 region.imageOffset = { rect.left(), rect.top(), 0 };
686 region.imageExtent = { (uint32_t)rect.width(), (uint32_t)rect.height(), 1 };
721 if (fProtectedContext == GrProtected::kYes) {
730 if (rt->wrapsSecondaryCommandBuffer()) {
733 if (!rt->nonMSAAAttachment()) {
736 srcImage = rt->nonMSAAAttachment();
751 region.bufferOffset =
offset;
752 region.bufferRowLength = rect.width();
753 region.bufferImageHeight = 0;
755 region.imageOffset = {rect.left(), rect.top(), 0};
756 region.imageExtent = {(uint32_t)rect.width(), (uint32_t)rect.height(), 1};
766 transferBuffer, 1, ®ion);
785 SkASSERT(src &&
src->colorAttachment() &&
src->colorAttachment()->numSamples() > 1);
798 dstImage =
static_cast<GrVkTexture*
>(dstTex)->textureImage();
811 src->colorAttachment()->setImageLayout(
this,
827 if (this->
vkCaps().renderTargetSupportsDiscardableMSAA(rt)) {
832 this->resolveImage(
target, rt, resolveRect,
836bool GrVkGpu::uploadTexDataLinear(
GrVkImage* texImage,
847 size_t trimRowBytes = rect.width() * bpp;
860 GR_VK_CALL(interface, GetImageSubresourceLayout(fDevice,
880 mapPtr =
reinterpret_cast<char*
>(mapPtr) +
offset;
883 static_cast<size_t>(layout.
rowPitch),
906 int numMipLevels = 1;
907 if (mipmapped == skgpu::Mipmapped::kYes) {
912 individualMipOffsets->
reserve_exact(individualMipOffsets->
size() + numMipLevels);
917 compression, dimensions, individualMipOffsets, mipmapped == skgpu::Mipmapped::kYes);
922 size_t alignment = bytesPerBlock;
923 switch (alignment & 0b11) {
925 case 2: alignment *= 2;
break;
926 default: alignment *= 4;
break;
933 for (
int i = 0; i < numMipLevels; ++i) {
936 region.bufferOffset = slice->
fOffset + (*individualMipOffsets)[i];
938 region.bufferRowLength = revisedDimensions.
width();
939 region.bufferImageHeight = revisedDimensions.
height();
941 region.imageOffset = {0, 0, 0};
945 dimensions = {std::max(1, dimensions.
width() /2),
946 std::max(1, dimensions.
height()/2)};
952bool GrVkGpu::uploadTexDataOptimal(
GrVkImage* texImage,
980 std::copy_n(texels, mipLevelCount, texelsShallowCopy.get());
983 size_t combinedBufferSize;
984 if (mipLevelCount > 1) {
987 &individualMipOffsets,
990 SkASSERT(texelsShallowCopy[0].fPixels && texelsShallowCopy[0].fRowBytes);
991 combinedBufferSize =
rect.width()*
rect.height()*bpp;
998 size_t alignment = bpp;
999 switch (alignment & 0b11) {
1001 case 2: alignment *= 2;
break;
1002 default: alignment *= 4;
break;
1010 int uploadLeft =
rect.left();
1011 int uploadTop =
rect.top();
1016 int currentWidth =
rect.width();
1017 int currentHeight =
rect.height();
1018 for (
int currentMipLevel = 0; currentMipLevel < mipLevelCount; currentMipLevel++) {
1019 if (texelsShallowCopy[currentMipLevel].fPixels) {
1020 const size_t trimRowBytes = currentWidth * bpp;
1021 const size_t rowBytes = texelsShallowCopy[currentMipLevel].fRowBytes;
1024 char*
dst =
buffer + individualMipOffsets[currentMipLevel];
1025 const char*
src = (
const char*)texelsShallowCopy[currentMipLevel].fPixels;
1026 SkRectMemcpy(dst, trimRowBytes, src, rowBytes, trimRowBytes, currentHeight);
1030 region.bufferOffset = slice.
fOffset + individualMipOffsets[currentMipLevel];
1031 region.bufferRowLength = currentWidth;
1032 region.bufferImageHeight = currentHeight;
1034 region.imageOffset = {uploadLeft, uploadTop, 0};
1035 region.imageExtent = {(uint32_t)currentWidth, (uint32_t)currentHeight, 1};
1038 currentWidth = std::max(1, currentWidth/2);
1039 currentHeight = std::max(1, currentHeight/2);
1066bool GrVkGpu::uploadTexDataCompressed(
GrVkImage* uploadTexture,
1096 &individualMipOffsets,
1102 if (!slice.fBuffer) {
1105 SkASSERT(dataSize == combinedBufferSize);
1109 memcpy(
buffer, data, dataSize);
1140 int renderTargetSampleCnt,
1144 uint32_t levelClearMask,
1145 std::string_view label) {
1155 if (renderable == GrRenderable::kYes) {
1157 this, budgeted, dimensions, pixelFormat, mipLevelCount, renderTargetSampleCnt,
1158 mipmapStatus, isProtected, label);
1161 mipLevelCount, isProtected, mipmapStatus, label);
1168 if (levelClearMask) {
1173 bool inRange =
false;
1174 GrVkImage* texImage = tex->textureImage();
1175 for (uint32_t i = 0; i < texImage->
mipLevels(); ++i) {
1176 if (levelClearMask & (1U << i)) {
1178 ranges.
back().levelCount++;
1182 range.baseArrayLayer = 0;
1183 range.baseMipLevel = i;
1184 range.layerCount = 1;
1185 range.levelCount = 1;
1188 }
else if (inRange) {
1213 int numMipLevels = 1;
1214 if (mipmapped == skgpu::Mipmapped::kYes) {
1218 GrMipmapStatus mipmapStatus = (mipmapped == skgpu::Mipmapped::kYes)
1229 "VkGpu_CreateCompressedTexture");
1235 if (!this->uploadTexDataCompressed(tex->textureImage(), compression, pixelFormat,
1236 dimensions, mipmapped, data, dataSize)) {
1293 bool needsAllocation,
1294 uint32_t graphicsQueueIndex) {
1311 if (
info.fCurrentQueueFamily != graphicsQueueIndex) {
1319 if (
info.fYcbcrConversionInfo.isValid()) {
1323 if (
info.fYcbcrConversionInfo.fExternalFormat != 0) {
1339 if (
info.fSampleCount != 1) {
1343 if (
info.fYcbcrConversionInfo.isValid() &&
info.fYcbcrConversionInfo.fExternalFormat != 0) {
1407 if (backendTex.
isProtected() && (fProtectedContext == GrProtected::kNo)) {
1414 ioType, imageInfo, std::move(mutableState));
1442 bool resolveOnly = sampleCnt > 1;
1447 if (backendTex.
isProtected() && (fProtectedContext == GrProtected::kNo)) {
1457 sampleCnt, ownership, cacheable,
1459 std::move(mutableState));
1473 static bool kResolveOnly =
false;
1478 if (backendRT.
isProtected() && (fProtectedContext == GrProtected::kNo)) {
1491 SkASSERT(tgt->canAttemptStencilAttachment(tgt->numSamples() > 1));
1500 if (imageInfo.
width() > maxSize || imageInfo.
height() > maxSize) {
1505 if (!backendFormat.
isValid()) {
1521 return fMSAALoadManager.
loadMSAAFromResolve(
this, commandBuffer, renderPass, dst, src, srcRect);
1528 auto* vkTex =
static_cast<GrVkTexture*
>(tex)->textureImage();
1530 if (vkTex->isLinearTiled()) {
1531 SkDebugf(
"Trying to create mipmap for linear tiled texture");
1539 !
caps.formatCanBeSrcofBlit(vkTex->imageFormat(),
false) ||
1551 SkASSERT(levelCount == vkTex->mipLevels());
1573 uint32_t mipLevel = 1;
1574 while (mipLevel < levelCount) {
1575 int prevWidth =
width;
1586 blitRegion.
srcOffsets[1] = { prevWidth, prevHeight, 1 };
1602 if (levelCount > 1) {
1618 SkISize dimensions,
int numStencilSamples) {
1633 SkASSERT(this->
vkCaps().isFormatRenderable(pixelFormat, numSamples));
1636 return GrVkImage::MakeMSAA(
this, dimensions, numSamples, pixelFormat, isProtected, memoryless);
1653 for (
int level = 0; level < numMipLevels; ++level) {
1654 const size_t trimRB = srcData[level].
info().
width() * bytesPerPixel;
1656 SkRectMemcpy(mapPtr + individualMipOffsets[level], trimRB,
1657 srcData[level].addr(), srcData[level].rowBytes(),
1658 trimRB, srcData[level].
height());
1663bool GrVkGpu::createVkImageForBackendSurface(
VkFormat vkFormat,
1673 if (fProtectedContext != isProtected) {
1682 if (sampleCnt > 1 && (texturable ==
GrTexturable::kYes || renderable == GrRenderable::kNo)) {
1686 if (renderable == GrRenderable::kYes) {
1694 int numMipLevels = 1;
1695 if (mipmapped == skgpu::Mipmapped::kYes) {
1704 if (renderable == GrRenderable::kYes) {
1715 imageDesc.
fLevels = numMipLevels;
1723 SkDebugf(
"Failed to init image info\n");
1732 std::array<float, 4>
color) {
1782 if (finishedCallback) {
1783 this->addFinishedCallback(std::move(finishedCallback));
1793 std::string_view label) {
1796 if (fProtectedContext != isProtected) {
1806 if (!
caps.isVkFormatTexturable(vkFormat)) {
1815 if (!this->createVkImageForBackendSurface(vkFormat, dimensions, 1,
GrTexturable::kYes,
1816 renderable, mipmapped, &
info, isProtected)) {
1832 "VkGpu_CreateCompressedBackendTexture");
1850 std::move(mutableState));
1860 image->setImageLayout(
this,
1875 &individualMipOffsets,
1880 backendTexture.fMipmapped);
1897 image->currentLayout(),
1903 image->setImageLayout(
this,
1909 if (finishedCallback) {
1910 this->addFinishedCallback(std::move(finishedCallback));
1917 uint32_t newQueueFamilyIndex) {
1922 newLayout =
image->currentLayout();
1927 uint32_t currentQueueFamilyIndex =
image->currentQueueFamilyIndex();
1928 auto isSpecialQueue = [](uint32_t queueFamilyIndex) {
1932 if (isSpecialQueue(currentQueueFamilyIndex) && isSpecialQueue(newQueueFamilyIndex)) {
1938 image->setImageLayoutAndQueueIndex(gpu, newLayout, dstAccess, dstStage,
false,
1939 newQueueFamilyIndex);
1946 uint32_t newQueueFamilyIndex,
1952 std::move(currentState),
1956 "VkGpu_SetBackendSurfaceState",
1962 if (previousState) {
1963 previousState->
set(*
texture->getMutableState());
1966 if (finishedCallback) {
1967 this->addFinishedCallback(std::move(finishedCallback));
1981 return this->setBackendSurfaceState(
info, std::move(currentState), backendTeture.
dimensions(),
1985 std::move(finishedCallback));
1997 return this->setBackendSurfaceState(
info, std::move(currentState),
2001 previousState, std::move(finishedCallback));
2019 barrier.
pNext =
nullptr;
2030 dstStage,
true, &barrier);
2046 &attachmentsDescriptor, &attachmentFlags);
2057 if (this->
vkCaps().programInfoWillUseDiscardableMSAA(programInfo) &&
2062 &attachmentsDescriptor, attachmentFlags, selfDepFlags, loadFromResolve));
2072 renderPass->vkRenderPass(),
2074 if (!pipelineState) {
2081#if defined(GR_TEST_UTILS)
2082bool GrVkGpu::isTestingOnlyBackendTexture(
const GrBackendTexture& tex)
const {
2092 memset(&req, 0,
sizeof(req));
2098 return (req.
size > 0) && (req.
size <= 8192 * 8192);
2108 if (dimensions.
width() > this->caps()->maxRenderTargetSize() ||
2109 dimensions.
height() > this->caps()->maxRenderTargetSize()) {
2116 if (!this->createVkImageForBackendSurface(vkFormat,
2121 skgpu::Mipmapped::kNo,
2218 if (
GrTexture* tex = proxy->peekTexture()) {
2234 image->prepareForPresent(
this);
2257 return this->submitCommandBuffer(kForce_SyncQueue);
2259 return this->submitCommandBuffer(kSkip_SyncQueue);
2264 VK_CALL(QueueWaitIdle(fQueue));
2266 if (this->
vkCaps().mustSyncCommandBuffersWithQueue()) {
2272#if SK_HISTOGRAMS_ENABLED
2273 uint64_t allocatedMemory = 0, usedMemory = 0;
2275 SkASSERT(usedMemory <= allocatedMemory);
2276 if (allocatedMemory > 0) {
2278 (usedMemory * 100) / allocatedMemory);
2286void GrVkGpu::copySurfaceAsCopyImage(
GrSurface* dst,
2304 SkASSERT(this->
vkCaps().canCopyImage(dstFormat, dstSampleCnt, dstHasYcbcr,
2305 srcFormat, srcSampleCnt, srcHasYcbcr));
2307 if (
src->isProtected() && !
dst->isProtected()) {
2308 SkDebugf(
"Can't copy from protected memory to non-protected");
2332 copyRegion.
extent = { (uint32_t)srcRect.
width(), (uint32_t)srcRect.
height(), 1 };
2350void GrVkGpu::copySurfaceAsBlit(
GrSurface* dst,
2379 if (
src->isProtected() && !
dst->isProtected()) {
2380 SkDebugf(
"Can't copy from protected memory to non-protected");
2412 filter == GrSamplerState::Filter::kNearest ?
2421 if (
src->isProtected() && !
dst->isProtected()) {
2422 SkDebugf(
"Can't copy from protected memory to non-protected");
2426 this->resolveImage(dst, srcRT, srcRect, dstPoint);
2441 SkASSERT(!dstRT->wrapsSecondaryCommandBuffer());
2444 if (src->isProtected() && !dst->isProtected()) {
2445 SkDebugf(
"Can't copy from protected memory to non-protected");
2465 }
else if (dst->asTexture()) {
2466 dstImage =
static_cast<GrVkTexture*
>(dst->asTexture())->textureImage();
2469 dstImage =
static_cast<GrVkImage*
>(dst);
2482 }
else if (src->asTexture()) {
2484 srcImage =
static_cast<GrVkTexture*
>(src->asTexture())->textureImage();
2487 srcImage =
static_cast<GrVkImage*
>(src);
2499 if (srcRect.
size() == dstRect.
size()) {
2503 srcFormat, srcSampleCnt, srcHasYcbcr)) {
2504 this->copySurfaceAsResolve(dst, src, srcRect, dstPoint);
2508 if (this->
vkCaps().canCopyImage(dstFormat, dstSampleCnt, dstHasYcbcr,
2509 srcFormat, srcSampleCnt, srcHasYcbcr)) {
2510 this->copySurfaceAsCopyImage(dst, src, dstImage, srcImage, srcRect, dstPoint);
2515 if (this->
vkCaps().canCopyAsBlit(dstFormat,
2523 this->copySurfaceAsBlit(dst, src, dstImage, srcImage, srcRect, dstRect, filter);
2568 image->setImageLayout(
this,
2578 size_t tightRowBytes = bpp*rect.width();
2583 region.imageOffset =
offset;
2584 region.imageExtent = { (uint32_t)rect.width(), (uint32_t)rect.height(), 1 };
2586 size_t transBufferRowBytes = bpp * region.imageExtent.width;
2587 size_t imageRows = region.imageExtent.height;
2590 transBufferRowBytes * imageRows,
2595 if (!transferBuffer) {
2602 region.bufferOffset = 0;
2603 region.bufferRowLength = 0;
2604 region.bufferImageHeight = 0;
2623 if (!this->submitCommandBuffer(kForce_SyncQueue)) {
2626 void* mappedMemory = transferBuffer->map();
2627 if (!mappedMemory) {
2631 SkRectMemcpy(
buffer, rowBytes, mappedMemory, transBufferRowBytes, tightRowBytes, rect.height());
2633 transferBuffer->unmap();
2641 const SkIRect& renderPassBounds,
2642 bool forSecondaryCB) {
2646 SkASSERT (!framebuffer->isExternal());
2664 this, renderPass, std::move(framebuffer), clears,
target, renderPassBounds, forSecondaryCB);
2680 if (!fDeviceIsLost) {
2682 fDeviceIsLost =
true;
2687 vkCaps().supportsDeviceFaultInfo());
2707 SkASSERT(fCachedOpsRenderPass.get() == renderPass);
2709 fCachedOpsRenderPass->submit();
2710 fCachedOpsRenderPass->reset();
2721 wrapType, ownership);
2732 fSemaphoresToSignal.
push_back(resource);
2744 fSemaphoresToWaitOn.
push_back(resource);
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
size_t GrBackendFormatBytesPerPixel(const GrBackendFormat &format)
SkTextureCompressionType GrBackendFormatToCompressionType(const GrBackendFormat &format)
size_t GrComputeTightCombinedBufferSize(size_t bytesPerPixel, SkISize baseDimensions, TArray< size_t > *individualMipOffsets, int mipLevelCount)
static constexpr size_t GrColorTypeBytesPerPixel(GrColorType ct)
@ kBorrow_GrWrapOwnership
@ kDynamic_GrAccessPattern
@ kStatic_GrAccessPattern
@ kStream_GrAccessPattern
@ kTopLeft_GrSurfaceOrigin
void * GrGpuFinishedContext
void(* GrGpuFinishedProc)(GrGpuFinishedContext finishedContext)
@ kKHR_swapchain_GrVkExtensionFlag
@ kSampleRateShading_GrVkFeatureFlag
@ kDualSrcBlend_GrVkFeatureFlag
@ kGeometryShader_GrVkFeatureFlag
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_tex_image_info(const GrVkCaps &caps, const GrVkImageInfo &info)
void set_layout_and_queue_from_mutable_state(GrVkGpu *gpu, GrVkImage *image, VkImageLayout newLayout, uint32_t newQueueFamilyIndex)
static bool check_image_info(const GrVkCaps &caps, const GrVkImageInfo &info, bool needsAllocation, uint32_t graphicsQueueIndex)
static void add_transfer_dst_buffer_mem_barrier(GrVkGpu *gpu, GrVkBuffer *dst, size_t offset, size_t size, bool after)
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)
bool GrVkFormatIsSupported(VkFormat format)
#define GR_VK_CALL(IFACE, X)
@ kTexture_GrXferBarrierType
@ kBlend_GrXferBarrierType
#define SkAssertResult(cond)
#define SkDEBUGFAIL(message)
size_t SkCompressedDataSize(SkTextureCompressionType type, SkISize dimensions, TArray< size_t > *individualMipOffsets, bool mipmapped)
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
#define INHERITED(method,...)
static void SkRectMemcpy(void *dst, size_t dstRB, const void *src, size_t srcRB, size_t trimRowBytes, int rowCount)
sk_sp< T > sk_ref_sp(T *obj)
static constexpr bool SkToBool(const T &x)
constexpr uint32_t SkToU32(S x)
#define SK_HISTOGRAM_MEMORY_KB(name, sample)
#define SK_HISTOGRAM_PERCENTAGE(name, percent_as_int)
SkISize dimensions() const
SkISize dimensions() const
GrBackendFormat getBackendFormat() const
bool mipmapSupport() const
int maxTextureSize() const
GrResourceProvider * resourceProvider()
GrDirectContextPriv priv()
size_t size() const final
void incStencilAttachmentCreates()
void incMSAAAttachmentCreates()
bool submitToGpu(GrSyncCpu sync)
const GrCaps * caps() const
GrDirectContext * getContext()
void didWriteToSurface(GrSurface *surface, GrSurfaceOrigin origin, const SkIRect *bounds, uint32_t mipLevels=1) const
virtual void disconnect(DisconnectType)
void initCaps(sk_sp< const GrCaps > caps)
const GrImageInfo & info() const
GrLoadOp colorLoadOp() const
GrXferBarrierFlags renderPassBarriers() const
Slice allocateStagingBufferSlice(size_t size, size_t requiredAlignment=1)
SkISize dimensions() const
GrTextureType textureType() const
static sk_sp< GrVkBuffer > Make(GrVkGpu *gpu, size_t size, GrGpuBufferType bufferType, GrAccessPattern accessPattern)
void addMemoryBarrier(VkAccessFlags srcAccessMask, VkAccessFlags dstAccesMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, bool byRegion) const
VkBuffer vkBuffer() const
bool canCopyAsResolve(VkFormat dstConfig, int dstSampleCnt, bool dstHasYcbcr, VkFormat srcConfig, int srcSamplecnt, bool srcHasYcbcr) const
bool isVkFormatTexturable(VkFormat) const
bool formatCanBeDstofBlit(VkFormat format, bool linearTiled) const
bool isFormatRenderable(const GrBackendFormat &format, int sampleCount) const override
bool renderTargetSupportsDiscardableMSAA(const GrVkRenderTarget *) const
bool supportsYcbcrConversion() const
VkFormat getFormatFromColorType(GrColorType colorType) const
GrColorType transferColorType(VkFormat, GrColorType surfaceColorType) const
int getRenderTargetSampleCount(int requestedCount, const GrBackendFormat &) const override
bool supportsSwapchain() const
bool supportsDRMFormatModifiers() const
VkFormat preferredStencilFormat() const
bool isVkFormatTexturableLinearly(VkFormat format) const
void pipelineBarrier(const GrVkGpu *gpu, const GrManagedResource *resource, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, bool byRegion, BarrierType barrierType, void *barrier)
void addGrSurface(sk_sp< const GrSurface > surface)
void addGrBuffer(sk_sp< const GrBuffer > buffer)
@ kBufferMemory_BarrierType
@ kImageMemory_BarrierType
GrVkPrimaryCommandBuffer * getPrimaryCommandBuffer()
std::unique_ptr< GrSemaphore > makeSemaphore(bool isOwned) override
bool onReadPixels(GrSurface *, SkIRect, GrColorType surfaceColorType, GrColorType dstColorType, void *buffer, size_t rowBytes) override
bool setBackendTextureState(const GrBackendTexture &, const skgpu::MutableTextureState &, skgpu::MutableTextureState *previousState, sk_sp< skgpu::RefCntedCallback > finishedCallback) override
uint32_t queueIndex() const
bool onSubmitToGpu(GrSyncCpu sync) override
const GrVkCaps & vkCaps() const
static std::unique_ptr< GrGpu > Make(const GrVkBackendContext &, const GrContextOptions &, GrDirectContext *)
void onResolveRenderTarget(GrRenderTarget *target, const SkIRect &resolveRect) override
void prepareSurfacesForBackendAccessAndStateUpdates(SkSpan< GrSurfaceProxy * > proxies, SkSurfaces::BackendSurfaceAccess access, const skgpu::MutableTextureState *newState) override
void insertSemaphore(GrSemaphore *semaphore) override
bool zeroBuffer(sk_sp< GrGpuBuffer >)
void addImageMemoryBarrier(const GrManagedResource *, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, bool byRegion, VkImageMemoryBarrier *barrier) const
bool onClearBackendTexture(const GrBackendTexture &, sk_sp< skgpu::RefCntedCallback > finishedCallback, std::array< float, 4 > color) override
bool loadMSAAFromResolve(GrVkCommandBuffer *commandBuffer, const GrVkRenderPass &renderPass, GrAttachment *dst, GrVkImage *src, const SkIRect &srcRect)
void addBufferMemoryBarrier(const GrManagedResource *, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, bool byRegion, VkBufferMemoryBarrier *barrier) const
const skgpu::VulkanInterface * vkInterface() const
void addDrawable(std::unique_ptr< SkDrawable::GpuDrawHandler > drawable)
void deleteBackendTexture(const GrBackendTexture &) override
bool beginRenderPass(const GrVkRenderPass *, sk_sp< const GrVkFramebuffer >, const VkClearValue *colorClear, const GrSurface *, const SkIRect &renderPassBounds, bool forSecondaryCB)
void disconnect(DisconnectType) override
sk_sp< GrTexture > onWrapRenderableBackendTexture(const GrBackendTexture &, int sampleCnt, GrWrapOwnership, GrWrapCacheable) override
sk_sp< GrAttachment > makeStencilAttachment(const GrBackendFormat &, SkISize dimensions, int numStencilSamples) override
sk_sp< GrGpuBuffer > onCreateBuffer(size_t size, GrGpuBufferType type, GrAccessPattern) override
sk_sp< GrThreadSafePipelineBuilder > refPipelineBuilder() override
void endRenderPass(GrRenderTarget *target, GrSurfaceOrigin origin, const SkIRect &bounds)
sk_sp< GrRenderTarget > onWrapBackendRenderTarget(const GrBackendRenderTarget &) override
sk_sp< GrTexture > onWrapCompressedBackendTexture(const GrBackendTexture &, GrWrapOwnership, GrWrapCacheable) override
sk_sp< GrTexture > onWrapBackendTexture(const GrBackendTexture &, GrWrapOwnership, GrWrapCacheable, GrIOType) override
GrVkResourceProvider & resourceProvider()
void waitSemaphore(GrSemaphore *semaphore) override
bool onCopySurface(GrSurface *dst, const SkIRect &dstRect, GrSurface *src, const SkIRect &srcRect, GrSamplerState::Filter) override
bool onRegenerateMipMapLevels(GrTexture *tex) override
GrThreadSafePipelineBuilder * pipelineBuilder() override
bool updateBuffer(sk_sp< GrVkBuffer > buffer, const void *src, VkDeviceSize offset, VkDeviceSize size)
bool onTransferPixelsFrom(GrSurface *, SkIRect, GrColorType surfaceColorType, GrColorType bufferColorType, sk_sp< GrGpuBuffer >, size_t offset) override
std::unique_ptr< GrSemaphore > wrapBackendSemaphore(const GrBackendSemaphore &, GrSemaphoreWrapType, GrWrapOwnership) override
std::unique_ptr< GrSemaphore > prepareTextureForCrossContextUsage(GrTexture *) override
bool compile(const GrProgramDesc &, const GrProgramInfo &) override
bool onWritePixels(GrSurface *, SkIRect, GrColorType surfaceColorType, GrColorType srcColorType, const GrMipLevel[], int mipLevelCount, bool prepForTexSampling) override
sk_sp< GrTexture > onCreateTexture(SkISize, const GrBackendFormat &, GrRenderable, int renderTargetSampleCnt, skgpu::Budgeted, GrProtected, int mipLevelCount, uint32_t levelClearMask, std::string_view label) override
void storeVkPipelineCacheData() override
GrVkPrimaryCommandBuffer * currentCommandBuffer() const
sk_sp< GrRenderTarget > onWrapVulkanSecondaryCBAsRenderTarget(const SkImageInfo &, const GrVkDrawableInfo &) override
void finishOutstandingGpuWork() override
bool onUpdateCompressedBackendTexture(const GrBackendTexture &, sk_sp< skgpu::RefCntedCallback > finishedCallback, const void *data, size_t length) override
sk_sp< GrAttachment > makeMSAAAttachment(SkISize dimensions, const GrBackendFormat &format, int numSamples, GrProtected isProtected, GrMemoryless isMemoryless) override
void submit(GrOpsRenderPass *) override
GrBackendTexture onCreateCompressedBackendTexture(SkISize dimensions, const GrBackendFormat &, skgpu::Mipmapped, GrProtected) override
bool checkVkResult(VkResult)
void submitSecondaryCommandBuffer(std::unique_ptr< GrVkSecondaryCommandBuffer >)
void onReportSubmitHistograms() override
bool onTransferFromBufferToBuffer(sk_sp< GrGpuBuffer > src, size_t srcOffset, sk_sp< GrGpuBuffer > dst, size_t dstOffset, size_t size) override
GrBackendTexture onCreateBackendTexture(SkISize dimensions, const GrBackendFormat &, GrRenderable, skgpu::Mipmapped, GrProtected, std::string_view label) override
sk_sp< GrTexture > onCreateCompressedTexture(SkISize dimensions, const GrBackendFormat &, skgpu::Budgeted, skgpu::Mipmapped, GrProtected, const void *data, size_t dataSize) override
void takeOwnershipOfBuffer(sk_sp< GrGpuBuffer >) override
GrOpsRenderPass * onGetOpsRenderPass(GrRenderTarget *, bool useMSAASurface, GrAttachment *stencil, GrSurfaceOrigin, const SkIRect &, const GrOpsRenderPass::LoadAndStoreInfo &, const GrOpsRenderPass::StencilLoadAndStoreInfo &, const skia_private::TArray< GrSurfaceProxy *, true > &sampledProxies, GrXferBarrierFlags renderPassXferBarriers) override
bool onTransferPixelsTo(GrTexture *, SkIRect, GrColorType textureColorType, GrColorType bufferColorType, sk_sp< GrGpuBuffer >, size_t offset, size_t rowBytes) override
bool setBackendRenderTargetState(const GrBackendRenderTarget &, const skgpu::MutableTextureState &, skgpu::MutableTextureState *previousState, sk_sp< skgpu::RefCntedCallback > finishedCallback) override
void xferBarrier(GrRenderTarget *, GrXferBarrierType) override
void addFinishedProc(GrGpuFinishedProc finishedProc, GrGpuFinishedContext finishedContext) override
skgpu::VulkanMemoryAllocator * memoryAllocator() const
static sk_sp< GrVkImage > MakeStencil(GrVkGpu *gpu, SkISize dimensions, int sampleCnt, VkFormat format)
static VkAccessFlags LayoutToSrcAccessMask(const VkImageLayout layout)
uint32_t mipLevels() const
bool isLinearTiled() const
void setImageLayout(const GrVkGpu *gpu, VkImageLayout newLayout, VkAccessFlags dstAccessMask, VkPipelineStageFlags dstStageMask, bool byRegion)
static void DestroyImageInfo(const GrVkGpu *gpu, GrVkImageInfo *)
const GrVkYcbcrConversionInfo & ycbcrConversionInfo() const
bool supportsInputAttachmentUsage() const
static sk_sp< GrVkImage > MakeMSAA(GrVkGpu *gpu, SkISize dimensions, int numSamples, VkFormat format, GrProtected isProtected, GrMemoryless memoryless)
VkImageLayout currentLayout() const
VkFormat imageFormat() const
static sk_sp< GrVkImage > MakeWrapped(GrVkGpu *gpu, SkISize dimensions, const GrVkImageInfo &, sk_sp< skgpu::MutableTextureState >, UsageFlags attachmentUsages, GrWrapOwnership, GrWrapCacheable, std::string_view label, bool forSecondaryCB=false)
static VkPipelineStageFlags LayoutToPipelineSrcStageFlags(const VkImageLayout layout)
const Resource * resource() const
const skgpu::VulkanAlloc & alloc() const
static bool InitImageInfo(GrVkGpu *gpu, const ImageDesc &imageDesc, GrVkImageInfo *)
bool loadMSAAFromResolve(GrVkGpu *gpu, GrVkCommandBuffer *commandBuffer, const GrVkRenderPass &renderPass, GrAttachment *dst, GrVkImage *src, const SkIRect &srcRect)
void destroyResources(GrVkGpu *gpu)
void endRenderPass(const GrVkGpu *gpu)
bool submitToQueue(GrVkGpu *gpu, VkQueue queue, skia_private::TArray< GrVkSemaphore::Resource * > &signalSemaphores, skia_private::TArray< GrVkSemaphore::Resource * > &waitSemaphores)
void forceSync(GrVkGpu *gpu)
void clearColorImage(const GrVkGpu *gpu, GrVkImage *image, const VkClearColorValue *color, uint32_t subRangeCount, const VkImageSubresourceRange *subRanges)
void blitImage(const GrVkGpu *gpu, const GrManagedResource *srcResource, VkImage srcImage, VkImageLayout srcLayout, const GrManagedResource *dstResource, VkImage dstImage, VkImageLayout dstLayout, uint32_t blitRegionCount, const VkImageBlit *blitRegions, VkFilter filter)
void copyImageToBuffer(const GrVkGpu *gpu, GrVkImage *srcImage, VkImageLayout srcLayout, sk_sp< GrGpuBuffer > dstBuffer, uint32_t copyRegionCount, const VkBufferImageCopy *copyRegions)
void end(GrVkGpu *gpu, bool abandoningBuffer=false)
void resolveImage(GrVkGpu *gpu, const GrVkImage &srcImage, const GrVkImage &dstImage, uint32_t regionCount, const VkImageResolve *regions)
bool beginRenderPass(GrVkGpu *gpu, const GrVkRenderPass *, sk_sp< const GrVkFramebuffer >, const VkClearValue clearValues[], const GrSurface *target, const SkIRect &bounds, bool forSecondaryCB)
void copyBuffer(GrVkGpu *gpu, sk_sp< GrGpuBuffer > srcBuffer, sk_sp< GrGpuBuffer > dstBuffer, uint32_t regionCount, const VkBufferCopy *regions)
void copyImage(const GrVkGpu *gpu, GrVkImage *srcImage, VkImageLayout srcLayout, GrVkImage *dstImage, VkImageLayout dstLayout, uint32_t copyRegionCount, const VkImageCopy *copyRegions)
void executeCommands(const GrVkGpu *gpu, std::unique_ptr< GrVkSecondaryCommandBuffer > secondaryBuffer)
void fillBuffer(GrVkGpu *gpu, sk_sp< GrGpuBuffer >, VkDeviceSize offset, VkDeviceSize size, uint32_t data)
void copyBufferToImage(const GrVkGpu *gpu, VkBuffer srcBuffer, GrVkImage *dstImage, VkImageLayout dstLayout, uint32_t copyRegionCount, const VkBufferImageCopy *copyRegions)
void updateBuffer(GrVkGpu *gpu, sk_sp< GrVkBuffer > dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *data)
bool colorAttachmentIndex(uint32_t *index) const
@ kForNonCoherentAdvBlend
bool stencilAttachmentIndex(uint32_t *index) const
bool hasResolveAttachment() const
bool wrapsSecondaryCommandBuffer() const
GrVkImage * externalAttachment() const
sk_sp< GrVkFramebuffer > externalFramebuffer() const
GrVkImage * nonMSAAAttachment() const
const GrVkImageView * resolveAttachmentView() const
static void ReconstructAttachmentsDescriptor(const GrVkCaps &vkCaps, const GrProgramInfo &programInfo, GrVkRenderPass::AttachmentsDescriptor *desc, GrVkRenderPass::AttachmentFlags *flags)
const GrVkFramebuffer * getFramebuffer(bool withResolve, bool withStencil, SelfDependencyFlags selfDepFlags, LoadFromResolve)
GrVkImage * colorAttachment() const
const GrVkImageView * colorAttachmentView() const
GrVkImage * resolveAttachment() const
static sk_sp< GrVkRenderTarget > MakeSecondaryCBRenderTarget(GrVkGpu *, SkISize, const GrVkDrawableInfo &vkInfo)
static sk_sp< GrVkRenderTarget > MakeWrappedRenderTarget(GrVkGpu *, SkISize, int sampleCnt, const GrVkImageInfo &, sk_sp< skgpu::MutableTextureState >)
void forceSyncAllCommandBuffers()
GrVkPipelineState * findOrCreateCompatiblePipelineState(GrRenderTarget *, const GrProgramInfo &, VkRenderPass compatibleRenderPass, bool overrideSubpassForResolveLoad)
sk_sp< GrThreadSafePipelineBuilder > refPipelineStateCache()
void addFinishedProcToActiveCommandBuffers(sk_sp< skgpu::RefCntedCallback > finishedCallback)
GrVkCommandPool * findOrCreateCommandPool()
void storePipelineCacheData()
void checkCommandBuffers()
GrThreadSafePipelineBuilder * pipelineStateCache()
bool shouldSignal() const
static std::unique_ptr< GrVkSemaphore > Make(GrVkGpu *gpu, bool isOwned)
static std::unique_ptr< GrVkSemaphore > MakeWrapped(GrVkGpu *, VkSemaphore, GrSemaphoreWrapType, GrWrapOwnership)
static sk_sp< GrVkTextureRenderTarget > MakeNewTextureRenderTarget(GrVkGpu *gpu, skgpu::Budgeted budgeted, SkISize dimensions, VkFormat format, uint32_t mipLevels, int sampleCnt, GrMipmapStatus mipmapStatus, GrProtected isProtected, std::string_view label)
static sk_sp< GrVkTextureRenderTarget > MakeWrappedTextureRenderTarget(GrVkGpu *, SkISize dimensions, int sampleCnt, GrWrapOwnership, GrWrapCacheable, const GrVkImageInfo &, sk_sp< skgpu::MutableTextureState >)
GrVkImage * textureImage() const
static sk_sp< GrVkTexture > MakeWrappedTexture(GrVkGpu *, SkISize dimensions, GrWrapOwnership, GrWrapCacheable, GrIOType, const GrVkImageInfo &, sk_sp< skgpu::MutableTextureState >)
static sk_sp< GrVkTexture > MakeNewTexture(GrVkGpu *, skgpu::Budgeted budgeted, SkISize dimensions, VkFormat format, uint32_t mipLevels, GrProtected, GrMipmapStatus, std::string_view label)
static int ComputeLevelCount(int baseWidth, int baseHeight)
constexpr bool empty() const
constexpr size_t size() const
void reset(T *ptr=nullptr)
BackendApi backend() const
void set(const MutableTextureState &that)
static sk_sp< RefCntedCallback > Make(Callback proc, Context ctx)
static sk_sp< VulkanMemoryAllocator > Make(VkInstance instance, VkPhysicalDevice physicalDevice, VkDevice device, uint32_t physicalDeviceVersion, const VulkanExtensions *extensions, const VulkanInterface *interface, bool threadSafe)
virtual std::pair< uint64_t, uint64_t > totalAllocatedAndUsedMemory() const =0
void reserve_exact(int n)
T & emplace_back(Args &&... args)
FlPixelBufferTexturePrivate * priv
static const uint8_t buffer[]
uint32_t uint32_t * format
SK_API bool GetVkImageInfo(const GrBackendRenderTarget &, GrVkImageInfo *)
SK_API GrBackendRenderTarget MakeVk(int width, int height, const GrVkImageInfo &)
SK_API VkSemaphore GetVkSemaphore(const GrBackendSemaphore &)
SK_API GrBackendTexture MakeVk(int width, int height, const GrVkImageInfo &, std::string_view label={})
SK_API bool GetVkImageInfo(const GrBackendTexture &, GrVkImageInfo *)
ClipOpAndAA opAA SkRegion region
sk_sp< SkBlender > blender SkRect rect
@ kPresent
back-end surface will be used for presenting to screen
@ kNoAccess
back-end surface will not be used by client
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
SK_API uint32_t GetVkQueueFamilyIndex(const MutableTextureState &state)
SK_API VkImageLayout GetVkImageLayout(const MutableTextureState &state)
void * MapAlloc(VulkanMemoryAllocator *, const VulkanAlloc &, const std::function< CheckResult > &)
void FlushMappedAlloc(VulkanMemoryAllocator *, const skgpu::VulkanAlloc &, VkDeviceSize offset, VkDeviceSize size, const std::function< CheckResult > &)
void UnmapAlloc(VulkanMemoryAllocator *, const VulkanAlloc &alloc)
static constexpr size_t VkFormatBytesPerBlock(VkFormat vkFormat)
static constexpr bool VkFormatNeedsYcbcrSampler(VkFormat format)
static constexpr bool VkFormatIsCompressed(VkFormat vkFormat)
void InvokeDeviceLostCallback(const skgpu::VulkanInterface *vulkanInterface, VkDevice vkDevice, skgpu::VulkanDeviceLostContext deviceLostContext, skgpu::VulkanDeviceLostProc deviceLostProc, bool supportsDeviceFaultInfoExtension)
SkISize CompressedDimensions(SkTextureCompressionType type, SkISize baseDimensions)
static void swap(TArray< T, M > &a, TArray< T, M > &b)
const skgpu::VulkanExtensions * fVkExtensions
skgpu::Protected fProtectedContext
bool fOwnsInstanceAndDevice
const VkPhysicalDeviceFeatures * fDeviceFeatures
VkPhysicalDevice fPhysicalDevice
skgpu::VulkanGetProc fGetProc
const VkPhysicalDeviceFeatures2 * fDeviceFeatures2
sk_sp< skgpu::VulkanMemoryAllocator > fMemoryAllocator
VkImageUsageFlags fUsageFlags
VkImageTiling fImageTiling
static constexpr SkIPoint Make(int32_t x, int32_t y)
constexpr int32_t x() const
constexpr int32_t y() const
int32_t fBottom
larger y-axis bounds
constexpr SkISize size() const
constexpr int32_t height() const
int32_t fTop
smaller y-axis bounds
static constexpr SkIRect MakeSize(const SkISize &size)
constexpr int32_t width() const
constexpr SkIPoint topLeft() const
static constexpr SkIRect MakeXYWH(int32_t x, int32_t y, int32_t w, int32_t h)
int32_t fLeft
smaller x-axis bounds
bool contains(int32_t x, int32_t y) const
int32_t fRight
larger x-axis bounds
constexpr int32_t width() const
constexpr int32_t height() const
SkISize dimensions() const
VkImageSubresourceLayers srcSubresource
VkImageSubresourceLayers dstSubresource
VkImageSubresourceLayers srcSubresource
VkImageSubresourceLayers dstSubresource
VkAccessFlags dstAccessMask
uint32_t dstQueueFamilyIndex
VkAccessFlags srcAccessMask
VkImageSubresourceRange subresourceRange
uint32_t srcQueueFamilyIndex
VkImageSubresourceLayers dstSubresource
VkImageSubresourceLayers srcSubresource
VkImageAspectFlags aspectMask
VkPhysicalDeviceFeatures features
VkBool32 sampleRateShading
#define TRACE_EVENT0(category_group, name)
VkClearDepthStencilValue depthStencil
VkFlags VkPipelineStageFlags
@ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
@ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
@ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
@ VK_IMAGE_LAYOUT_PREINITIALIZED
@ VK_IMAGE_LAYOUT_UNDEFINED
@ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
@ VK_IMAGE_LAYOUT_GENERAL
@ VK_SHARING_MODE_EXCLUSIVE
@ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
VkFlags VkImageUsageFlags
@ VK_IMAGE_TILING_OPTIMAL
@ VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT
void(VKAPI_PTR * PFN_vkGetPhysicalDeviceProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties)
@ VK_IMAGE_ASPECT_COLOR_BIT
@ VK_IMAGE_USAGE_TRANSFER_DST_BIT
@ VK_IMAGE_USAGE_SAMPLED_BIT
@ VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
@ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
@ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
#define VK_QUEUE_FAMILY_FOREIGN_EXT
#define VK_MAKE_VERSION(major, minor, patch)
@ VK_ERROR_OUT_OF_HOST_MEMORY
@ VK_ERROR_OUT_OF_DEVICE_MEMORY
@ VK_ACCESS_HOST_READ_BIT
@ VK_ACCESS_TRANSFER_WRITE_BIT
@ VK_ACCESS_HOST_WRITE_BIT
@ VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT
@ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT
@ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
@ VK_ACCESS_TRANSFER_READ_BIT
@ VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT
@ VK_ACCESS_SHADER_READ_BIT
@ VK_ACCESS_INDEX_READ_BIT
#define VK_QUEUE_FAMILY_EXTERNAL
VkResult(VKAPI_PTR * PFN_vkEnumerateInstanceVersion)(uint32_t *pApiVersion)
#define VK_KHR_SWAPCHAIN_EXTENSION_NAME
@ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
@ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
@ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
@ VK_PIPELINE_STAGE_HOST_BIT
@ VK_PIPELINE_STAGE_TRANSFER_BIT
#define VK_QUEUE_FAMILY_IGNORED
@ VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER
@ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER