#include "libANGLE/renderer/vulkan/TextureVk.h"
#include <vulkan/vulkan.h>
#include "common/debug.h"
#include "image_util/generatemip.inc"
#include "libANGLE/Config.h"
#include "libANGLE/Context.h"
#include "libANGLE/Image.h"
#include "libANGLE/MemoryObject.h"
#include "libANGLE/Surface.h"
#include "libANGLE/renderer/renderer_utils.h"
#include "libANGLE/renderer/vulkan/ContextVk.h"
#include "libANGLE/renderer/vulkan/FramebufferVk.h"
#include "libANGLE/renderer/vulkan/ImageVk.h"
#include "libANGLE/renderer/vulkan/MemoryObjectVk.h"
#include "libANGLE/renderer/vulkan/RenderbufferVk.h"
#include "libANGLE/renderer/vulkan/SurfaceVk.h"
#include "libANGLE/renderer/vulkan/UtilsVk.h"
#include "libANGLE/renderer/vulkan/vk_format_utils.h"
#include "libANGLE/renderer/vulkan/vk_helpers.h"
#include "libANGLE/renderer/vulkan/vk_renderer.h"
#include "libANGLE/renderer/vulkan/vk_utils.h"
namespace rx
{
namespace
{
constexpr VkImageUsageFlags kTransferImageFlags = …;
constexpr VkImageUsageFlags kColorAttachmentImageFlags = …;
constexpr VkImageUsageFlags kDrawStagingImageFlags = …;
constexpr VkFormatFeatureFlags kBlitFeatureFlags = …;
constexpr VkImageAspectFlags kDepthStencilAspects = …;
constexpr angle::SubjectIndex kTextureImageSubjectIndex = …;
bool IsTextureLevelInAllocatedImage(const vk::ImageHelper &image,
gl::LevelIndex textureLevelIndexGL)
{ … }
bool IsTextureLevelDefinitionCompatibleWithImage(const vk::ImageHelper &image,
gl::LevelIndex textureLevelIndexGL,
const gl::Extents &size,
angle::FormatID intendedFormatID,
angle::FormatID actualFormatID)
{ … }
bool CanCopyWithTransferForTexImage(vk::Renderer *renderer,
angle::FormatID srcIntendedFormatID,
angle::FormatID srcActualFormatID,
VkImageTiling srcTilingMode,
angle::FormatID dstIntendedFormatID,
angle::FormatID dstActualFormatID,
VkImageTiling dstTilingMode,
bool isViewportFlipY)
{ … }
bool CanCopyWithTransferForCopyTexture(vk::Renderer *renderer,
const vk::ImageHelper &srcImage,
VkImageTiling srcTilingMode,
angle::FormatID destIntendedFormatID,
angle::FormatID destActualFormatID,
VkImageTiling destTilingMode,
bool unpackFlipY,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha)
{ … }
bool CanCopyWithDraw(vk::Renderer *renderer,
const angle::FormatID srcFormatID,
VkImageTiling srcTilingMode,
const angle::FormatID dstFormatID,
VkImageTiling destTilingMode)
{ … }
bool CanGenerateMipmapWithCompute(vk::Renderer *renderer,
VkImageType imageType,
angle::FormatID formatID,
GLint samples,
bool canBeRespecified)
{ … }
void GetRenderTargetLayerCountAndIndex(vk::ImageHelper *image,
const gl::ImageIndex &index,
GLuint *layerIndex,
GLuint *layerCount,
GLuint *imageLayerCount)
{ … }
void Set3DBaseArrayLayerAndLayerCount(VkImageSubresourceLayers *Subresource)
{ … }
const vk::Format *AdjustStorageViewFormatPerWorkarounds(vk::Renderer *renderer,
const vk::Format *intended,
vk::ImageAccess access)
{ … }
const vk::Format *AdjustViewFormatForSampler(vk::Renderer *renderer,
const vk::Format *intended,
gl::SamplerFormat samplerFormat)
{ … }
angle::FormatID GetRGBAEmulationDstFormat(angle::FormatID srcFormatID)
{ … }
bool NeedsRGBAEmulation(vk::Renderer *renderer, angle::FormatID formatID)
{ … }
}
TextureVk::TextureVk(const gl::TextureState &state, vk::Renderer *renderer)
: … { … }
TextureVk::~TextureVk() = default;
void TextureVk::onDestroy(const gl::Context *context)
{ … }
angle::Result TextureVk::setImage(const gl::Context *context,
const gl::ImageIndex &index,
GLenum internalFormat,
const gl::Extents &size,
GLenum format,
GLenum type,
const gl::PixelUnpackState &unpack,
gl::Buffer *unpackBuffer,
const uint8_t *pixels)
{ … }
angle::Result TextureVk::setSubImage(const gl::Context *context,
const gl::ImageIndex &index,
const gl::Box &area,
GLenum format,
GLenum type,
const gl::PixelUnpackState &unpack,
gl::Buffer *unpackBuffer,
const uint8_t *pixels)
{ … }
bool TextureVk::isCompressedFormatEmulated(const gl::Context *context,
gl::TextureTarget target,
GLint level)
{ … }
angle::Result TextureVk::setCompressedImage(const gl::Context *context,
const gl::ImageIndex &index,
GLenum internalFormat,
const gl::Extents &size,
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels)
{ … }
angle::Result TextureVk::setCompressedSubImage(const gl::Context *context,
const gl::ImageIndex &index,
const gl::Box &area,
GLenum format,
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels)
{ … }
angle::Result TextureVk::setImageImpl(const gl::Context *context,
const gl::ImageIndex &index,
const gl::InternalFormat &formatInfo,
const gl::Extents &size,
GLenum type,
const gl::PixelUnpackState &unpack,
gl::Buffer *unpackBuffer,
const uint8_t *pixels)
{ … }
bool TextureVk::isFastUnpackPossible(const vk::Format &vkFormat,
size_t offset,
const vk::Format &bufferVkFormat) const
{ … }
bool TextureVk::isMipImageDescDefined(gl::TextureTarget textureTarget, size_t level)
{ … }
bool TextureVk::isMutableTextureConsistentlySpecifiedForFlush()
{ … }
bool TextureVk::updateMustBeFlushed(gl::LevelIndex textureLevelIndexGL,
angle::FormatID dstImageFormatID) const
{ … }
bool TextureVk::updateMustBeStaged(gl::LevelIndex textureLevelIndexGL,
angle::FormatID dstImageFormatID) const
{ … }
angle::Result TextureVk::setSubImageImpl(const gl::Context *context,
const gl::ImageIndex &index,
const gl::Box &area,
const gl::InternalFormat &formatInfo,
GLenum type,
const gl::PixelUnpackState &unpack,
gl::Buffer *unpackBuffer,
const uint8_t *pixels,
const vk::Format &vkFormat)
{ … }
angle::Result TextureVk::copyImage(const gl::Context *context,
const gl::ImageIndex &index,
const gl::Rectangle &sourceArea,
GLenum internalFormat,
gl::Framebuffer *source)
{ … }
angle::Result TextureVk::copySubImage(const gl::Context *context,
const gl::ImageIndex &index,
const gl::Offset &destOffset,
const gl::Rectangle &sourceArea,
gl::Framebuffer *source)
{ … }
angle::Result TextureVk::copyTexture(const gl::Context *context,
const gl::ImageIndex &index,
GLenum internalFormat,
GLenum type,
GLint sourceLevelGL,
bool unpackFlipY,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
const gl::Texture *source)
{ … }
angle::Result TextureVk::copySubTexture(const gl::Context *context,
const gl::ImageIndex &index,
const gl::Offset &dstOffset,
GLint srcLevelGL,
const gl::Box &sourceBox,
bool unpackFlipY,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
const gl::Texture *source)
{ … }
angle::Result TextureVk::copyRenderbufferSubData(const gl::Context *context,
const gl::Renderbuffer *srcBuffer,
GLint srcLevel,
GLint srcX,
GLint srcY,
GLint srcZ,
GLint dstLevel,
GLint dstX,
GLint dstY,
GLint dstZ,
GLsizei srcWidth,
GLsizei srcHeight,
GLsizei srcDepth)
{ … }
angle::Result TextureVk::copyTextureSubData(const gl::Context *context,
const gl::Texture *srcTexture,
GLint srcLevel,
GLint srcX,
GLint srcY,
GLint srcZ,
GLint dstLevel,
GLint dstX,
GLint dstY,
GLint dstZ,
GLsizei srcWidth,
GLsizei srcHeight,
GLsizei srcDepth)
{ … }
angle::Result TextureVk::copyCompressedTexture(const gl::Context *context,
const gl::Texture *source)
{ … }
angle::Result TextureVk::copySubImageImpl(const gl::Context *context,
const gl::ImageIndex &index,
const gl::Offset &destOffset,
const gl::Rectangle &sourceArea,
const gl::InternalFormat &internalFormat,
gl::Framebuffer *source)
{ … }
angle::Result TextureVk::copySubTextureImpl(ContextVk *contextVk,
const gl::ImageIndex &index,
const gl::Offset &dstOffset,
const gl::InternalFormat &dstFormat,
gl::LevelIndex sourceLevelGL,
const gl::Box &sourceBox,
bool unpackFlipY,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
TextureVk *source)
{ … }
angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
const gl::ImageIndex &index,
const gl::Offset &dstOffset,
const vk::Format &dstFormat,
gl::LevelIndex sourceLevelGL,
size_t sourceLayer,
const gl::Box &sourceBox,
vk::ImageHelper *srcImage)
{ … }
angle::Result TextureVk::copySubImageImplWithDraw(ContextVk *contextVk,
const gl::ImageIndex &index,
const gl::Offset &dstOffset,
const vk::Format &dstFormat,
gl::LevelIndex sourceLevelGL,
const gl::Box &sourceBox,
bool isSrcFlipY,
bool unpackFlipY,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
vk::ImageHelper *srcImage,
const vk::ImageView *srcView,
SurfaceRotation srcFramebufferRotation)
{ … }
angle::Result TextureVk::setStorage(const gl::Context *context,
gl::TextureType type,
size_t levels,
GLenum internalFormat,
const gl::Extents &size)
{ … }
angle::Result TextureVk::setStorageMultisample(const gl::Context *context,
gl::TextureType type,
GLsizei samples,
GLint internalformat,
const gl::Extents &size,
bool fixedSampleLocations)
{ … }
angle::Result TextureVk::setStorageExternalMemory(const gl::Context *context,
gl::TextureType type,
size_t levels,
GLenum internalFormat,
const gl::Extents &size,
gl::MemoryObject *memoryObject,
GLuint64 offset,
GLbitfield createFlags,
GLbitfield usageFlags,
const void *imageCreateInfoPNext)
{ … }
void TextureVk::handleImmutableSamplerTransition(const vk::ImageHelper *previousImage,
const vk::ImageHelper *nextImage)
{ … }
angle::Result TextureVk::setEGLImageTarget(const gl::Context *context,
gl::TextureType type,
egl::Image *image)
{ … }
angle::Result TextureVk::setImageExternal(const gl::Context *context,
gl::TextureType type,
egl::Stream *stream,
const egl::Stream::GLTextureDescription &desc)
{ … }
angle::Result TextureVk::setBuffer(const gl::Context *context, GLenum internalFormat)
{ … }
gl::ImageIndex TextureVk::getNativeImageIndex(const gl::ImageIndex &inputImageIndex) const
{ … }
gl::LevelIndex TextureVk::getNativeImageLevel(gl::LevelIndex frontendLevel) const
{ … }
uint32_t TextureVk::getNativeImageLayer(uint32_t frontendLayer) const
{ … }
void TextureVk::releaseAndDeleteImageAndViews(ContextVk *contextVk)
{ … }
void TextureVk::initImageUsageFlags(ContextVk *contextVk, angle::FormatID actualFormatID)
{ … }
angle::Result TextureVk::ensureImageAllocated(ContextVk *contextVk, const vk::Format &format)
{ … }
void TextureVk::setImageHelper(ContextVk *contextVk,
vk::ImageHelper *imageHelper,
gl::TextureType eglImageNativeType,
uint32_t imageLevelOffset,
uint32_t imageLayerOffset,
bool selfOwned,
UniqueSerial siblingSerial)
{ … }
angle::Result TextureVk::redefineLevel(const gl::Context *context,
const gl::ImageIndex &index,
const vk::Format &format,
const gl::Extents &size)
{ … }
angle::Result TextureVk::copyImageDataToBufferAndGetData(ContextVk *contextVk,
gl::LevelIndex sourceLevelGL,
uint32_t layerCount,
const gl::Box &sourceArea,
RenderPassClosureReason reason,
vk::BufferHelper *copyBuffer,
uint8_t **outDataPtr)
{ … }
angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk,
vk::BufferHelper *srcBuffer,
const gl::ImageIndex index,
uint32_t rowLength,
uint32_t imageHeight,
const gl::Box &sourceArea,
size_t offset,
VkImageAspectFlags aspectFlags)
{ … }
angle::Result TextureVk::generateMipmapsWithCompute(ContextVk *contextVk)
{ … }
angle::Result TextureVk::generateMipmapsWithCPU(const gl::Context *context)
{ … }
angle::Result TextureVk::generateMipmap(const gl::Context *context)
{ … }
angle::Result TextureVk::setBaseLevel(const gl::Context *context, GLuint baseLevel)
{ … }
angle::Result TextureVk::maybeUpdateBaseMaxLevels(ContextVk *contextVk,
TextureUpdateResult *updateResultOut)
{ … }
angle::Result TextureVk::copyAndStageImageData(ContextVk *contextVk,
gl::LevelIndex previousFirstAllocateLevel,
vk::ImageHelper *srcImage,
vk::ImageHelper *dstImage)
{ … }
angle::Result TextureVk::reinitImageAsRenderable(ContextVk *contextVk, const vk::Format &format)
{ … }
angle::Result TextureVk::respecifyImageStorage(ContextVk *contextVk)
{ … }
angle::Result TextureVk::bindTexImage(const gl::Context *context, egl::Surface *surface)
{ … }
angle::Result TextureVk::releaseTexImage(const gl::Context *context)
{ … }
angle::Result TextureVk::getAttachmentRenderTarget(const gl::Context *context,
GLenum binding,
const gl::ImageIndex &imageIndex,
GLsizei samples,
FramebufferAttachmentRenderTarget **rtOut)
{ … }
angle::Result TextureVk::ensureImageInitialized(ContextVk *contextVk, ImageMipLevels mipLevels)
{ … }
angle::Result TextureVk::flushImageStagedUpdates(ContextVk *contextVk)
{ … }
angle::Result TextureVk::performImageQueueTransferIfNecessary(ContextVk *contextVk)
{ … }
void TextureVk::initSingleLayerRenderTargets(ContextVk *contextVk,
GLuint layerCount,
gl::LevelIndex levelIndex,
gl::RenderToTextureImageIndex renderToTextureIndex)
{ … }
RenderTargetVk *TextureVk::getMultiLayerRenderTarget(ContextVk *contextVk,
gl::LevelIndex level,
GLuint layerIndex,
GLuint layerCount)
{ … }
void TextureVk::prepareForGenerateMipmap(ContextVk *contextVk)
{ … }
angle::Result TextureVk::respecifyImageStorageIfNecessary(ContextVk *contextVk, gl::Command source)
{ … }
angle::Result TextureVk::onLabelUpdate(const gl::Context *context)
{ … }
angle::Result TextureVk::updateTextureLabel(ContextVk *contextVk)
{ … }
vk::BufferHelper *TextureVk::getRGBAConversionBufferHelper(vk::Renderer *renderer,
angle::FormatID formatID) const
{ … }
angle::Result TextureVk::convertBufferToRGBA(ContextVk *contextVk, size_t &conversionBufferSize)
{ … }
angle::Result TextureVk::syncState(const gl::Context *context,
const gl::Texture::DirtyBits &dirtyBits,
gl::Command source)
{ … }
angle::Result TextureVk::initializeContents(const gl::Context *context,
GLenum binding,
const gl::ImageIndex &imageIndex)
{ … }
angle::Result TextureVk::initializeContentsWithBlack(const gl::Context *context,
GLenum binding,
const gl::ImageIndex &imageIndex)
{ … }
void TextureVk::releaseOwnershipOfImage(const gl::Context *context)
{ … }
bool TextureVk::shouldDecodeSRGB(vk::Context *context,
GLenum srgbDecode,
bool texelFetchStaticUse) const
{ … }
const vk::ImageView &TextureVk::getReadImageView(vk::Context *context,
GLenum srgbDecode,
bool texelFetchStaticUse,
bool samplerExternal2DY2YEXT) const
{ … }
const vk::ImageView &TextureVk::getCopyImageView() const
{ … }
angle::Result TextureVk::getLevelLayerImageView(vk::Context *context,
gl::LevelIndex level,
size_t layer,
const vk::ImageView **imageViewOut)
{ … }
angle::Result TextureVk::getStorageImageView(vk::Context *context,
const gl::ImageUnit &binding,
const vk::ImageView **imageViewOut)
{ … }
vk::BufferHelper *TextureVk::getPossiblyEmulatedTextureBuffer(vk::Context *context) const
{ … }
angle::Result TextureVk::getBufferViewAndRecordUse(vk::Context *context,
const vk::Format *imageUniformFormat,
const gl::SamplerBinding *samplerBinding,
bool isImage,
const vk::BufferView **viewOut)
{ … }
angle::Result TextureVk::initImage(ContextVk *contextVk,
angle::FormatID intendedImageFormatID,
angle::FormatID actualImageFormatID,
ImageMipLevels mipLevels)
{ … }
angle::Result TextureVk::initImageViews(ContextVk *contextVk, uint32_t levelCount)
{ … }
void TextureVk::releaseImage(ContextVk *contextVk)
{ … }
void TextureVk::releaseImageViews(ContextVk *contextVk)
{ … }
void TextureVk::releaseStagedUpdates(ContextVk *contextVk)
{ … }
uint32_t TextureVk::getMipLevelCount(ImageMipLevels mipLevels) const
{ … }
uint32_t TextureVk::getMaxLevelCount() const
{ … }
angle::Result TextureVk::generateMipmapLevelsWithCPU(ContextVk *contextVk,
const angle::Format &sourceFormat,
GLuint layer,
gl::LevelIndex firstMipLevel,
gl::LevelIndex maxMipLevel,
const size_t sourceWidth,
const size_t sourceHeight,
const size_t sourceDepth,
const size_t sourceRowPitch,
const size_t sourceDepthPitch,
uint8_t *sourceData)
{ … }
const gl::InternalFormat &TextureVk::getImplementationSizedFormat(const gl::Context *context) const
{ … }
GLenum TextureVk::getColorReadFormat(const gl::Context *context)
{ … }
GLenum TextureVk::getColorReadType(const gl::Context *context)
{ … }
angle::Result TextureVk::getTexImage(const gl::Context *context,
const gl::PixelPackState &packState,
gl::Buffer *packBuffer,
gl::TextureTarget target,
GLint level,
GLenum format,
GLenum type,
void *pixels)
{ … }
angle::Result TextureVk::getCompressedTexImage(const gl::Context *context,
const gl::PixelPackState &packState,
gl::Buffer *packBuffer,
gl::TextureTarget target,
GLint level,
void *pixels)
{ … }
const vk::Format &TextureVk::getBaseLevelFormat(vk::Renderer *renderer) const
{ … }
void TextureVk::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message)
{ … }
vk::ImageOrBufferViewSubresourceSerial TextureVk::getImageViewSubresourceSerialImpl(
GLenum srgbDecode) const
{ … }
vk::ImageOrBufferViewSubresourceSerial TextureVk::getBufferViewSerial() const
{ … }
vk::ImageOrBufferViewSubresourceSerial TextureVk::getStorageImageViewSerial(
const gl::ImageUnit &binding) const
{ … }
uint32_t TextureVk::getImageViewLayerCount() const
{ … }
uint32_t TextureVk::getImageViewLevelCount() const
{ … }
angle::Result TextureVk::refreshImageViews(ContextVk *contextVk)
{ … }
angle::Result TextureVk::ensureMutable(ContextVk *contextVk)
{ … }
angle::Result TextureVk::ensureRenderable(ContextVk *contextVk,
TextureUpdateResult *updateResultOut)
{ … }
angle::Result TextureVk::ensureRenderableWithFormat(ContextVk *contextVk,
const vk::Format &format,
TextureUpdateResult *updateResultOut)
{ … }
angle::Result TextureVk::ensureRenderableIfCopyTextureCannotTransfer(
ContextVk *contextVk,
const gl::InternalFormat &dstFormat,
bool unpackFlipY,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
TextureVk *source)
{ … }
angle::Result TextureVk::ensureRenderableIfCopyTexImageCannotTransfer(
ContextVk *contextVk,
const gl::InternalFormat &dstFormat,
gl::Framebuffer *source)
{ … }
void TextureVk::stageSelfAsSubresourceUpdates(ContextVk *contextVk)
{ … }
void TextureVk::updateCachedImageViewSerials()
{ … }
}