blob: 5aa688d2ec4c778786d45c2e508206b4b9cf3264 [file] [log] [blame]
// Copyright 2022 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include "compressedTextureFormats/AstcCpuDecompressor.h"
#include "host/vulkan/VkDecoderContext.h"
#include "vulkan/cereal/common/goldfish_vk_dispatch.h"
#include "vulkan/vulkan.h"
namespace gfxstream {
namespace vk {
// Holds the resources necessary to perform CPU ASTC decompression of a single texture.
class AstcTexture {
public:
AstcTexture(VulkanDispatch* vk, VkDevice device, VkPhysicalDevice physicalDevice,
VkExtent3D imgSize, uint32_t blockWidth, uint32_t blockHeight,
AstcCpuDecompressor* decompressor);
~AstcTexture();
// Whether we're able to decompress ASTC textures on the CPU
bool canDecompressOnCpu() const;
// Whether this texture was successfully decompressed on the CPU
bool successfullyDecompressed() const { return mSuccess; }
void on_vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, uint8_t* srcAstcData,
size_t astcDataSize, VkImage dstImage,
VkImageLayout dstImageLayout, uint32_t regionCount,
const VkBufferImageCopy* pRegions,
const VkDecoderContext& context);
private:
uint8_t* createVkBufferAndMapMemory(size_t bufferSize);
void destroyVkBuffer();
bool mSuccess = false; // true if the image was successfully decompressed
VulkanDispatch* mVk;
VkDevice mDevice;
VkPhysicalDevice mPhysicalDevice;
VkExtent3D mImgSize;
uint32_t mBlockWidth;
uint32_t mBlockHeight;
VkBuffer mDecompBuffer = VK_NULL_HANDLE; // VkBuffer of the decompressed image
VkDeviceMemory mDecompBufferMemory = VK_NULL_HANDLE; // Memory of the decompressed image
uint64_t mBufferSize = 0; // Size of the decompressed image
AstcCpuDecompressor* mDecompressor;
};
} // namespace vk
} // namespace gfxstream