From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- .../src/libANGLE/renderer/d3d/TextureD3D.h | 1050 ++++++++++++++++++++ 1 file changed, 1050 insertions(+) create mode 100644 gfx/angle/checkout/src/libANGLE/renderer/d3d/TextureD3D.h (limited to 'gfx/angle/checkout/src/libANGLE/renderer/d3d/TextureD3D.h') diff --git a/gfx/angle/checkout/src/libANGLE/renderer/d3d/TextureD3D.h b/gfx/angle/checkout/src/libANGLE/renderer/d3d/TextureD3D.h new file mode 100644 index 0000000000..a87806b3e7 --- /dev/null +++ b/gfx/angle/checkout/src/libANGLE/renderer/d3d/TextureD3D.h @@ -0,0 +1,1050 @@ +// +// Copyright 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// TextureD3D.h: Implementations of the Texture interfaces shared betweeen the D3D backends. + +#ifndef LIBANGLE_RENDERER_D3D_TEXTURED3D_H_ +#define LIBANGLE_RENDERER_D3D_TEXTURED3D_H_ + +#include "common/Color.h" +#include "libANGLE/Constants.h" +#include "libANGLE/Stream.h" +#include "libANGLE/angletypes.h" +#include "libANGLE/renderer/TextureImpl.h" +#include "libANGLE/renderer/d3d/RendererD3D.h" +#include "libANGLE/renderer/d3d/TextureStorage.h" + +namespace gl +{ +class Framebuffer; +} + +namespace rx +{ +class EGLImageD3D; +class ImageD3D; +class RendererD3D; +class RenderTargetD3D; +class TextureStorage; + +class TextureD3D : public TextureImpl, public angle::ObserverInterface +{ + public: + TextureD3D(const gl::TextureState &data, RendererD3D *renderer); + ~TextureD3D() override; + + void onDestroy(const gl::Context *context) override; + + angle::Result getNativeTexture(const gl::Context *context, TextureStorage **outStorage); + + bool hasDirtyImages() const { return mDirtyImages; } + void resetDirty() { mDirtyImages = false; } + + virtual ImageD3D *getImage(const gl::ImageIndex &index) const = 0; + virtual GLsizei getLayerCount(int level) const = 0; + + angle::Result getImageAndSyncFromStorage(const gl::Context *context, + const gl::ImageIndex &index, + ImageD3D **outImage); + + GLint getBaseLevelWidth() const; + GLint getBaseLevelHeight() const; + GLenum getBaseLevelInternalFormat() const; + + angle::Result setStorage(const gl::Context *context, + gl::TextureType type, + size_t levels, + GLenum internalFormat, + const gl::Extents &size) override; + + angle::Result setStorageMultisample(const gl::Context *context, + gl::TextureType type, + GLsizei samples, + GLint internalformat, + const gl::Extents &size, + bool fixedSampleLocations) override; + + angle::Result setBuffer(const gl::Context *context, GLenum internalFormat) override; + + angle::Result 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) override; + + bool isImmutable() const { return mImmutable; } + + virtual angle::Result getRenderTarget(const gl::Context *context, + const gl::ImageIndex &index, + GLsizei samples, + RenderTargetD3D **outRT) = 0; + + // Returns an iterator over all "Images" for this particular Texture. + virtual gl::ImageIndexIterator imageIterator() const = 0; + + // Returns an ImageIndex for a particular "Image". 3D Textures do not have images for + // slices of their depth texures, so 3D textures ignore the layer parameter. + virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const = 0; + virtual bool isValidIndex(const gl::ImageIndex &index) const = 0; + + angle::Result setImageExternal(const gl::Context *context, + gl::TextureType type, + egl::Stream *stream, + const egl::Stream::GLTextureDescription &desc) override; + angle::Result generateMipmap(const gl::Context *context) override; + bool hasStorage() const { return mTexStorage != nullptr; } + TextureStorage *getStorage(); + ImageD3D *getBaseLevelImage() const; + + angle::Result getAttachmentRenderTarget(const gl::Context *context, + GLenum binding, + const gl::ImageIndex &imageIndex, + GLsizei samples, + FramebufferAttachmentRenderTarget **rtOut) override; + + angle::Result setBaseLevel(const gl::Context *context, GLuint baseLevel) override; + + angle::Result syncState(const gl::Context *context, + const gl::Texture::DirtyBits &dirtyBits, + gl::Command source) override; + + angle::Result initializeContents(const gl::Context *context, + GLenum binding, + const gl::ImageIndex &imageIndex) override; + + GLsizei getRenderToTextureSamples(); + + angle::Result ensureUnorderedAccess(const gl::Context *context); + angle::Result onLabelUpdate(const gl::Context *context) override; + + // ObserverInterface implementation. + void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override; + + protected: + angle::Result setImageImpl(const gl::Context *context, + const gl::ImageIndex &index, + GLenum type, + const gl::PixelUnpackState &unpack, + gl::Buffer *unpackBuffer, + const uint8_t *pixels, + ptrdiff_t layerOffset); + angle::Result subImage(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, + ptrdiff_t layerOffset); + angle::Result setCompressedImageImpl(const gl::Context *context, + const gl::ImageIndex &index, + const gl::PixelUnpackState &unpack, + const uint8_t *pixels, + ptrdiff_t layerOffset); + angle::Result subImageCompressed(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Box &area, + GLenum format, + const gl::PixelUnpackState &unpack, + const uint8_t *pixels, + ptrdiff_t layerOffset); + bool isFastUnpackable(const gl::Buffer *unpackBuffer, + const gl::PixelUnpackState &unpack, + GLenum sizedInternalFormat); + angle::Result fastUnpackPixels(const gl::Context *context, + const gl::PixelUnpackState &unpack, + gl::Buffer *unpackBuffer, + const uint8_t *pixels, + const gl::Box &destArea, + GLenum sizedInternalFormat, + GLenum type, + RenderTargetD3D *destRenderTarget); + + GLint getLevelZeroWidth() const; + GLint getLevelZeroHeight() const; + virtual GLint getLevelZeroDepth() const; + + GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const; + virtual angle::Result initMipmapImages(const gl::Context *context) = 0; + bool isBaseImageZeroSize() const; + virtual bool isImageComplete(const gl::ImageIndex &index) const = 0; + + bool canCreateRenderTargetForImage(const gl::ImageIndex &index) const; + angle::Result ensureBindFlags(const gl::Context *context, BindFlags bindFlags); + angle::Result ensureRenderTarget(const gl::Context *context); + + virtual angle::Result createCompleteStorage(const gl::Context *context, + BindFlags bindFlags, + TexStoragePointer *outTexStorage) const = 0; + virtual angle::Result setCompleteTexStorage(const gl::Context *context, + TextureStorage *newCompleteTexStorage) = 0; + angle::Result commitRegion(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Box ®ion); + + angle::Result releaseTexStorage(const gl::Context *context, + const gl::TexLevelMask ©StorageToImagesMask); + + GLuint getBaseLevel() const { return mBaseLevel; } + + virtual void markAllImagesDirty() = 0; + + GLint getBaseLevelDepth() const; + + RendererD3D *mRenderer; + + bool mDirtyImages; + + bool mImmutable; + TextureStorage *mTexStorage; + angle::ObserverBinding mTexStorageObserverBinding; + + private: + virtual angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) = 0; + + virtual angle::Result updateStorage(const gl::Context *context) = 0; + + bool couldUseSetData() const; + bool shouldUseSetData(const ImageD3D *image) const; + + angle::Result generateMipmapUsingImages(const gl::Context *context, const GLuint maxLevel); + + GLuint mBaseLevel; +}; + +class TextureD3D_2D : public TextureD3D +{ + public: + TextureD3D_2D(const gl::TextureState &data, RendererD3D *renderer); + ~TextureD3D_2D() override; + + void onDestroy(const gl::Context *context) override; + + ImageD3D *getImage(int level, int layer) const; + ImageD3D *getImage(const gl::ImageIndex &index) const override; + GLsizei getLayerCount(int level) const override; + + GLsizei getWidth(GLint level) const; + GLsizei getHeight(GLint level) const; + GLenum getInternalFormat(GLint level) const; + bool isDepth(GLint level) const; + bool isSRGB(GLint level) const; + + angle::Result 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) override; + angle::Result 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) override; + + angle::Result 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) override; + angle::Result 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) override; + + angle::Result copyImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Rectangle &sourceArea, + GLenum internalFormat, + gl::Framebuffer *source) override; + angle::Result copySubImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Offset &destOffset, + const gl::Rectangle &sourceArea, + gl::Framebuffer *source) override; + + angle::Result copyTexture(const gl::Context *context, + const gl::ImageIndex &index, + GLenum internalFormat, + GLenum type, + GLint sourceLevel, + bool unpackFlipY, + bool unpackPremultiplyAlpha, + bool unpackUnmultiplyAlpha, + const gl::Texture *source) override; + angle::Result copySubTexture(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Offset &destOffset, + GLint sourceLevel, + const gl::Box &sourceBox, + bool unpackFlipY, + bool unpackPremultiplyAlpha, + bool unpackUnmultiplyAlpha, + const gl::Texture *source) override; + angle::Result copyCompressedTexture(const gl::Context *context, + const gl::Texture *source) override; + + angle::Result setStorage(const gl::Context *context, + gl::TextureType type, + size_t levels, + GLenum internalFormat, + const gl::Extents &size) override; + + angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; + angle::Result releaseTexImage(const gl::Context *context) override; + + angle::Result setEGLImageTarget(const gl::Context *context, + gl::TextureType type, + egl::Image *image) override; + + angle::Result getRenderTarget(const gl::Context *context, + const gl::ImageIndex &index, + GLsizei samples, + RenderTargetD3D **outRT) override; + + gl::ImageIndexIterator imageIterator() const override; + gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; + bool isValidIndex(const gl::ImageIndex &index) const override; + + protected: + void markAllImagesDirty() override; + + private: + angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; + angle::Result createCompleteStorage(const gl::Context *context, + BindFlags bindFlags, + TexStoragePointer *outTexStorage) const override; + angle::Result setCompleteTexStorage(const gl::Context *context, + TextureStorage *newCompleteTexStorage) override; + + angle::Result updateStorage(const gl::Context *context) override; + angle::Result initMipmapImages(const gl::Context *context) override; + + bool isValidLevel(int level) const; + bool isLevelComplete(int level) const; + bool isImageComplete(const gl::ImageIndex &index) const override; + + angle::Result updateStorageLevel(const gl::Context *context, int level); + + angle::Result redefineImage(const gl::Context *context, + size_t level, + GLenum internalformat, + const gl::Extents &size, + bool forceRelease); + + bool mEGLImageTarget; + gl::TexLevelArray> mImageArray; +}; + +class TextureD3D_Cube : public TextureD3D +{ + public: + TextureD3D_Cube(const gl::TextureState &data, RendererD3D *renderer); + ~TextureD3D_Cube() override; + + void onDestroy(const gl::Context *context) override; + + ImageD3D *getImage(int level, int layer) const; + ImageD3D *getImage(const gl::ImageIndex &index) const override; + GLsizei getLayerCount(int level) const override; + + GLenum getInternalFormat(GLint level, GLint layer) const; + bool isDepth(GLint level, GLint layer) const; + bool isSRGB(GLint level, GLint layer) const; + + angle::Result 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) override; + angle::Result 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) override; + + angle::Result 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) override; + angle::Result 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) override; + + angle::Result copyImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Rectangle &sourceArea, + GLenum internalFormat, + gl::Framebuffer *source) override; + angle::Result copySubImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Offset &destOffset, + const gl::Rectangle &sourceArea, + gl::Framebuffer *source) override; + + angle::Result copyTexture(const gl::Context *context, + const gl::ImageIndex &index, + GLenum internalFormat, + GLenum type, + GLint sourceLevel, + bool unpackFlipY, + bool unpackPremultiplyAlpha, + bool unpackUnmultiplyAlpha, + const gl::Texture *source) override; + angle::Result copySubTexture(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Offset &destOffset, + GLint sourceLevel, + const gl::Box &sourceBox, + bool unpackFlipY, + bool unpackPremultiplyAlpha, + bool unpackUnmultiplyAlpha, + const gl::Texture *source) override; + + angle::Result setStorage(const gl::Context *context, + gl::TextureType type, + size_t levels, + GLenum internalFormat, + const gl::Extents &size) override; + + angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; + angle::Result releaseTexImage(const gl::Context *context) override; + + angle::Result setEGLImageTarget(const gl::Context *context, + gl::TextureType type, + egl::Image *image) override; + + angle::Result getRenderTarget(const gl::Context *context, + const gl::ImageIndex &index, + GLsizei samples, + RenderTargetD3D **outRT) override; + + gl::ImageIndexIterator imageIterator() const override; + gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; + bool isValidIndex(const gl::ImageIndex &index) const override; + + protected: + void markAllImagesDirty() override; + + private: + angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; + angle::Result createCompleteStorage(const gl::Context *context, + BindFlags bindFlags, + TexStoragePointer *outTexStorage) const override; + angle::Result setCompleteTexStorage(const gl::Context *context, + TextureStorage *newCompleteTexStorage) override; + + angle::Result updateStorage(const gl::Context *context) override; + angle::Result initMipmapImages(const gl::Context *context) override; + + bool isValidFaceLevel(int faceIndex, int level) const; + bool isFaceLevelComplete(int faceIndex, int level) const; + bool isCubeComplete() const; + bool isImageComplete(const gl::ImageIndex &index) const override; + angle::Result updateStorageFaceLevel(const gl::Context *context, int faceIndex, int level); + + angle::Result redefineImage(const gl::Context *context, + int faceIndex, + GLint level, + GLenum internalformat, + const gl::Extents &size, + bool forceRelease); + + std::array>, 6> mImageArray; +}; + +class TextureD3D_3D : public TextureD3D +{ + public: + TextureD3D_3D(const gl::TextureState &data, RendererD3D *renderer); + ~TextureD3D_3D() override; + + void onDestroy(const gl::Context *context) override; + + ImageD3D *getImage(int level, int layer) const; + ImageD3D *getImage(const gl::ImageIndex &index) const override; + GLsizei getLayerCount(int level) const override; + + GLsizei getWidth(GLint level) const; + GLsizei getHeight(GLint level) const; + GLsizei getDepth(GLint level) const; + GLenum getInternalFormat(GLint level) const; + bool isDepth(GLint level) const; + bool isSRGB(GLint level) const; + + angle::Result 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) override; + angle::Result 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) override; + + angle::Result 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) override; + angle::Result 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) override; + + angle::Result copyImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Rectangle &sourceArea, + GLenum internalFormat, + gl::Framebuffer *source) override; + angle::Result copySubImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Offset &destOffset, + const gl::Rectangle &sourceArea, + gl::Framebuffer *source) override; + + angle::Result copyTexture(const gl::Context *context, + const gl::ImageIndex &index, + GLenum internalFormat, + GLenum type, + GLint sourceLevel, + bool unpackFlipY, + bool unpackPremultiplyAlpha, + bool unpackUnmultiplyAlpha, + const gl::Texture *source) override; + angle::Result copySubTexture(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Offset &destOffset, + GLint sourceLevel, + const gl::Box &sourceBox, + bool unpackFlipY, + bool unpackPremultiplyAlpha, + bool unpackUnmultiplyAlpha, + const gl::Texture *source) override; + + angle::Result setStorage(const gl::Context *context, + gl::TextureType type, + size_t levels, + GLenum internalFormat, + const gl::Extents &size) override; + + angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; + angle::Result releaseTexImage(const gl::Context *context) override; + + angle::Result setEGLImageTarget(const gl::Context *context, + gl::TextureType type, + egl::Image *image) override; + + angle::Result getRenderTarget(const gl::Context *context, + const gl::ImageIndex &index, + GLsizei samples, + RenderTargetD3D **outRT) override; + + gl::ImageIndexIterator imageIterator() const override; + gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; + bool isValidIndex(const gl::ImageIndex &index) const override; + + protected: + void markAllImagesDirty() override; + GLint getLevelZeroDepth() const override; + + private: + angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; + angle::Result createCompleteStorage(const gl::Context *context, + BindFlags bindFlags, + TexStoragePointer *outStorage) const override; + angle::Result setCompleteTexStorage(const gl::Context *context, + TextureStorage *newCompleteTexStorage) override; + + angle::Result updateStorage(const gl::Context *context) override; + angle::Result initMipmapImages(const gl::Context *context) override; + + bool isValidLevel(int level) const; + bool isLevelComplete(int level) const; + bool isImageComplete(const gl::ImageIndex &index) const override; + angle::Result updateStorageLevel(const gl::Context *context, int level); + + angle::Result redefineImage(const gl::Context *context, + GLint level, + GLenum internalformat, + const gl::Extents &size, + bool forceRelease); + + gl::TexLevelArray> mImageArray; +}; + +class TextureD3D_2DArray : public TextureD3D +{ + public: + TextureD3D_2DArray(const gl::TextureState &data, RendererD3D *renderer); + ~TextureD3D_2DArray() override; + + void onDestroy(const gl::Context *context) override; + + virtual ImageD3D *getImage(int level, int layer) const; + ImageD3D *getImage(const gl::ImageIndex &index) const override; + GLsizei getLayerCount(int level) const override; + + GLsizei getWidth(GLint level) const; + GLsizei getHeight(GLint level) const; + GLenum getInternalFormat(GLint level) const; + bool isDepth(GLint level) const; + + angle::Result 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) override; + angle::Result 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) override; + + angle::Result 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) override; + angle::Result 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) override; + + angle::Result copyImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Rectangle &sourceArea, + GLenum internalFormat, + gl::Framebuffer *source) override; + angle::Result copySubImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Offset &destOffset, + const gl::Rectangle &sourceArea, + gl::Framebuffer *source) override; + + angle::Result copyTexture(const gl::Context *context, + const gl::ImageIndex &index, + GLenum internalFormat, + GLenum type, + GLint sourceLevel, + bool unpackFlipY, + bool unpackPremultiplyAlpha, + bool unpackUnmultiplyAlpha, + const gl::Texture *source) override; + angle::Result copySubTexture(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Offset &destOffset, + GLint sourceLevel, + const gl::Box &sourceBox, + bool unpackFlipY, + bool unpackPremultiplyAlpha, + bool unpackUnmultiplyAlpha, + const gl::Texture *source) override; + + angle::Result setStorage(const gl::Context *context, + gl::TextureType type, + size_t levels, + GLenum internalFormat, + const gl::Extents &size) override; + + angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; + angle::Result releaseTexImage(const gl::Context *context) override; + + angle::Result setEGLImageTarget(const gl::Context *context, + gl::TextureType type, + egl::Image *image) override; + + angle::Result getRenderTarget(const gl::Context *context, + const gl::ImageIndex &index, + GLsizei samples, + RenderTargetD3D **outRT) override; + + gl::ImageIndexIterator imageIterator() const override; + gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; + bool isValidIndex(const gl::ImageIndex &index) const override; + + protected: + void markAllImagesDirty() override; + + private: + angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; + angle::Result createCompleteStorage(const gl::Context *context, + BindFlags bindFlags, + TexStoragePointer *outStorage) const override; + angle::Result setCompleteTexStorage(const gl::Context *context, + TextureStorage *newCompleteTexStorage) override; + + angle::Result updateStorage(const gl::Context *context) override; + angle::Result initMipmapImages(const gl::Context *context) override; + + bool isValidLevel(int level) const; + bool isLevelComplete(int level) const; + bool isImageComplete(const gl::ImageIndex &index) const override; + bool isSRGB(GLint level) const; + angle::Result updateStorageLevel(const gl::Context *context, int level); + + void deleteImages(); + angle::Result redefineImage(const gl::Context *context, + GLint level, + GLenum internalformat, + const gl::Extents &size, + bool forceRelease); + + // Storing images as an array of single depth textures since D3D11 treats each array level of a + // Texture2D object as a separate subresource. Each layer would have to be looped over + // to update all the texture layers since they cannot all be updated at once and it makes the + // most sense for the Image class to not have to worry about layer subresource as well as mip + // subresources. + GLsizei mLayerCounts[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; + ImageD3D **mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; +}; + +// Base class for immutable textures. These don't support manipulation of individual texture images. +class TextureD3DImmutableBase : public TextureD3D +{ + public: + TextureD3DImmutableBase(const gl::TextureState &data, RendererD3D *renderer); + ~TextureD3DImmutableBase() override; + + ImageD3D *getImage(const gl::ImageIndex &index) const override; + angle::Result 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) override; + angle::Result 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) override; + + angle::Result 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) override; + angle::Result 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) override; + + angle::Result copyImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Rectangle &sourceArea, + GLenum internalFormat, + gl::Framebuffer *source) override; + angle::Result copySubImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Offset &destOffset, + const gl::Rectangle &sourceArea, + gl::Framebuffer *source) override; + + angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; + angle::Result releaseTexImage(const gl::Context *context) override; +}; + +class TextureD3D_External : public TextureD3DImmutableBase +{ + public: + TextureD3D_External(const gl::TextureState &data, RendererD3D *renderer); + ~TextureD3D_External() override; + + GLsizei getLayerCount(int level) const override; + + angle::Result setImageExternal(const gl::Context *context, + gl::TextureType type, + egl::Stream *stream, + const egl::Stream::GLTextureDescription &desc) override; + + angle::Result setEGLImageTarget(const gl::Context *context, + gl::TextureType type, + egl::Image *image) override; + + angle::Result getRenderTarget(const gl::Context *context, + const gl::ImageIndex &index, + GLsizei samples, + RenderTargetD3D **outRT) override; + + gl::ImageIndexIterator imageIterator() const override; + gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; + bool isValidIndex(const gl::ImageIndex &index) const override; + + protected: + void markAllImagesDirty() override; + + private: + angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; + angle::Result createCompleteStorage(const gl::Context *context, + BindFlags bindFlags, + TexStoragePointer *outTexStorage) const override; + angle::Result setCompleteTexStorage(const gl::Context *context, + TextureStorage *newCompleteTexStorage) override; + + angle::Result updateStorage(const gl::Context *context) override; + angle::Result initMipmapImages(const gl::Context *context) override; + + bool isImageComplete(const gl::ImageIndex &index) const override; +}; + +class TextureD3D_2DMultisample : public TextureD3DImmutableBase +{ + public: + TextureD3D_2DMultisample(const gl::TextureState &data, RendererD3D *renderer); + ~TextureD3D_2DMultisample() override; + + angle::Result setStorageMultisample(const gl::Context *context, + gl::TextureType type, + GLsizei samples, + GLint internalformat, + const gl::Extents &size, + bool fixedSampleLocations) override; + + angle::Result setEGLImageTarget(const gl::Context *context, + gl::TextureType type, + egl::Image *image) override; + + angle::Result getRenderTarget(const gl::Context *context, + const gl::ImageIndex &index, + GLsizei samples, + RenderTargetD3D **outRT) override; + + gl::ImageIndexIterator imageIterator() const override; + gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; + bool isValidIndex(const gl::ImageIndex &index) const override; + + GLsizei getLayerCount(int level) const override; + + protected: + void markAllImagesDirty() override; + + angle::Result setCompleteTexStorage(const gl::Context *context, + TextureStorage *newCompleteTexStorage) override; + + angle::Result updateStorage(const gl::Context *context) override; + + private: + angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; + angle::Result createCompleteStorage(const gl::Context *context, + BindFlags bindFlags, + TexStoragePointer *outTexStorage) const override; + angle::Result initMipmapImages(const gl::Context *context) override; + + bool isImageComplete(const gl::ImageIndex &index) const override; +}; + +class TextureD3D_2DMultisampleArray : public TextureD3DImmutableBase +{ + public: + TextureD3D_2DMultisampleArray(const gl::TextureState &data, RendererD3D *renderer); + ~TextureD3D_2DMultisampleArray() override; + + angle::Result setStorageMultisample(const gl::Context *context, + gl::TextureType type, + GLsizei samples, + GLint internalformat, + const gl::Extents &size, + bool fixedSampleLocations) override; + + angle::Result setEGLImageTarget(const gl::Context *context, + gl::TextureType type, + egl::Image *image) override; + + angle::Result getRenderTarget(const gl::Context *context, + const gl::ImageIndex &index, + GLsizei samples, + RenderTargetD3D **outRT) override; + + gl::ImageIndexIterator imageIterator() const override; + gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; + bool isValidIndex(const gl::ImageIndex &index) const override; + + GLsizei getLayerCount(int level) const override; + + protected: + void markAllImagesDirty() override; + + angle::Result setCompleteTexStorage(const gl::Context *context, + TextureStorage *newCompleteTexStorage) override; + + angle::Result updateStorage(const gl::Context *context) override; + + private: + angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; + angle::Result createCompleteStorage(const gl::Context *context, + BindFlags bindFlags, + TexStoragePointer *outTexStorage) const override; + angle::Result initMipmapImages(const gl::Context *context) override; + + bool isImageComplete(const gl::ImageIndex &index) const override; + + GLsizei mLayerCount; +}; + +class TextureD3D_Buffer : public TextureD3D +{ + public: + TextureD3D_Buffer(const gl::TextureState &data, RendererD3D *renderer); + ~TextureD3D_Buffer() override; + + ImageD3D *getImage(const gl::ImageIndex &index) const override; + + angle::Result setBuffer(const gl::Context *context, GLenum internalFormat) override; + + angle::Result 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) override; + angle::Result 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) override; + + angle::Result 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) override; + angle::Result 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) override; + + angle::Result copyImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Rectangle &sourceArea, + GLenum internalFormat, + gl::Framebuffer *source) override; + angle::Result copySubImage(const gl::Context *context, + const gl::ImageIndex &index, + const gl::Offset &destOffset, + const gl::Rectangle &sourceArea, + gl::Framebuffer *source) override; + + angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; + angle::Result releaseTexImage(const gl::Context *context) override; + + angle::Result setEGLImageTarget(const gl::Context *context, + gl::TextureType type, + egl::Image *image) override; + + angle::Result getRenderTarget(const gl::Context *context, + const gl::ImageIndex &index, + GLsizei samples, + RenderTargetD3D **outRT) override; + + GLsizei getLayerCount(int level) const override; + + angle::Result syncState(const gl::Context *context, + const gl::Texture::DirtyBits &dirtyBits, + gl::Command source) override; + + gl::ImageIndexIterator imageIterator() const override; + gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; + bool isValidIndex(const gl::ImageIndex &index) const override; + + protected: + void markAllImagesDirty() override; + + private: + angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; + angle::Result createCompleteStorage(const gl::Context *context, + BindFlags bindFlags, + TexStoragePointer *outTexStorage) const override; + angle::Result setCompleteTexStorage(const gl::Context *context, + TextureStorage *newCompleteTexStorage) override; + + angle::Result updateStorage(const gl::Context *context) override; + angle::Result initMipmapImages(const gl::Context *context) override; + + bool isImageComplete(const gl::ImageIndex &index) const override; + + GLenum mInternalFormat; +}; +} // namespace rx + +#endif // LIBANGLE_RENDERER_D3D_TEXTURED3D_H_ -- cgit v1.2.3