35#ifdef SK_BUILD_FOR_ANDROID
45 size_t resourceBudget,
49 , fIntrinsicUniformBuffer(
std::move(intrinsicConstantUniformBuffer))
50 , fLoadMSAAVertexBuffer(
std::move(loadMSAAVertexBuffer)) {
55 VULKAN_CALL(this->vulkanSharedContext()->interface(),
56 DestroyPipelineCache(this->vulkanSharedContext()->
device(),
61 VULKAN_CALL(this->vulkanSharedContext()->interface(),
62 DestroyShaderModule(this->vulkanSharedContext()->
device(),
63 fMSAALoadVertShaderModule,
67 VULKAN_CALL(this->vulkanSharedContext()->interface(),
68 DestroyShaderModule(this->vulkanSharedContext()->
device(),
69 fMSAALoadFragShaderModule,
73 VULKAN_CALL(this->vulkanSharedContext()->interface(),
74 DestroyPipelineLayout(this->vulkanSharedContext()->
device(),
75 fMSAALoadPipelineLayout,
95 return fIntrinsicUniformBuffer;
99 return fLoadMSAAVertexBuffer.get();
106 auto compatibleRenderPass =
107 this->findOrCreateRenderPass(renderPassDesc,
true);
112 compatibleRenderPass,
113 this->pipelineCache());
128 std::string_view label) {
146 if (!
info.getVulkanTextureInfo(&vkTexInfo)) {
151 &createdTextureInfo)) {
158 createdTextureInfo.
fImage,
166 const int num32DataCnt = requestedDescriptors.
size() + 1;
171 builder[0] = requestedDescriptors.
size();
172 for (
int i = 1; i < num32DataCnt; i++) {
173 const auto& currDesc = requestedDescriptors[i - 1];
175 uint16_t smallerCount =
static_cast<uint16_t
>(currDesc.count);
176 builder[i] =
static_cast<uint8_t
>(currDesc.type) << 24 |
177 currDesc.bindingIndex << 16 |
186 const GraphiteResourceKey& descSetKey,
187 ResourceCache* resourceCache) {
192 descSet->setKey(descSetKey);
193 resourceCache->insertResource(descSet.
get());
201 if (requestedDescriptors.
empty()) {
205 GraphiteResourceKey
key = build_desc_set_key(requestedDescriptors);
214 VkDescriptorSetLayout layout;
215 const VulkanSharedContext* context = this->vulkanSharedContext();
222 VULKAN_CALL(context->interface(), DestroyDescriptorSetLayout(context->device(),
244 SKGPU_LOG_W(
"Descriptor set allocation %d of %d was unsuccessful; no more sets will be"
254 const RenderPassDesc& renderPassDesc,
256 const GraphiteResourceKey& rpKey) {
257 if (Resource* resource =
270 renderPass->setKey(rpKey);
277 const RenderPassDesc& renderPassDesc,
bool compatibleOnly) {
280 return this->findOrCreateRenderPassWithKnownKey(renderPassDesc, compatibleOnly, rpKey);
283VkPipelineCache VulkanResourceProvider::pipelineCache() {
288 createInfo.
pNext =
nullptr;
289 createInfo.
flags = 0;
295 CreatePipelineCache(this->vulkanSharedContext()->
device(),
303 return fPipelineCache;
307 const VulkanSharedContext* context,
309 const VulkanRenderPass& renderPass,
317 framebufferInfo.
pNext =
nullptr;
318 framebufferInfo.
flags = 0;
319 framebufferInfo.
renderPass = renderPass.renderPass();
324 framebufferInfo.
layers = 1;
332 VULKAN_CALL(this->vulkanSharedContext()->interface(),
333 DestroyImage(this->vulkanSharedContext()->
device(),
texture.getVkImage(),
342 if (
texture.getMemoryAlloc()->fBackendMemory) {
347 VULKAN_CALL(this->vulkanSharedContext()->interface(),
348 FreeMemory(this->vulkanSharedContext()->
device(),
349 texture.getMemoryAlloc()->fMemory,
361 this->vulkanSharedContext(), ycbcrInfo);
371 if (!ycbcrConversion) {
375 ycbcrConversion->setKey(ycbcrConversionKey);
378 return ycbcrConversion;
386 SKGPU_LOG_E(
"Loading MSAA from resolve texture requires valid color & resolve attachment");
391 GraphiteResourceKey renderPassKey =
393 for (
int i = 0; i < fLoadMSAAPipelines.size(); i++) {
394 if (renderPassKey == fLoadMSAAPipelines.at(i).first) {
395 return fLoadMSAAPipelines.at(i).second;
406 this->vulkanSharedContext(),
407 &fMSAALoadVertShaderModule,
408 &fMSAALoadFragShaderModule,
409 &fMSAALoadShaderStageInfo[0],
410 &fMSAALoadPipelineLayout)) {
411 SKGPU_LOG_E(
"Failed to initialize MSAA load pipeline creation structure(s)");
417 this->findOrCreateRenderPassWithKnownKey(renderPassDesc,
420 if (!compatibleRenderPass) {
421 SKGPU_LOG_E(
"Failed to make compatible render pass for loading MSAA");
425 this->vulkanSharedContext(),
426 fMSAALoadVertShaderModule,
427 fMSAALoadFragShaderModule,
428 &fMSAALoadShaderStageInfo[0],
429 fMSAALoadPipelineLayout,
430 compatibleRenderPass,
431 this->pipelineCache(),
435 SKGPU_LOG_E(
"Failed to create MSAA load pipeline");
439 fLoadMSAAPipelines.push_back(std::make_pair(renderPassKey, pipeline));
443#ifdef SK_BUILD_FOR_ANDROID
447 bool isProtectedContent,
449 bool fromAndroidWindow)
const {
451 const VulkanSharedContext* vkContext = this->vulkanSharedContext();
452 VkDevice
device = vkContext->device();
453 const VulkanCaps& vkCaps = vkContext->vulkanCaps();
457 if (!skgpu::GetAHardwareBufferProperties(
458 &hwbFormatProps, &hwbProps, vkContext->interface(), hardwareBuffer,
device)) {
470 if (!importAsExternalFormat) {
485 VulkanYcbcrConversionInfo() };
487 if (isRenderable && (importAsExternalFormat || !vkCaps.isRenderable(vkTexInfo))) {
488 SKGPU_LOG_W(
"Renderable texture requested from an AHardwareBuffer which uses a VkFormat "
489 "that Skia cannot render to (VkFormat: %d).\n", hwbFormatProps.
format);
493 if (!importAsExternalFormat && (!vkCaps.isTransferSrc(vkTexInfo) ||
494 !vkCaps.isTransferDst(vkTexInfo) ||
495 !vkCaps.isTexturable(vkTexInfo))) {
497 SKGPU_LOG_W(
"VkFormat %d is either unfamiliar to Skia or doesn't support the necessary"
498 " format features. Because a renerable texture was requested, we cannot "
499 "fall back to importing with an external format.\n", hwbFormatProps.
format);
503 importAsExternalFormat =
true;
510 VulkanYcbcrConversionInfo ycbcrInfo;
513 externalFormat.
pNext =
nullptr;
515 if (importAsExternalFormat) {
516 GetYcbcrConversionInfoFromFormatProps(&ycbcrInfo, hwbFormatProps);
517 if (!ycbcrInfo.isValid()) {
518 SKGPU_LOG_W(
"Failed to create valid YCbCr conversion information from hardware buffer"
519 "format properties.\n");
535 &externalMemoryImageInfo,
539 { (uint32_t)dimensions.
fWidth, (uint32_t)dimensions.
fHeight, 1 },
543 vkTexInfo.fImageTiling,
544 vkTexInfo.fImageUsageFlags,
545 vkTexInfo.fSharingMode,
554 CreateImage(
device, &imageCreateInfo,
nullptr, &
image));
560 vkContext->vulkanCaps().physicalDeviceMemoryProperties2();
562 if (!AllocateAndBindImageMemory(&alloc,
image, phyDevMemProps, hwbProps, hardwareBuffer,
563 vkContext->interface(),
device)) {
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
struct AHardwareBuffer AHardwareBuffer
#define SKGPU_LOG_E(fmt,...)
#define SKGPU_LOG_W(fmt,...)
#define VULKAN_CALL(IFACE, X)
#define VULKAN_CALL_RESULT(SHARED_CONTEXT, RESULT, X)
constexpr bool empty() const
constexpr size_t size() const
static ResourceType GenerateResourceType()
sk_sp< ResourceCache > fResourceCache
SharedContext * fSharedContext
Protected isProtected() const
static sk_sp< Buffer > Make(const VulkanSharedContext *, size_t, BufferType, AccessPattern, std::string_view label)
static sk_sp< VulkanDescriptorPool > Make(const VulkanSharedContext *, SkSpan< DescriptorData >, VkDescriptorSetLayout)
static constexpr int kMaxNumSets
static sk_sp< VulkanDescriptorSet > Make(const VulkanSharedContext *, const sk_sp< VulkanDescriptorPool > &)
static sk_sp< VulkanFramebuffer > Make(const VulkanSharedContext *, const VkFramebufferCreateInfo &)
static sk_sp< VulkanGraphicsPipeline > Make(const VulkanSharedContext *, const RuntimeEffectDictionary *, const GraphicsPipelineDesc &, const RenderPassDesc &, const sk_sp< VulkanRenderPass > &compatibleRenderPass, VkPipelineCache)
static sk_sp< VulkanGraphicsPipeline > MakeLoadMSAAPipeline(const VulkanSharedContext *, VkShaderModule vsModule, VkShaderModule fsModule, VkPipelineShaderStageCreateInfo *pipelineShaderStages, VkPipelineLayout, sk_sp< VulkanRenderPass > compatibleRenderPass, VkPipelineCache, const TextureInfo &dstColorAttachmentTexInfo)
static bool InitializeMSAALoadPipelineStructs(const VulkanSharedContext *, VkShaderModule *outVertexShaderModule, VkShaderModule *outFragShaderModule, VkPipelineShaderStageCreateInfo *outShaderStageInfo, VkPipelineLayout *outPipelineLayout)
static sk_sp< VulkanRenderPass > MakeRenderPass(const VulkanSharedContext *, const RenderPassDesc &, bool compatibleOnly)
static GraphiteResourceKey MakeRenderPassKey(const RenderPassDesc &, bool compatibleOnly)
sk_sp< Sampler > createSampler(const SamplerDesc &) override
sk_sp< Texture > createWrappedTexture(const BackendTexture &) override
sk_sp< Buffer > createBuffer(size_t size, BufferType type, AccessPattern, std::string_view label) override
const Buffer * loadMSAAVertexBuffer() const
sk_sp< VulkanSamplerYcbcrConversion > findOrCreateCompatibleSamplerYcbcrConversion(const VulkanYcbcrConversionInfo &ycbcrInfo) const
void onDeleteBackendTexture(const BackendTexture &) override
BackendTexture onCreateBackendTexture(SkISize dimensions, const TextureInfo &) override
~VulkanResourceProvider() override
VulkanResourceProvider(SharedContext *sharedContext, SingleOwner *, uint32_t recorderID, size_t resourceBudget, sk_sp< Buffer > intrinsicConstantUniformBuffer, sk_sp< Buffer > loadMSAAVertexBuffer)
sk_sp< Texture > createTexture(SkISize, const TextureInfo &, skgpu::Budgeted) override
sk_sp< GraphicsPipeline > createGraphicsPipeline(const RuntimeEffectDictionary *, const GraphicsPipelineDesc &, const RenderPassDesc &) override
sk_sp< ComputePipeline > createComputePipeline(const ComputePipelineDesc &) override
sk_sp< Buffer > refIntrinsicConstantBuffer() const
static GraphiteResourceKey MakeYcbcrConversionKey(const VulkanSharedContext *, const VulkanYcbcrConversionInfo &)
static sk_sp< VulkanSamplerYcbcrConversion > Make(const VulkanSharedContext *, const VulkanYcbcrConversionInfo &)
static sk_sp< VulkanSampler > Make(const VulkanSharedContext *, const SkSamplingOptions &samplingOptions, SkTileMode xTileMode, SkTileMode yTileMode)
static sk_sp< Texture > Make(const VulkanSharedContext *, const VulkanResourceProvider *, SkISize dimensions, const TextureInfo &, skgpu::Budgeted)
static bool MakeVkImage(const VulkanSharedContext *, SkISize dimensions, const TextureInfo &, CreatedImageInfo *outInfo)
static sk_sp< Texture > MakeWrapped(const VulkanSharedContext *, const VulkanResourceProvider *, SkISize dimensions, const TextureInfo &, sk_sp< MutableTextureState >, VkImage, const VulkanAlloc &)
SK_API uint32_t GetVkQueueFamilyIndex(const MutableTextureState &state)
SK_API VkImageLayout GetVkImageLayout(const MutableTextureState &state)
void FreeImageMemory(VulkanMemoryAllocator *, const VulkanAlloc &alloc)
void DescriptorDataToVkDescSetLayout(const VulkanSharedContext *ctxt, const SkSpan< DescriptorData > &requestedDescriptors, VkDescriptorSetLayout *outLayout)
const VkImageView * pAttachments
VkFramebufferCreateFlags flags
VkPipelineCacheCreateFlags flags
const void * pInitialData
AttachmentDesc fColorResolveAttachment
AttachmentDesc fColorAttachment
SkTileMode tileModeX() const
SkSamplingOptions samplingOptions() const
SkTileMode tileModeY() const
sk_sp< MutableTextureState > fMutableState
@ VK_IMAGE_LAYOUT_UNDEFINED
@ VK_SHARING_MODE_EXCLUSIVE
VkFlags VkImageUsageFlags
@ VK_IMAGE_CREATE_PROTECTED_BIT
@ VK_IMAGE_TILING_OPTIMAL
@ 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
@ VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
#define VK_QUEUE_FAMILY_FOREIGN_EXT
VkFlags VkImageCreateFlags
@ VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO
@ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
@ VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID
@ VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO
@ VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO