diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/renderer/d3d')
182 files changed, 0 insertions, 70447 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp deleted file mode 100644 index 7769ab2b75..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp +++ /dev/null @@ -1,190 +0,0 @@ -// -// 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. -// - -// BufferD3D.cpp Defines common functionality between the Buffer9 and Buffer11 classes. - -#include "libANGLE/renderer/d3d/BufferD3D.h" - -#include "common/mathutil.h" -#include "common/utilities.h" -#include "libANGLE/renderer/d3d/IndexBuffer.h" -#include "libANGLE/renderer/d3d/VertexBuffer.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" - -namespace rx -{ - -unsigned int BufferD3D::mNextSerial = 1; - -BufferD3D::BufferD3D(const gl::BufferState &state, BufferFactoryD3D *factory) - : BufferImpl(state), - mFactory(factory), - mStaticIndexBuffer(nullptr), - mStaticBufferCacheTotalSize(0), - mStaticVertexBufferOutOfDate(false), - mUnmodifiedDataUse(0), - mUsage(D3DBufferUsage::STATIC) -{ - updateSerial(); -} - -BufferD3D::~BufferD3D() -{ - SafeDelete(mStaticIndexBuffer); -} - -void BufferD3D::emptyStaticBufferCache() -{ - mStaticVertexBuffers.clear(); - mStaticBufferCacheTotalSize = 0; -} - -void BufferD3D::updateSerial() -{ - mSerial = mNextSerial++; -} - -void BufferD3D::updateD3DBufferUsage(const gl::Context *context, gl::BufferUsage usage) -{ - switch (usage) - { - case gl::BufferUsage::StaticCopy: - case gl::BufferUsage::StaticDraw: - case gl::BufferUsage::StaticRead: - mUsage = D3DBufferUsage::STATIC; - initializeStaticData(context); - break; - - case gl::BufferUsage::DynamicCopy: - case gl::BufferUsage::DynamicDraw: - case gl::BufferUsage::DynamicRead: - case gl::BufferUsage::StreamCopy: - case gl::BufferUsage::StreamDraw: - case gl::BufferUsage::StreamRead: - mUsage = D3DBufferUsage::DYNAMIC; - break; - default: - UNREACHABLE(); - } -} - -void BufferD3D::initializeStaticData(const gl::Context *context) -{ - if (mStaticVertexBuffers.empty()) - { - StaticVertexBufferInterface *newStaticBuffer = new StaticVertexBufferInterface(mFactory); - mStaticVertexBuffers.push_back( - std::unique_ptr<StaticVertexBufferInterface>(newStaticBuffer)); - } - if (!mStaticIndexBuffer) - { - mStaticIndexBuffer = new StaticIndexBufferInterface(mFactory); - } -} - -StaticIndexBufferInterface *BufferD3D::getStaticIndexBuffer() -{ - return mStaticIndexBuffer; -} - -StaticVertexBufferInterface *BufferD3D::getStaticVertexBuffer(const gl::VertexAttribute &attribute, - const gl::VertexBinding &binding) -{ - if (mStaticVertexBuffers.empty()) - { - // Early out if there aren't any static buffers at all - return nullptr; - } - - // Early out, the attribute can be added to mStaticVertexBuffer. - if (mStaticVertexBuffers.size() == 1 && mStaticVertexBuffers[0]->empty()) - { - return mStaticVertexBuffers[0].get(); - } - - // Cache size limiting: track the total allocated buffer sizes. - size_t currentTotalSize = 0; - - // At this point, see if any of the existing static buffers contains the attribute data - // If there is a cached static buffer that already contains the attribute, then return it - for (const auto &staticBuffer : mStaticVertexBuffers) - { - if (staticBuffer->matchesAttribute(attribute, binding)) - { - return staticBuffer.get(); - } - - currentTotalSize += staticBuffer->getBufferSize(); - } - - // Cache size limiting: Clean-up threshold is four times the base buffer size, with a minimum. - ASSERT(getSize() < std::numeric_limits<size_t>::max() / 4u); - size_t sizeThreshold = std::max(getSize() * 4u, static_cast<size_t>(0x1000u)); - - // If we're past the threshold, clear the buffer cache. Note that this will release buffers - // that are currenly bound, and in an edge case can even translate the same attribute twice - // in the same draw call. It will not delete currently bound buffers, however, because they - // are ref counted. - if (currentTotalSize > sizeThreshold) - { - emptyStaticBufferCache(); - } - - // At this point, we must create a new static buffer for the attribute data. - StaticVertexBufferInterface *newStaticBuffer = new StaticVertexBufferInterface(mFactory); - newStaticBuffer->setAttribute(attribute, binding); - mStaticVertexBuffers.push_back(std::unique_ptr<StaticVertexBufferInterface>(newStaticBuffer)); - return newStaticBuffer; -} - -void BufferD3D::invalidateStaticData(const gl::Context *context) -{ - emptyStaticBufferCache(); - - if (mStaticIndexBuffer && mStaticIndexBuffer->getBufferSize() != 0) - { - SafeDelete(mStaticIndexBuffer); - } - - // If the buffer was created with a static usage then we recreate the static - // buffers so that they are populated the next time we use this buffer. - if (mUsage == D3DBufferUsage::STATIC) - { - initializeStaticData(context); - } - - mUnmodifiedDataUse = 0; -} - -// Creates static buffers if sufficient used data has been left unmodified -void BufferD3D::promoteStaticUsage(const gl::Context *context, int dataSize) -{ - if (mUsage == D3DBufferUsage::DYNAMIC) - { - mUnmodifiedDataUse += dataSize; - - if (mUnmodifiedDataUse > 3 * getSize()) - { - updateD3DBufferUsage(context, gl::BufferUsage::StaticDraw); - } - } -} - -gl::Error BufferD3D::getIndexRange(const gl::Context *context, - GLenum type, - size_t offset, - size_t count, - bool primitiveRestartEnabled, - gl::IndexRange *outRange) -{ - const uint8_t *data = nullptr; - ANGLE_TRY(getData(context, &data)); - - *outRange = gl::ComputeIndexRange(type, data + offset, count, primitiveRestartEnabled); - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.h deleted file mode 100644 index 60153748e6..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.h +++ /dev/null @@ -1,89 +0,0 @@ -// -// 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. -// - -// BufferD3D.h: Defines the rx::BufferD3D class, an implementation of BufferImpl. - -#ifndef LIBANGLE_RENDERER_D3D_BUFFERD3D_H_ -#define LIBANGLE_RENDERER_D3D_BUFFERD3D_H_ - -#include "libANGLE/angletypes.h" -#include "libANGLE/renderer/BufferImpl.h" - -#include <stdint.h> -#include <vector> - -namespace gl -{ -struct VertexAttribute; -class VertexBinding; -} - -namespace rx -{ -class BufferFactoryD3D; -class StaticIndexBufferInterface; -class StaticVertexBufferInterface; - -enum class D3DBufferUsage -{ - STATIC, - DYNAMIC, -}; - -class BufferD3D : public BufferImpl -{ - public: - BufferD3D(const gl::BufferState &state, BufferFactoryD3D *factory); - ~BufferD3D() override; - - unsigned int getSerial() const { return mSerial; } - - virtual size_t getSize() const = 0; - virtual bool supportsDirectBinding() const = 0; - virtual gl::Error markTransformFeedbackUsage(const gl::Context *context) = 0; - virtual gl::Error getData(const gl::Context *context, const uint8_t **outData) = 0; - - // Warning: you should ensure binding really matches attrib.bindingIndex before using this - // function. - StaticVertexBufferInterface *getStaticVertexBuffer(const gl::VertexAttribute &attribute, - const gl::VertexBinding &binding); - StaticIndexBufferInterface *getStaticIndexBuffer(); - - virtual void initializeStaticData(const gl::Context *context); - virtual void invalidateStaticData(const gl::Context *context); - - void promoteStaticUsage(const gl::Context *context, int dataSize); - - gl::Error getIndexRange(const gl::Context *context, - GLenum type, - size_t offset, - size_t count, - bool primitiveRestartEnabled, - gl::IndexRange *outRange) override; - - BufferFactoryD3D *getFactory() const { return mFactory; } - D3DBufferUsage getUsage() const { return mUsage; } - - protected: - void updateSerial(); - void updateD3DBufferUsage(const gl::Context *context, gl::BufferUsage usage); - void emptyStaticBufferCache(); - - BufferFactoryD3D *mFactory; - unsigned int mSerial; - static unsigned int mNextSerial; - - std::vector<std::unique_ptr<StaticVertexBufferInterface>> mStaticVertexBuffers; - StaticIndexBufferInterface *mStaticIndexBuffer; - unsigned int mStaticBufferCacheTotalSize; - unsigned int mStaticVertexBufferOutOfDate; - unsigned int mUnmodifiedDataUse; - D3DBufferUsage mUsage; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_BUFFERD3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.cpp deleted file mode 100644 index 8ceeec3c39..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright 2015 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. -// -// CompilerD3D: -// Implementation of the D3D compiler methods. -// - -#include "libANGLE/renderer/d3d/CompilerD3D.h" - -namespace rx -{ - -CompilerD3D::CompilerD3D(ShShaderOutput translatorOutputType) - : mTranslatorOutputType(translatorOutputType) -{ -} - -gl::Error CompilerD3D::release() -{ - return gl::NoError(); -} - -ShShaderOutput CompilerD3D::getTranslatorOutputType() const -{ - return mTranslatorOutputType; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.h deleted file mode 100644 index bcfe810d04..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// Copyright (c) 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. -// - -// CompilerD3D.h: Defines the rx::CompilerD3D class, an implementation of rx::CompilerImpl. - -#ifndef LIBANGLE_RENDERER_COMPILERD3D_H_ -#define LIBANGLE_RENDERER_COMPILERD3D_H_ - -#include "libANGLE/renderer/CompilerImpl.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" - -namespace rx -{ - -class CompilerD3D : public CompilerImpl -{ - public: - CompilerD3D(ShShaderOutput translatorOutputType); - ~CompilerD3D() override {} - - gl::Error release() override; - ShShaderOutput getTranslatorOutputType() const override; - - private: - ShShaderOutput mTranslatorOutputType; -}; - -} - -#endif // LIBANGLE_RENDERER_COMPILERD3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp deleted file mode 100644 index 5a06b15279..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp +++ /dev/null @@ -1,105 +0,0 @@ -// -// Copyright (c) 2015 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. -// - -// DeviceD3D.cpp: D3D implementation of egl::Device - -#include "libANGLE/renderer/d3d/DeviceD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" - -#include "libANGLE/Device.h" -#include "libANGLE/Display.h" - -#include <EGL/eglext.h> - -namespace rx -{ - -DeviceD3D::DeviceD3D() - : mDevice(0), mDeviceType(0), mDeviceExternallySourced(false), mIsInitialized(false) -{ -} - -DeviceD3D::~DeviceD3D() -{ -#if defined(ANGLE_ENABLE_D3D11) - if (mDeviceType == EGL_D3D11_DEVICE_ANGLE) - { - // DeviceD3D holds a ref to an externally-sourced D3D11 device. We must release it. - ID3D11Device *device = reinterpret_cast<ID3D11Device *>(mDevice); - device->Release(); - } -#endif -} - -egl::Error DeviceD3D::getDevice(void **outValue) -{ - if (!mIsInitialized) - { - *outValue = nullptr; - return egl::EglBadDevice(); - } - - *outValue = mDevice; - return egl::NoError(); -} - -egl::Error DeviceD3D::initialize(void *device, - EGLint deviceType, - EGLBoolean deviceExternallySourced) -{ - ASSERT(!mIsInitialized); - if (mIsInitialized) - { - return egl::EglBadDevice(); - } - -#if defined(ANGLE_ENABLE_D3D11) - if (deviceType == EGL_D3D11_DEVICE_ANGLE) - { - // Validate the device - IUnknown *iunknown = reinterpret_cast<IUnknown *>(device); - - ID3D11Device *d3dDevice = nullptr; - HRESULT hr = - iunknown->QueryInterface(__uuidof(ID3D11Device), reinterpret_cast<void **>(&d3dDevice)); - if (FAILED(hr)) - { - return egl::EglBadAttribute() << "Invalid D3D device passed into EGLDeviceEXT"; - } - - // The QI to ID3D11Device adds a ref to the D3D11 device. - // Deliberately don't release the ref here, so that the DeviceD3D holds a ref to the - // D3D11 device. - } - else -#endif - { - ASSERT(deviceExternallySourced == EGL_FALSE); - } - - mDevice = device; - mDeviceType = deviceType; - mDeviceExternallySourced = !!deviceExternallySourced; - mIsInitialized = true; - - return egl::NoError(); -} - -EGLint DeviceD3D::getType() -{ - return mDeviceType; -} - -void DeviceD3D::generateExtensions(egl::DeviceExtensions *outExtensions) const -{ - outExtensions->deviceD3D = true; -} - -bool DeviceD3D::deviceExternallySourced() -{ - return mDeviceExternallySourced; -} -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.h deleted file mode 100644 index 15eaf9210a..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// Copyright (c) 2015 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. -// - -// DeviceD3D.h: D3D implementation of egl::Device - -#ifndef LIBANGLE_RENDERER_D3D_DEVICED3D_H_ -#define LIBANGLE_RENDERER_D3D_DEVICED3D_H_ - -#include "libANGLE/Device.h" -#include "libANGLE/renderer/DeviceImpl.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" - -namespace rx -{ -class DeviceD3D : public DeviceImpl -{ - public: - DeviceD3D(); - ~DeviceD3D() override; - - egl::Error initialize(void *device, EGLint deviceType, EGLBoolean external); - egl::Error getDevice(void **outValue) override; - EGLint getType() override; - void generateExtensions(egl::DeviceExtensions *outExtensions) const override; - bool deviceExternallySourced() override; - - private: - void *mDevice; - EGLint mDeviceType; - bool mDeviceExternallySourced; - bool mIsInitialized; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_DEVICED3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp deleted file mode 100644 index 0edda9c584..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp +++ /dev/null @@ -1,361 +0,0 @@ -// -// Copyright (c) 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. -// - -// DisplayD3D.cpp: D3D implementation of egl::Display - -#include "libANGLE/renderer/d3d/DisplayD3D.h" - -#include <EGL/eglext.h> - -#include "libANGLE/Config.h" -#include "libANGLE/Context.h" -#include "libANGLE/Display.h" -#include "libANGLE/Surface.h" -#include "libANGLE/Thread.h" -#include "libANGLE/histogram_macros.h" -#include "libANGLE/renderer/d3d/DeviceD3D.h" -#include "libANGLE/renderer/d3d/EGLImageD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/SurfaceD3D.h" -#include "libANGLE/renderer/d3d/SwapChainD3D.h" - -#if defined (ANGLE_ENABLE_D3D9) -# include "libANGLE/renderer/d3d/d3d9/Renderer9.h" -#endif // ANGLE_ENABLE_D3D9 - -#if defined (ANGLE_ENABLE_D3D11) -# include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#endif // ANGLE_ENABLE_D3D11 - -#if !defined(ANGLE_DEFAULT_D3D11) -// Enables use of the Direct3D 11 API for a default display, when available -# define ANGLE_DEFAULT_D3D11 1 -#endif - -namespace rx -{ - -typedef RendererD3D *(*CreateRendererD3DFunction)(egl::Display*); - -template <typename RendererType> -static RendererD3D *CreateTypedRendererD3D(egl::Display *display) -{ - return new RendererType(display); -} - -egl::Error CreateRendererD3D(egl::Display *display, RendererD3D **outRenderer) -{ - ASSERT(outRenderer != nullptr); - - std::vector<CreateRendererD3DFunction> rendererCreationFunctions; - - if (display->getPlatform() == EGL_PLATFORM_ANGLE_ANGLE) - { - const auto &attribMap = display->getAttributeMap(); - EGLNativeDisplayType nativeDisplay = display->getNativeDisplayId(); - - EGLint requestedDisplayType = static_cast<EGLint>( - attribMap.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)); - -# if defined(ANGLE_ENABLE_D3D11) - if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE || - nativeDisplay == EGL_D3D11_ONLY_DISPLAY_ANGLE || - requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) - { - rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer11>); - } -# endif - -# if defined(ANGLE_ENABLE_D3D9) - if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE || - requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE) - { - rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer9>); - } -# endif - - if (nativeDisplay != EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE && - nativeDisplay != EGL_D3D11_ONLY_DISPLAY_ANGLE && - requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE) - { - // The default display is requested, try the D3D9 and D3D11 renderers, order them using - // the definition of ANGLE_DEFAULT_D3D11 -# if ANGLE_DEFAULT_D3D11 -# if defined(ANGLE_ENABLE_D3D11) - rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer11>); -# endif -# if defined(ANGLE_ENABLE_D3D9) - rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer9>); -# endif -# else -# if defined(ANGLE_ENABLE_D3D9) - rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer9>); -# endif -# if defined(ANGLE_ENABLE_D3D11) - rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer11>); -# endif -# endif - } - } - else if (display->getPlatform() == EGL_PLATFORM_DEVICE_EXT) - { -#if defined(ANGLE_ENABLE_D3D11) - if (display->getDevice()->getType() == EGL_D3D11_DEVICE_ANGLE) - { - rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer11>); - } -#endif - } - else - { - UNIMPLEMENTED(); - } - - for (size_t i = 0; i < rendererCreationFunctions.size(); i++) - { - RendererD3D *renderer = rendererCreationFunctions[i](display); - egl::Error result = renderer->initialize(); - -# if defined(ANGLE_ENABLE_D3D11) - if (renderer->getRendererClass() == RENDERER_D3D11) - { - ASSERT(result.getID() >= 0 && result.getID() < NUM_D3D11_INIT_ERRORS); - ANGLE_HISTOGRAM_ENUMERATION("GPU.ANGLE.D3D11InitializeResult", - result.getID(), - NUM_D3D11_INIT_ERRORS); - } -# endif - -# if defined(ANGLE_ENABLE_D3D9) - if (renderer->getRendererClass() == RENDERER_D3D9) - { - ASSERT(result.getID() >= 0 && result.getID() < NUM_D3D9_INIT_ERRORS); - ANGLE_HISTOGRAM_ENUMERATION("GPU.ANGLE.D3D9InitializeResult", - result.getID(), - NUM_D3D9_INIT_ERRORS); - } -# endif - - if (!result.isError()) - { - *outRenderer = renderer; - return result; - } - - // Failed to create the renderer, try the next - SafeDelete(renderer); - } - - return egl::EglNotInitialized() << "No available renderers."; -} - -DisplayD3D::DisplayD3D(const egl::DisplayState &state) : DisplayImpl(state), mRenderer(nullptr) -{ -} - -SurfaceImpl *DisplayD3D::createWindowSurface(const egl::SurfaceState &state, - EGLNativeWindowType window, - const egl::AttributeMap &attribs) -{ - ASSERT(mRenderer != nullptr); - return new WindowSurfaceD3D(state, mRenderer, mDisplay, window, attribs); -} - -SurfaceImpl *DisplayD3D::createPbufferSurface(const egl::SurfaceState &state, - const egl::AttributeMap &attribs) -{ - ASSERT(mRenderer != nullptr); - return new PbufferSurfaceD3D(state, mRenderer, mDisplay, 0, nullptr, attribs); -} - -SurfaceImpl *DisplayD3D::createPbufferFromClientBuffer(const egl::SurfaceState &state, - EGLenum buftype, - EGLClientBuffer clientBuffer, - const egl::AttributeMap &attribs) -{ - ASSERT(mRenderer != nullptr); - return new PbufferSurfaceD3D(state, mRenderer, mDisplay, buftype, clientBuffer, attribs); -} - -SurfaceImpl *DisplayD3D::createPixmapSurface(const egl::SurfaceState &state, - NativePixmapType nativePixmap, - const egl::AttributeMap &attribs) -{ - UNIMPLEMENTED(); - return nullptr; -} - -ImageImpl *DisplayD3D::createImage(const egl::ImageState &state, - EGLenum target, - const egl::AttributeMap &attribs) -{ - return new EGLImageD3D(state, target, attribs, mRenderer); -} - -egl::Error DisplayD3D::getDevice(DeviceImpl **device) -{ - return mRenderer->getEGLDevice(device); -} - -ContextImpl *DisplayD3D::createContext(const gl::ContextState &state) -{ - ASSERT(mRenderer != nullptr); - return mRenderer->createContext(state); -} - -StreamProducerImpl *DisplayD3D::createStreamProducerD3DTextureNV12( - egl::Stream::ConsumerType consumerType, - const egl::AttributeMap &attribs) -{ - ASSERT(mRenderer != nullptr); - return mRenderer->createStreamProducerD3DTextureNV12(consumerType, attribs); -} - -egl::Error DisplayD3D::makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context) -{ - return egl::NoError(); -} - -egl::Error DisplayD3D::initialize(egl::Display *display) -{ - ASSERT(mRenderer == nullptr && display != nullptr); - mDisplay = display; - ANGLE_TRY(CreateRendererD3D(display, &mRenderer)); - return egl::NoError(); -} - -void DisplayD3D::terminate() -{ - SafeDelete(mRenderer); -} - -egl::ConfigSet DisplayD3D::generateConfigs() -{ - ASSERT(mRenderer != nullptr); - return mRenderer->generateConfigs(); -} - -bool DisplayD3D::testDeviceLost() -{ - ASSERT(mRenderer != nullptr); - return mRenderer->testDeviceLost(); -} - -egl::Error DisplayD3D::restoreLostDevice(const egl::Display *display) -{ - // Release surface resources to make the Reset() succeed - for (egl::Surface *surface : mState.surfaceSet) - { - if (surface->getBoundTexture()) - { - ANGLE_TRY(surface->releaseTexImage(display->getProxyContext(), EGL_BACK_BUFFER)); - } - SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface); - surfaceD3D->releaseSwapChain(); - } - - if (!mRenderer->resetDevice()) - { - return egl::EglBadAlloc(); - } - - // Restore any surfaces that may have been lost - for (const egl::Surface *surface : mState.surfaceSet) - { - SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface); - - ANGLE_TRY(surfaceD3D->resetSwapChain(display)); - } - - return egl::NoError(); -} - -bool DisplayD3D::isValidNativeWindow(EGLNativeWindowType window) const -{ - return mRenderer->isValidNativeWindow(window); -} - -egl::Error DisplayD3D::validateClientBuffer(const egl::Config *configuration, - EGLenum buftype, - EGLClientBuffer clientBuffer, - const egl::AttributeMap &attribs) const -{ - switch (buftype) - { - case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE: - return mRenderer->validateShareHandle(configuration, static_cast<HANDLE>(clientBuffer), - attribs); - - case EGL_D3D_TEXTURE_ANGLE: - return mRenderer->getD3DTextureInfo( - configuration, static_cast<IUnknown *>(clientBuffer), nullptr, nullptr, nullptr); - - default: - return DisplayImpl::validateClientBuffer(configuration, buftype, clientBuffer, attribs); - } -} - -void DisplayD3D::generateExtensions(egl::DisplayExtensions *outExtensions) const -{ - mRenderer->generateDisplayExtensions(outExtensions); -} - -std::string DisplayD3D::getVendorString() const -{ - std::string vendorString = "Google Inc."; - if (mRenderer) - { - vendorString += " " + mRenderer->getVendorString(); - } - - return vendorString; -} - -void DisplayD3D::generateCaps(egl::Caps *outCaps) const -{ - // Display must be initialized to generate caps - ASSERT(mRenderer != nullptr); - - outCaps->textureNPOT = mRenderer->getNativeExtensions().textureNPOT; -} - -egl::Error DisplayD3D::waitClient(const gl::Context *context) const -{ - for (egl::Surface *surface : mState.surfaceSet) - { - SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface); - ANGLE_TRY(surfaceD3D->checkForOutOfDateSwapChain(context)); - } - - return egl::NoError(); -} - -egl::Error DisplayD3D::waitNative(const gl::Context *context, EGLint engine) const -{ - egl::Surface *drawSurface = context->getCurrentDrawSurface(); - egl::Surface *readSurface = context->getCurrentReadSurface(); - - if (drawSurface != nullptr) - { - SurfaceD3D *drawSurfaceD3D = GetImplAs<SurfaceD3D>(drawSurface); - ANGLE_TRY(drawSurfaceD3D->checkForOutOfDateSwapChain(context)); - } - - if (readSurface != nullptr) - { - SurfaceD3D *readSurfaceD3D = GetImplAs<SurfaceD3D>(readSurface); - ANGLE_TRY(readSurfaceD3D->checkForOutOfDateSwapChain(context)); - } - - return egl::NoError(); -} - -gl::Version DisplayD3D::getMaxSupportedESVersion() const -{ - return mRenderer->getMaxSupportedESVersion(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.h deleted file mode 100644 index 7090522312..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.h +++ /dev/null @@ -1,83 +0,0 @@ -// -// Copyright (c) 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. -// - -// DisplayD3D.h: D3D implementation of egl::Display - -#ifndef LIBANGLE_RENDERER_D3D_DISPLAYD3D_H_ -#define LIBANGLE_RENDERER_D3D_DISPLAYD3D_H_ - -#include "libANGLE/renderer/DisplayImpl.h" -#include "libANGLE/Device.h" - -namespace rx -{ -class RendererD3D; - -class DisplayD3D : public DisplayImpl -{ - public: - DisplayD3D(const egl::DisplayState &state); - - egl::Error initialize(egl::Display *display) override; - void terminate() override; - - // Surface creation - SurfaceImpl *createWindowSurface(const egl::SurfaceState &state, - EGLNativeWindowType window, - const egl::AttributeMap &attribs) override; - SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state, - const egl::AttributeMap &attribs) override; - SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state, - EGLenum buftype, - EGLClientBuffer clientBuffer, - const egl::AttributeMap &attribs) override; - SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state, - NativePixmapType nativePixmap, - const egl::AttributeMap &attribs) override; - - ImageImpl *createImage(const egl::ImageState &state, - EGLenum target, - const egl::AttributeMap &attribs) override; - - ContextImpl *createContext(const gl::ContextState &state) override; - - StreamProducerImpl *createStreamProducerD3DTextureNV12( - egl::Stream::ConsumerType consumerType, - const egl::AttributeMap &attribs) override; - - egl::Error makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context) override; - - egl::ConfigSet generateConfigs() override; - - bool testDeviceLost() override; - egl::Error restoreLostDevice(const egl::Display *display) override; - - bool isValidNativeWindow(EGLNativeWindowType window) const override; - egl::Error validateClientBuffer(const egl::Config *configuration, - EGLenum buftype, - EGLClientBuffer clientBuffer, - const egl::AttributeMap &attribs) const override; - - egl::Error getDevice(DeviceImpl **device) override; - - std::string getVendorString() const override; - - egl::Error waitClient(const gl::Context *context) const override; - egl::Error waitNative(const gl::Context *context, EGLint engine) const override; - gl::Version getMaxSupportedESVersion() const override; - - private: - void generateExtensions(egl::DisplayExtensions *outExtensions) const override; - void generateCaps(egl::Caps *outCaps) const override; - - egl::Display *mDisplay; - - rx::RendererD3D *mRenderer; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_DISPLAYD3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp deleted file mode 100644 index b4143a3f5f..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp +++ /dev/null @@ -1,1427 +0,0 @@ -// -// Copyright (c) 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. -// -// DynamicHLSL.cpp: Implementation for link and run-time HLSL generation -// - -#include "libANGLE/renderer/d3d/DynamicHLSL.h" - -#include "common/string_utils.h" -#include "common/utilities.h" -#include "compiler/translator/blocklayoutHLSL.h" -#include "libANGLE/Context.h" -#include "libANGLE/Program.h" -#include "libANGLE/Shader.h" -#include "libANGLE/VaryingPacking.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/ProgramD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/ShaderD3D.h" - -using namespace gl; - -namespace rx -{ - -namespace -{ - -// This class needs to match OutputHLSL::decorate -class DecorateVariable final : angle::NonCopyable -{ - public: - explicit DecorateVariable(const std::string &str) : mName(str) {} - const std::string &getName() const { return mName; } - - private: - const std::string &mName; -}; - -std::ostream &operator<<(std::ostream &o, const DecorateVariable &dv) -{ - if (dv.getName().compare(0, 3, "gl_") != 0) - { - o << "_"; - } - o << dv.getName(); - return o; -} - -const char *HLSLComponentTypeString(GLenum componentType) -{ - switch (componentType) - { - case GL_UNSIGNED_INT: - return "uint"; - case GL_INT: - return "int"; - case GL_UNSIGNED_NORMALIZED: - case GL_SIGNED_NORMALIZED: - case GL_FLOAT: - return "float"; - default: - UNREACHABLE(); - return "not-component-type"; - } -} - -void HLSLComponentTypeString(std::ostringstream &ostream, GLenum componentType, int componentCount) -{ - ostream << HLSLComponentTypeString(componentType); - if (componentCount > 1) - { - ostream << componentCount; - } -} - -const char *HLSLMatrixTypeString(GLenum type) -{ - switch (type) - { - case GL_FLOAT_MAT2: - return "float2x2"; - case GL_FLOAT_MAT3: - return "float3x3"; - case GL_FLOAT_MAT4: - return "float4x4"; - case GL_FLOAT_MAT2x3: - return "float2x3"; - case GL_FLOAT_MAT3x2: - return "float3x2"; - case GL_FLOAT_MAT2x4: - return "float2x4"; - case GL_FLOAT_MAT4x2: - return "float4x2"; - case GL_FLOAT_MAT3x4: - return "float3x4"; - case GL_FLOAT_MAT4x3: - return "float4x3"; - default: - UNREACHABLE(); - return "not-matrix-type"; - } -} - -void HLSLTypeString(std::ostringstream &ostream, GLenum type) -{ - if (gl::IsMatrixType(type)) - { - ostream << HLSLMatrixTypeString(type); - return; - } - - HLSLComponentTypeString(ostream, gl::VariableComponentType(type), - gl::VariableComponentCount(type)); -} - -const PixelShaderOutputVariable *FindOutputAtLocation( - const std::vector<PixelShaderOutputVariable> &outputVariables, - unsigned int location) -{ - for (size_t variableIndex = 0; variableIndex < outputVariables.size(); ++variableIndex) - { - if (outputVariables[variableIndex].outputIndex == location) - { - return &outputVariables[variableIndex]; - } - } - - return nullptr; -} - -void WriteArrayString(std::ostringstream &strstr, unsigned int i) -{ - static_assert(GL_INVALID_INDEX == UINT_MAX, - "GL_INVALID_INDEX must be equal to the max unsigned int."); - if (i == UINT_MAX) - { - return; - } - - strstr << "["; - strstr << i; - strstr << "]"; -} - -constexpr const char *VERTEX_ATTRIBUTE_STUB_STRING = "@@ VERTEX ATTRIBUTES @@"; -constexpr const char *PIXEL_OUTPUT_STUB_STRING = "@@ PIXEL OUTPUT @@"; -} // anonymous namespace - -// BuiltinInfo implementation - -BuiltinInfo::BuiltinInfo() = default; -BuiltinInfo::~BuiltinInfo() = default; - -// DynamicHLSL implementation - -DynamicHLSL::DynamicHLSL(RendererD3D *const renderer) : mRenderer(renderer) -{ -} - -std::string DynamicHLSL::generateVertexShaderForInputLayout( - const std::string &sourceShader, - const InputLayout &inputLayout, - const std::vector<sh::Attribute> &shaderAttributes) const -{ - std::ostringstream structStream; - std::ostringstream initStream; - - structStream << "struct VS_INPUT\n" - << "{\n"; - - int semanticIndex = 0; - unsigned int inputIndex = 0; - - // If gl_PointSize is used in the shader then pointsprites rendering is expected. - // If the renderer does not support Geometry shaders then Instanced PointSprite emulation - // must be used. - bool usesPointSize = sourceShader.find("GL_USES_POINT_SIZE") != std::string::npos; - bool useInstancedPointSpriteEmulation = - usesPointSize && mRenderer->getWorkarounds().useInstancedPointSpriteEmulation; - - // Instanced PointSprite emulation requires additional entries in the - // VS_INPUT structure to support the vertices that make up the quad vertices. - // These values must be in sync with the cooresponding values added during inputlayout creation - // in InputLayoutCache::applyVertexBuffers(). - // - // The additional entries must appear first in the VS_INPUT layout because - // Windows Phone 8 era devices require per vertex data to physically come - // before per instance data in the shader. - if (useInstancedPointSpriteEmulation) - { - structStream << " float3 spriteVertexPos : SPRITEPOSITION0;\n" - << " float2 spriteTexCoord : SPRITETEXCOORD0;\n"; - } - - for (size_t attributeIndex = 0; attributeIndex < shaderAttributes.size(); ++attributeIndex) - { - const sh::Attribute &shaderAttribute = shaderAttributes[attributeIndex]; - if (!shaderAttribute.name.empty()) - { - ASSERT(inputIndex < MAX_VERTEX_ATTRIBS); - VertexFormatType vertexFormatType = - inputIndex < inputLayout.size() ? inputLayout[inputIndex] : VERTEX_FORMAT_INVALID; - - // HLSL code for input structure - if (IsMatrixType(shaderAttribute.type)) - { - // Matrix types are always transposed - structStream << " " - << HLSLMatrixTypeString(TransposeMatrixType(shaderAttribute.type)); - } - else - { - GLenum componentType = mRenderer->getVertexComponentType(vertexFormatType); - - if (shaderAttribute.name == "gl_InstanceID" || - shaderAttribute.name == "gl_VertexID") - { - // The input types of the instance ID and vertex ID in HLSL (uint) differs from - // the ones in ESSL (int). - structStream << " uint"; - } - else - { - structStream << " "; - HLSLComponentTypeString(structStream, componentType, - VariableComponentCount(shaderAttribute.type)); - } - } - - structStream << " " << DecorateVariable(shaderAttribute.name) << " : "; - - if (shaderAttribute.name == "gl_InstanceID") - { - structStream << "SV_InstanceID"; - } - else if (shaderAttribute.name == "gl_VertexID") - { - structStream << "SV_VertexID"; - } - else - { - structStream << "TEXCOORD" << semanticIndex; - semanticIndex += VariableRegisterCount(shaderAttribute.type); - } - - structStream << ";\n"; - - // HLSL code for initialization - initStream << " " << DecorateVariable(shaderAttribute.name) << " = "; - - // Mismatched vertex attribute to vertex input may result in an undefined - // data reinterpretation (eg for pure integer->float, float->pure integer) - // TODO: issue warning with gl debug info extension, when supported - if (IsMatrixType(shaderAttribute.type) || - (mRenderer->getVertexConversionType(vertexFormatType) & VERTEX_CONVERT_GPU) != 0) - { - GenerateAttributeConversionHLSL(vertexFormatType, shaderAttribute, initStream); - } - else - { - initStream << "input." << DecorateVariable(shaderAttribute.name); - } - - initStream << ";\n"; - - inputIndex += VariableRowCount(TransposeMatrixType(shaderAttribute.type)); - } - } - - structStream << "};\n" - "\n" - "void initAttributes(VS_INPUT input)\n" - "{\n" - << initStream.str() << "}\n"; - - std::string vertexHLSL(sourceShader); - - bool success = - angle::ReplaceSubstring(&vertexHLSL, VERTEX_ATTRIBUTE_STUB_STRING, structStream.str()); - ASSERT(success); - - return vertexHLSL; -} - -std::string DynamicHLSL::generatePixelShaderForOutputSignature( - const std::string &sourceShader, - const std::vector<PixelShaderOutputVariable> &outputVariables, - bool usesFragDepth, - const std::vector<GLenum> &outputLayout) const -{ - const int shaderModel = mRenderer->getMajorShaderModel(); - std::string targetSemantic = (shaderModel >= 4) ? "SV_TARGET" : "COLOR"; - std::string depthSemantic = (shaderModel >= 4) ? "SV_Depth" : "DEPTH"; - - std::ostringstream declarationStream; - std::ostringstream copyStream; - - declarationStream << "struct PS_OUTPUT\n" - "{\n"; - - size_t numOutputs = outputLayout.size(); - - // Workaround for HLSL 3.x: We can't do a depth/stencil only render, the runtime will complain. - if (numOutputs == 0 && (shaderModel == 3 || !mRenderer->getShaderModelSuffix().empty())) - { - numOutputs = 1u; - } - const PixelShaderOutputVariable defaultOutput(GL_FLOAT_VEC4, "dummy", "float4(0, 0, 0, 1)", 0); - - for (size_t layoutIndex = 0; layoutIndex < numOutputs; ++layoutIndex) - { - GLenum binding = outputLayout.empty() ? GL_COLOR_ATTACHMENT0 : outputLayout[layoutIndex]; - - if (binding != GL_NONE) - { - unsigned int location = (binding - GL_COLOR_ATTACHMENT0); - - const PixelShaderOutputVariable *outputVariable = - outputLayout.empty() ? &defaultOutput - : FindOutputAtLocation(outputVariables, location); - - // OpenGL ES 3.0 spec $4.2.1 - // If [...] not all user-defined output variables are written, the values of fragment - // colors - // corresponding to unwritten variables are similarly undefined. - if (outputVariable) - { - declarationStream << " "; - HLSLTypeString(declarationStream, outputVariable->type); - declarationStream << " " << outputVariable->name << " : " << targetSemantic - << static_cast<int>(layoutIndex) << ";\n"; - - copyStream << " output." << outputVariable->name << " = " - << outputVariable->source << ";\n"; - } - } - } - - if (usesFragDepth) - { - declarationStream << " float gl_Depth : " << depthSemantic << ";\n"; - copyStream << " output.gl_Depth = gl_Depth; \n"; - } - - declarationStream << "};\n" - "\n" - "PS_OUTPUT generateOutput()\n" - "{\n" - " PS_OUTPUT output;\n" - << copyStream.str() << " return output;\n" - "}\n"; - - std::string pixelHLSL(sourceShader); - - bool success = - angle::ReplaceSubstring(&pixelHLSL, PIXEL_OUTPUT_STUB_STRING, declarationStream.str()); - ASSERT(success); - - return pixelHLSL; -} - -void DynamicHLSL::generateVaryingLinkHLSL(const VaryingPacking &varyingPacking, - const BuiltinInfo &builtins, - bool programUsesPointSize, - std::ostringstream &hlslStream) const -{ - ASSERT(builtins.dxPosition.enabled); - hlslStream << "{\n" - << " float4 dx_Position : " << builtins.dxPosition.str() << ";\n"; - - if (builtins.glPosition.enabled) - { - hlslStream << " float4 gl_Position : " << builtins.glPosition.str() << ";\n"; - } - - if (builtins.glFragCoord.enabled) - { - hlslStream << " float4 gl_FragCoord : " << builtins.glFragCoord.str() << ";\n"; - } - - if (builtins.glPointCoord.enabled) - { - hlslStream << " float2 gl_PointCoord : " << builtins.glPointCoord.str() << ";\n"; - } - - if (builtins.glPointSize.enabled) - { - hlslStream << " float gl_PointSize : " << builtins.glPointSize.str() << ";\n"; - } - - if (builtins.glViewIDOVR.enabled) - { - hlslStream << " nointerpolation uint gl_ViewID_OVR : " << builtins.glViewIDOVR.str() - << ";\n"; - } - - if (builtins.glViewportIndex.enabled) - { - hlslStream << " nointerpolation uint gl_ViewportIndex : " - << builtins.glViewportIndex.str() << ";\n"; - } - - if (builtins.glLayer.enabled) - { - hlslStream << " nointerpolation uint gl_Layer : " << builtins.glLayer.str() << ";\n"; - } - - std::string varyingSemantic = - GetVaryingSemantic(mRenderer->getMajorShaderModel(), programUsesPointSize); - - for (const PackedVaryingRegister ®isterInfo : varyingPacking.getRegisterList()) - { - const auto &varying = *registerInfo.packedVarying->varying; - ASSERT(!varying.isStruct()); - - // TODO: Add checks to ensure D3D interpolation modifiers don't result in too many - // registers being used. - // For example, if there are N registers, and we have N vec3 varyings and 1 float - // varying, then D3D will pack them into N registers. - // If the float varying has the 'nointerpolation' modifier on it then we would need - // N + 1 registers, and D3D compilation will fail. - - switch (registerInfo.packedVarying->interpolation) - { - case sh::INTERPOLATION_SMOOTH: - hlslStream << " "; - break; - case sh::INTERPOLATION_FLAT: - hlslStream << " nointerpolation "; - break; - case sh::INTERPOLATION_CENTROID: - hlslStream << " centroid "; - break; - default: - UNREACHABLE(); - } - - GLenum transposedType = gl::TransposeMatrixType(varying.type); - GLenum componentType = gl::VariableComponentType(transposedType); - int columnCount = gl::VariableColumnCount(transposedType); - HLSLComponentTypeString(hlslStream, componentType, columnCount); - unsigned int semanticIndex = registerInfo.semanticIndex; - hlslStream << " v" << semanticIndex << " : " << varyingSemantic << semanticIndex << ";\n"; - } - - hlslStream << "};\n"; -} - -void DynamicHLSL::generateShaderLinkHLSL(const gl::Context *context, - const gl::ProgramState &programData, - const ProgramD3DMetadata &programMetadata, - const VaryingPacking &varyingPacking, - const BuiltinVaryingsD3D &builtinsD3D, - std::string *pixelHLSL, - std::string *vertexHLSL) const -{ - ASSERT(pixelHLSL->empty() && vertexHLSL->empty()); - - const auto &data = context->getContextState(); - gl::Shader *vertexShaderGL = programData.getAttachedVertexShader(); - gl::Shader *fragmentShaderGL = programData.getAttachedFragmentShader(); - const ShaderD3D *fragmentShader = GetImplAs<ShaderD3D>(fragmentShaderGL); - const int shaderModel = mRenderer->getMajorShaderModel(); - - // usesViewScale() isn't supported in the D3D9 renderer - ASSERT(shaderModel >= 4 || !programMetadata.usesViewScale()); - - bool useInstancedPointSpriteEmulation = - programMetadata.usesPointSize() && - mRenderer->getWorkarounds().useInstancedPointSpriteEmulation; - - // Validation done in the compiler - ASSERT(!fragmentShader->usesFragColor() || !fragmentShader->usesFragData()); - - std::ostringstream vertexStream; - vertexStream << vertexShaderGL->getTranslatedSource(context); - - // Instanced PointSprite emulation requires additional entries originally generated in the - // GeometryShader HLSL. These include pointsize clamp values. - if (useInstancedPointSpriteEmulation) - { - vertexStream << "static float minPointSize = " - << static_cast<int>(data.getCaps().minAliasedPointSize) << ".0f;\n" - << "static float maxPointSize = " - << static_cast<int>(data.getCaps().maxAliasedPointSize) << ".0f;\n"; - } - - // Add stub string to be replaced when shader is dynamically defined by its layout - vertexStream << "\n" << std::string(VERTEX_ATTRIBUTE_STUB_STRING) << "\n"; - - const auto &vertexBuiltins = builtinsD3D[gl::SHADER_VERTEX]; - - // Write the HLSL input/output declarations - vertexStream << "struct VS_OUTPUT\n"; - generateVaryingLinkHLSL(varyingPacking, vertexBuiltins, builtinsD3D.usesPointSize(), - vertexStream); - vertexStream << "\n" - << "VS_OUTPUT main(VS_INPUT input)\n" - << "{\n" - << " initAttributes(input);\n"; - - vertexStream << "\n" - << " gl_main();\n" - << "\n" - << " VS_OUTPUT output;\n"; - - if (vertexBuiltins.glPosition.enabled) - { - vertexStream << " output.gl_Position = gl_Position;\n"; - } - - if (vertexBuiltins.glViewIDOVR.enabled) - { - vertexStream << " output.gl_ViewID_OVR = _ViewID_OVR;\n"; - } - if (programMetadata.hasANGLEMultiviewEnabled() && programMetadata.canSelectViewInVertexShader()) - { - ASSERT(vertexBuiltins.glViewportIndex.enabled && vertexBuiltins.glLayer.enabled); - vertexStream << " if (multiviewSelectViewportIndex)\n" - << " {\n" - << " output.gl_ViewportIndex = _ViewID_OVR;\n" - << " } else {\n" - << " output.gl_ViewportIndex = 0;\n" - << " output.gl_Layer = _ViewID_OVR;\n" - << " }\n"; - } - - // On D3D9 or D3D11 Feature Level 9, we need to emulate large viewports using dx_ViewAdjust. - if (shaderModel >= 4 && mRenderer->getShaderModelSuffix() == "") - { - vertexStream << " output.dx_Position.x = gl_Position.x;\n"; - - if (programMetadata.usesViewScale()) - { - // This code assumes that dx_ViewScale.y = -1.0f when rendering to texture, and +1.0f - // when rendering to the default framebuffer. No other values are valid. - vertexStream << " output.dx_Position.y = dx_ViewScale.y * gl_Position.y;\n"; - } - else - { - vertexStream << " output.dx_Position.y = - gl_Position.y;\n"; - } - - vertexStream << " output.dx_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n" - << " output.dx_Position.w = gl_Position.w;\n"; - } - else - { - vertexStream << " output.dx_Position.x = gl_Position.x * dx_ViewAdjust.z + " - "dx_ViewAdjust.x * gl_Position.w;\n"; - - // If usesViewScale() is true and we're using the D3D11 renderer via Feature Level 9_*, - // then we need to multiply the gl_Position.y by the viewScale. - // usesViewScale() isn't supported when using the D3D9 renderer. - if (programMetadata.usesViewScale() && - (shaderModel >= 4 && mRenderer->getShaderModelSuffix() != "")) - { - vertexStream << " output.dx_Position.y = dx_ViewScale.y * (gl_Position.y * " - "dx_ViewAdjust.w + dx_ViewAdjust.y * gl_Position.w);\n"; - } - else - { - vertexStream << " output.dx_Position.y = -(gl_Position.y * dx_ViewAdjust.w + " - "dx_ViewAdjust.y * gl_Position.w);\n"; - } - - vertexStream << " output.dx_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n" - << " output.dx_Position.w = gl_Position.w;\n"; - } - - // We don't need to output gl_PointSize if we use are emulating point sprites via instancing. - if (vertexBuiltins.glPointSize.enabled) - { - vertexStream << " output.gl_PointSize = gl_PointSize;\n"; - } - - if (vertexBuiltins.glFragCoord.enabled) - { - vertexStream << " output.gl_FragCoord = gl_Position;\n"; - } - - for (const PackedVaryingRegister ®isterInfo : varyingPacking.getRegisterList()) - { - const auto &packedVarying = *registerInfo.packedVarying; - const auto &varying = *packedVarying.varying; - ASSERT(!varying.isStruct()); - - vertexStream << " output.v" << registerInfo.semanticIndex << " = "; - - if (packedVarying.isStructField()) - { - vertexStream << DecorateVariable(packedVarying.parentStructName) << "."; - } - - vertexStream << DecorateVariable(varying.name); - - if (varying.isArray()) - { - WriteArrayString(vertexStream, registerInfo.varyingArrayIndex); - } - - if (VariableRowCount(varying.type) > 1) - { - WriteArrayString(vertexStream, registerInfo.varyingRowIndex); - } - - vertexStream << ";\n"; - } - - // Instanced PointSprite emulation requires additional entries to calculate - // the final output vertex positions of the quad that represents each sprite. - if (useInstancedPointSpriteEmulation) - { - vertexStream << "\n" - << " gl_PointSize = clamp(gl_PointSize, minPointSize, maxPointSize);\n"; - - vertexStream << " output.dx_Position.x += (input.spriteVertexPos.x * gl_PointSize / " - "(dx_ViewCoords.x*2)) * output.dx_Position.w;"; - - if (programMetadata.usesViewScale()) - { - // Multiply by ViewScale to invert the rendering when appropriate - vertexStream << " output.dx_Position.y += (-dx_ViewScale.y * " - "input.spriteVertexPos.y * gl_PointSize / (dx_ViewCoords.y*2)) * " - "output.dx_Position.w;"; - } - else - { - vertexStream << " output.dx_Position.y += (input.spriteVertexPos.y * gl_PointSize / " - "(dx_ViewCoords.y*2)) * output.dx_Position.w;"; - } - - vertexStream - << " output.dx_Position.z += input.spriteVertexPos.z * output.dx_Position.w;\n"; - - if (programMetadata.usesPointCoord()) - { - vertexStream << "\n" - << " output.gl_PointCoord = input.spriteTexCoord;\n"; - } - } - - // Renderers that enable instanced pointsprite emulation require the vertex shader output member - // gl_PointCoord to be set to a default value if used without gl_PointSize. 0.5,0.5 is the same - // default value used in the generated pixel shader. - if (programMetadata.usesInsertedPointCoordValue()) - { - ASSERT(!useInstancedPointSpriteEmulation); - vertexStream << "\n" - << " output.gl_PointCoord = float2(0.5, 0.5);\n"; - } - - vertexStream << "\n" - << " return output;\n" - << "}\n"; - - const auto &pixelBuiltins = builtinsD3D[gl::SHADER_FRAGMENT]; - - std::ostringstream pixelStream; - pixelStream << fragmentShaderGL->getTranslatedSource(context); - pixelStream << "struct PS_INPUT\n"; - generateVaryingLinkHLSL(varyingPacking, pixelBuiltins, builtinsD3D.usesPointSize(), - pixelStream); - pixelStream << "\n"; - - pixelStream << std::string(PIXEL_OUTPUT_STUB_STRING) << "\n"; - - if (fragmentShader->usesFrontFacing()) - { - if (shaderModel >= 4) - { - pixelStream << "PS_OUTPUT main(PS_INPUT input, bool isFrontFace : SV_IsFrontFace)\n" - << "{\n"; - } - else - { - pixelStream << "PS_OUTPUT main(PS_INPUT input, float vFace : VFACE)\n" - << "{\n"; - } - } - else - { - pixelStream << "PS_OUTPUT main(PS_INPUT input)\n" - << "{\n"; - } - - if (fragmentShader->usesViewID()) - { - ASSERT(pixelBuiltins.glViewIDOVR.enabled); - pixelStream << " _ViewID_OVR = input.gl_ViewID_OVR;\n"; - } - - if (pixelBuiltins.glFragCoord.enabled) - { - pixelStream << " float rhw = 1.0 / input.gl_FragCoord.w;\n"; - - // Certain Shader Models (4_0+ and 3_0) allow reading from dx_Position in the pixel shader. - // Other Shader Models (4_0_level_9_3 and 2_x) don't support this, so we emulate it using - // dx_ViewCoords. - if (shaderModel >= 4 && mRenderer->getShaderModelSuffix() == "") - { - pixelStream << " gl_FragCoord.x = input.dx_Position.x;\n" - << " gl_FragCoord.y = input.dx_Position.y;\n"; - } - else if (shaderModel == 3) - { - pixelStream << " gl_FragCoord.x = input.dx_Position.x + 0.5;\n" - << " gl_FragCoord.y = input.dx_Position.y + 0.5;\n"; - } - else - { - // dx_ViewCoords contains the viewport width/2, height/2, center.x and center.y. See - // Renderer::setViewport() - pixelStream << " gl_FragCoord.x = (input.gl_FragCoord.x * rhw) * dx_ViewCoords.x + " - "dx_ViewCoords.z;\n" - << " gl_FragCoord.y = (input.gl_FragCoord.y * rhw) * dx_ViewCoords.y + " - "dx_ViewCoords.w;\n"; - } - - if (programMetadata.usesViewScale()) - { - // For Feature Level 9_3 and below, we need to correct gl_FragCoord.y to account - // for dx_ViewScale. On Feature Level 10_0+, gl_FragCoord.y is calculated above using - // dx_ViewCoords and is always correct irrespective of dx_ViewScale's value. - // NOTE: usesViewScale() can only be true on D3D11 (i.e. Shader Model 4.0+). - if (shaderModel >= 4 && mRenderer->getShaderModelSuffix() == "") - { - // Some assumptions: - // - dx_ViewScale.y = -1.0f when rendering to texture - // - dx_ViewScale.y = +1.0f when rendering to the default framebuffer - // - gl_FragCoord.y has been set correctly above. - // - // When rendering to the backbuffer, the code inverts gl_FragCoord's y coordinate. - // This involves subtracting the y coordinate from the height of the area being - // rendered to. - // - // First we calculate the height of the area being rendered to: - // render_area_height = (2.0f / (1.0f - input.gl_FragCoord.y * rhw)) * - // gl_FragCoord.y - // - // Note that when we're rendering to default FB, we want our output to be - // equivalent to: - // "gl_FragCoord.y = render_area_height - gl_FragCoord.y" - // - // When we're rendering to a texture, we want our output to be equivalent to: - // "gl_FragCoord.y = gl_FragCoord.y;" - // - // If we set scale_factor = ((1.0f + dx_ViewScale.y) / 2.0f), then notice that - // - When rendering to default FB: scale_factor = 1.0f - // - When rendering to texture: scale_factor = 0.0f - // - // Therefore, we can get our desired output by setting: - // "gl_FragCoord.y = scale_factor * render_area_height - dx_ViewScale.y * - // gl_FragCoord.y" - // - // Simplifying, this becomes: - pixelStream - << " gl_FragCoord.y = (1.0f + dx_ViewScale.y) * gl_FragCoord.y /" - "(1.0f - input.gl_FragCoord.y * rhw) - dx_ViewScale.y * gl_FragCoord.y;\n"; - } - } - - pixelStream << " gl_FragCoord.z = (input.gl_FragCoord.z * rhw) * dx_DepthFront.x + " - "dx_DepthFront.y;\n" - << " gl_FragCoord.w = rhw;\n"; - } - - if (pixelBuiltins.glPointCoord.enabled && shaderModel >= 3) - { - pixelStream << " gl_PointCoord.x = input.gl_PointCoord.x;\n" - << " gl_PointCoord.y = 1.0 - input.gl_PointCoord.y;\n"; - } - - if (fragmentShader->usesFrontFacing()) - { - if (shaderModel <= 3) - { - pixelStream << " gl_FrontFacing = (vFace * dx_DepthFront.z >= 0.0);\n"; - } - else - { - pixelStream << " gl_FrontFacing = isFrontFace;\n"; - } - } - - for (const PackedVaryingRegister ®isterInfo : varyingPacking.getRegisterList()) - { - const auto &packedVarying = *registerInfo.packedVarying; - const auto &varying = *packedVarying.varying; - ASSERT(!varying.isBuiltIn() && !varying.isStruct()); - - // Don't reference VS-only transform feedback varyings in the PS. Note that we're relying on - // that the staticUse flag is set according to usage in the fragment shader. - if (packedVarying.vertexOnly || !varying.staticUse) - continue; - - pixelStream << " "; - - if (packedVarying.isStructField()) - { - pixelStream << DecorateVariable(packedVarying.parentStructName) << "."; - } - - pixelStream << DecorateVariable(varying.name); - - if (varying.isArray()) - { - WriteArrayString(pixelStream, registerInfo.varyingArrayIndex); - } - - GLenum transposedType = TransposeMatrixType(varying.type); - if (VariableRowCount(transposedType) > 1) - { - WriteArrayString(pixelStream, registerInfo.varyingRowIndex); - } - - pixelStream << " = input.v" << registerInfo.semanticIndex; - - switch (VariableColumnCount(transposedType)) - { - case 1: - pixelStream << ".x"; - break; - case 2: - pixelStream << ".xy"; - break; - case 3: - pixelStream << ".xyz"; - break; - case 4: - break; - default: - UNREACHABLE(); - } - pixelStream << ";\n"; - } - - pixelStream << "\n" - << " gl_main();\n" - << "\n" - << " return generateOutput();\n" - << "}\n"; - - *vertexHLSL = vertexStream.str(); - *pixelHLSL = pixelStream.str(); -} - -std::string DynamicHLSL::generateComputeShaderLinkHLSL(const gl::Context *context, - const gl::ProgramState &programData) const -{ - gl::Shader *computeShaderGL = programData.getAttachedComputeShader(); - std::stringstream computeStream; - std::string translatedSource = computeShaderGL->getTranslatedSource(context); - computeStream << translatedSource; - - bool usesWorkGroupID = translatedSource.find("GL_USES_WORK_GROUP_ID") != std::string::npos; - bool usesLocalInvocationID = - translatedSource.find("GL_USES_LOCAL_INVOCATION_ID") != std::string::npos; - bool usesGlobalInvocationID = - translatedSource.find("GL_USES_GLOBAL_INVOCATION_ID") != std::string::npos; - bool usesLocalInvocationIndex = - translatedSource.find("GL_USES_LOCAL_INVOCATION_INDEX") != std::string::npos; - - computeStream << "\nstruct CS_INPUT\n{\n"; - if (usesWorkGroupID) - { - computeStream << " uint3 dx_WorkGroupID : " - << "SV_GroupID;\n"; - } - - if (usesLocalInvocationID) - { - computeStream << " uint3 dx_LocalInvocationID : " - << "SV_GroupThreadID;\n"; - } - - if (usesGlobalInvocationID) - { - computeStream << " uint3 dx_GlobalInvocationID : " - << "SV_DispatchThreadID;\n"; - } - - if (usesLocalInvocationIndex) - { - computeStream << " uint dx_LocalInvocationIndex : " - << "SV_GroupIndex;\n"; - } - - computeStream << "};\n\n"; - - const sh::WorkGroupSize &localSize = computeShaderGL->getWorkGroupSize(context); - computeStream << "[numthreads(" << localSize[0] << ", " << localSize[1] << ", " << localSize[2] - << ")]\n"; - - computeStream << "void main(CS_INPUT input)\n" - << "{\n"; - - if (usesWorkGroupID) - { - computeStream << " gl_WorkGroupID = input.dx_WorkGroupID;\n"; - } - if (usesLocalInvocationID) - { - computeStream << " gl_LocalInvocationID = input.dx_LocalInvocationID;\n"; - } - if (usesGlobalInvocationID) - { - computeStream << " gl_GlobalInvocationID = input.dx_GlobalInvocationID;\n"; - } - if (usesLocalInvocationIndex) - { - computeStream << " gl_LocalInvocationIndex = input.dx_LocalInvocationIndex;\n"; - } - - computeStream << "\n" - << " gl_main();\n" - << "}\n"; - - return computeStream.str(); -} - -std::string DynamicHLSL::generateGeometryShaderPreamble(const VaryingPacking &varyingPacking, - const BuiltinVaryingsD3D &builtinsD3D, - const bool hasANGLEMultiviewEnabled, - const bool selectViewInVS) const -{ - ASSERT(mRenderer->getMajorShaderModel() >= 4); - - std::ostringstream preambleStream; - - const auto &vertexBuiltins = builtinsD3D[gl::SHADER_VERTEX]; - - preambleStream << "struct GS_INPUT\n"; - generateVaryingLinkHLSL(varyingPacking, vertexBuiltins, builtinsD3D.usesPointSize(), - preambleStream); - preambleStream << "\n" - << "struct GS_OUTPUT\n"; - generateVaryingLinkHLSL(varyingPacking, builtinsD3D[gl::SHADER_GEOMETRY], - builtinsD3D.usesPointSize(), preambleStream); - preambleStream - << "\n" - << "void copyVertex(inout GS_OUTPUT output, GS_INPUT input, GS_INPUT flatinput)\n" - << "{\n" - << " output.gl_Position = input.gl_Position;\n"; - - if (vertexBuiltins.glPointSize.enabled) - { - preambleStream << " output.gl_PointSize = input.gl_PointSize;\n"; - } - - if (hasANGLEMultiviewEnabled) - { - preambleStream << " output.gl_ViewID_OVR = input.gl_ViewID_OVR;\n"; - if (selectViewInVS) - { - ASSERT(builtinsD3D[gl::SHADER_GEOMETRY].glViewportIndex.enabled && - builtinsD3D[gl::SHADER_GEOMETRY].glLayer.enabled); - - // If the view is already selected in the VS, then we just pass the gl_ViewportIndex and - // gl_Layer to the output. - preambleStream << " output.gl_ViewportIndex = input.gl_ViewportIndex;\n" - << " output.gl_Layer = input.gl_Layer;\n"; - } - } - - for (const PackedVaryingRegister &varyingRegister : varyingPacking.getRegisterList()) - { - preambleStream << " output.v" << varyingRegister.semanticIndex << " = "; - if (varyingRegister.packedVarying->interpolation == sh::INTERPOLATION_FLAT) - { - preambleStream << "flat"; - } - preambleStream << "input.v" << varyingRegister.semanticIndex << "; \n"; - } - - if (vertexBuiltins.glFragCoord.enabled) - { - preambleStream << " output.gl_FragCoord = input.gl_FragCoord;\n"; - } - - // Only write the dx_Position if we aren't using point sprites - preambleStream << "#ifndef ANGLE_POINT_SPRITE_SHADER\n" - << " output.dx_Position = input.dx_Position;\n" - << "#endif // ANGLE_POINT_SPRITE_SHADER\n" - << "}\n"; - - if (hasANGLEMultiviewEnabled && !selectViewInVS) - { - ASSERT(builtinsD3D[gl::SHADER_GEOMETRY].glViewportIndex.enabled && - builtinsD3D[gl::SHADER_GEOMETRY].glLayer.enabled); - - // According to the HLSL reference, using SV_RenderTargetArrayIndex is only valid if the - // render target is an array resource. Because of this we do not write to gl_Layer if we are - // taking the side-by-side code path. We still select the viewport index in the layered code - // path as that is always valid. See: - // https://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx - preambleStream << "\n" - << "void selectView(inout GS_OUTPUT output, GS_INPUT input)\n" - << "{\n" - << " if (multiviewSelectViewportIndex)\n" - << " {\n" - << " output.gl_ViewportIndex = input.gl_ViewID_OVR;\n" - << " } else {\n" - << " output.gl_ViewportIndex = 0;\n" - << " output.gl_Layer = input.gl_ViewID_OVR;\n" - << " }\n" - << "}\n"; - } - - return preambleStream.str(); -} - -std::string DynamicHLSL::generateGeometryShaderHLSL(const gl::Context *context, - gl::PrimitiveType primitiveType, - const gl::ProgramState &programData, - const bool useViewScale, - const bool hasANGLEMultiviewEnabled, - const bool selectViewInVS, - const bool pointSpriteEmulation, - const std::string &preambleString) const -{ - ASSERT(mRenderer->getMajorShaderModel() >= 4); - - std::stringstream shaderStream; - - const bool pointSprites = (primitiveType == PRIMITIVE_POINTS) && pointSpriteEmulation; - const bool usesPointCoord = preambleString.find("gl_PointCoord") != std::string::npos; - - const char *inputPT = nullptr; - const char *outputPT = nullptr; - int inputSize = 0; - int maxVertexOutput = 0; - - switch (primitiveType) - { - case PRIMITIVE_POINTS: - inputPT = "point"; - inputSize = 1; - - if (pointSprites) - { - outputPT = "Triangle"; - maxVertexOutput = 4; - } - else - { - outputPT = "Point"; - maxVertexOutput = 1; - } - - break; - - case PRIMITIVE_LINES: - case PRIMITIVE_LINE_STRIP: - case PRIMITIVE_LINE_LOOP: - inputPT = "line"; - outputPT = "Line"; - inputSize = 2; - maxVertexOutput = 2; - break; - - case PRIMITIVE_TRIANGLES: - case PRIMITIVE_TRIANGLE_STRIP: - case PRIMITIVE_TRIANGLE_FAN: - inputPT = "triangle"; - outputPT = "Triangle"; - inputSize = 3; - maxVertexOutput = 3; - break; - - default: - UNREACHABLE(); - break; - } - - if (pointSprites || hasANGLEMultiviewEnabled) - { - shaderStream << "cbuffer DriverConstants : register(b0)\n" - "{\n"; - - if (pointSprites) - { - shaderStream << " float4 dx_ViewCoords : packoffset(c1);\n"; - if (useViewScale) - { - shaderStream << " float2 dx_ViewScale : packoffset(c3);\n"; - } - } - - if (hasANGLEMultiviewEnabled) - { - // We have to add a value which we can use to keep track of which multi-view code path - // is to be selected in the GS. - shaderStream << " float multiviewSelectViewportIndex : packoffset(c3.z);\n"; - } - - shaderStream << "};\n\n"; - } - - if (pointSprites) - { - shaderStream << "#define ANGLE_POINT_SPRITE_SHADER\n" - "\n" - "static float2 pointSpriteCorners[] = \n" - "{\n" - " float2( 0.5f, -0.5f),\n" - " float2( 0.5f, 0.5f),\n" - " float2(-0.5f, -0.5f),\n" - " float2(-0.5f, 0.5f)\n" - "};\n" - "\n" - "static float2 pointSpriteTexcoords[] = \n" - "{\n" - " float2(1.0f, 1.0f),\n" - " float2(1.0f, 0.0f),\n" - " float2(0.0f, 1.0f),\n" - " float2(0.0f, 0.0f)\n" - "};\n" - "\n" - "static float minPointSize = " - << static_cast<int>(context->getCaps().minAliasedPointSize) - << ".0f;\n" - "static float maxPointSize = " - << static_cast<int>(context->getCaps().maxAliasedPointSize) << ".0f;\n" - << "\n"; - } - - shaderStream << preambleString << "\n" - << "[maxvertexcount(" << maxVertexOutput << ")]\n" - << "void main(" << inputPT << " GS_INPUT input[" << inputSize << "], "; - - if (primitiveType == PRIMITIVE_TRIANGLE_STRIP) - { - shaderStream << "uint primitiveID : SV_PrimitiveID, "; - } - - shaderStream << " inout " << outputPT << "Stream<GS_OUTPUT> outStream)\n" - << "{\n" - << " GS_OUTPUT output = (GS_OUTPUT)0;\n"; - - if (primitiveType == PRIMITIVE_TRIANGLE_STRIP) - { - shaderStream << " uint lastVertexIndex = (primitiveID % 2 == 0 ? 2 : 1);\n"; - } - else - { - shaderStream << " uint lastVertexIndex = " << (inputSize - 1) << ";\n"; - } - - for (int vertexIndex = 0; vertexIndex < inputSize; ++vertexIndex) - { - shaderStream << " copyVertex(output, input[" << vertexIndex - << "], input[lastVertexIndex]);\n"; - if (hasANGLEMultiviewEnabled && !selectViewInVS) - { - shaderStream << " selectView(output, input[" << vertexIndex << "]);\n"; - } - if (!pointSprites) - { - ASSERT(inputSize == maxVertexOutput); - shaderStream << " outStream.Append(output);\n"; - } - } - - if (pointSprites) - { - shaderStream << "\n" - " float4 dx_Position = input[0].dx_Position;\n" - " float gl_PointSize = clamp(input[0].gl_PointSize, minPointSize, " - "maxPointSize);\n" - " float2 viewportScale = float2(1.0f / dx_ViewCoords.x, 1.0f / " - "dx_ViewCoords.y) * dx_Position.w;\n"; - - for (int corner = 0; corner < 4; corner++) - { - if (useViewScale) - { - shaderStream << " \n" - " output.dx_Position = dx_Position + float4(1.0f, " - "-dx_ViewScale.y, 1.0f, 1.0f)" - " * float4(pointSpriteCorners[" - << corner << "] * viewportScale * gl_PointSize, 0.0f, 0.0f);\n"; - } - else - { - shaderStream << "\n" - " output.dx_Position = dx_Position + float4(pointSpriteCorners[" - << corner << "] * viewportScale * gl_PointSize, 0.0f, 0.0f);\n"; - } - - if (usesPointCoord) - { - shaderStream << " output.gl_PointCoord = pointSpriteTexcoords[" << corner - << "];\n"; - } - - shaderStream << " outStream.Append(output);\n"; - } - } - - shaderStream << " \n" - " outStream.RestartStrip();\n" - "}\n"; - - return shaderStream.str(); -} - -// static -void DynamicHLSL::GenerateAttributeConversionHLSL(gl::VertexFormatType vertexFormatType, - const sh::ShaderVariable &shaderAttrib, - std::ostringstream &outStream) -{ - // Matrix - if (IsMatrixType(shaderAttrib.type)) - { - outStream << "transpose(input." << DecorateVariable(shaderAttrib.name) << ")"; - return; - } - - GLenum shaderComponentType = VariableComponentType(shaderAttrib.type); - int shaderComponentCount = VariableComponentCount(shaderAttrib.type); - const gl::VertexFormat &vertexFormat = gl::GetVertexFormatFromType(vertexFormatType); - - // Perform integer to float conversion (if necessary) - if (shaderComponentType == GL_FLOAT && vertexFormat.type != GL_FLOAT) - { - // TODO: normalization for 32-bit integer formats - ASSERT(!vertexFormat.normalized && !vertexFormat.pureInteger); - outStream << "float" << shaderComponentCount << "(input." - << DecorateVariable(shaderAttrib.name) << ")"; - return; - } - - // No conversion necessary - outStream << "input." << DecorateVariable(shaderAttrib.name); -} - -void DynamicHLSL::getPixelShaderOutputKey(const gl::ContextState &data, - const gl::ProgramState &programData, - const ProgramD3DMetadata &metadata, - std::vector<PixelShaderOutputVariable> *outPixelShaderKey) -{ - // Two cases when writing to gl_FragColor and using ESSL 1.0: - // - with a 3.0 context, the output color is copied to channel 0 - // - with a 2.0 context, the output color is broadcast to all channels - bool broadcast = metadata.usesBroadcast(data); - const unsigned int numRenderTargets = - (broadcast || metadata.usesMultipleFragmentOuts() ? data.getCaps().maxDrawBuffers : 1); - - if (metadata.getMajorShaderVersion() < 300) - { - for (unsigned int renderTargetIndex = 0; renderTargetIndex < numRenderTargets; - renderTargetIndex++) - { - PixelShaderOutputVariable outputKeyVariable; - outputKeyVariable.type = GL_FLOAT_VEC4; - outputKeyVariable.name = "gl_Color" + Str(renderTargetIndex); - outputKeyVariable.source = - broadcast ? "gl_Color[0]" : "gl_Color[" + Str(renderTargetIndex) + "]"; - outputKeyVariable.outputIndex = renderTargetIndex; - - outPixelShaderKey->push_back(outputKeyVariable); - } - } - else - { - const auto &shaderOutputVars = - metadata.getFragmentShader()->getData().getActiveOutputVariables(); - - for (size_t outputLocationIndex = 0u; - outputLocationIndex < programData.getOutputLocations().size(); ++outputLocationIndex) - { - const VariableLocation &outputLocation = - programData.getOutputLocations().at(outputLocationIndex); - if (!outputLocation.used()) - { - continue; - } - const sh::ShaderVariable &outputVariable = shaderOutputVars[outputLocation.index]; - const std::string &variableName = "out_" + outputVariable.name; - - // Fragment outputs can't be arrays of arrays. ESSL 3.10 section 4.3.6. - const std::string &elementString = - (outputVariable.isArray() ? Str(outputLocation.arrayIndex) : ""); - - ASSERT(outputVariable.staticUse); - - PixelShaderOutputVariable outputKeyVariable; - outputKeyVariable.type = outputVariable.type; - outputKeyVariable.name = variableName + elementString; - outputKeyVariable.source = - variableName + - (outputVariable.isArray() ? ArrayString(outputLocation.arrayIndex) : ""); - outputKeyVariable.outputIndex = outputLocationIndex; - - outPixelShaderKey->push_back(outputKeyVariable); - } - } -} - -// BuiltinVarying Implementation. -BuiltinVarying::BuiltinVarying() : enabled(false), index(0), systemValue(false) -{ -} - -std::string BuiltinVarying::str() const -{ - return (systemValue ? semantic : (semantic + Str(index))); -} - -void BuiltinVarying::enableSystem(const std::string &systemValueSemantic) -{ - enabled = true; - semantic = systemValueSemantic; - systemValue = true; -} - -void BuiltinVarying::enable(const std::string &semanticVal, unsigned int indexVal) -{ - enabled = true; - semantic = semanticVal; - index = indexVal; -} - -// BuiltinVaryingsD3D Implementation. -BuiltinVaryingsD3D::BuiltinVaryingsD3D(const ProgramD3DMetadata &metadata, - const VaryingPacking &packing) -{ - updateBuiltins(gl::SHADER_VERTEX, metadata, packing); - updateBuiltins(gl::SHADER_FRAGMENT, metadata, packing); - if (metadata.getRendererMajorShaderModel() >= 4) - { - updateBuiltins(gl::SHADER_GEOMETRY, metadata, packing); - } -} - -BuiltinVaryingsD3D::~BuiltinVaryingsD3D() = default; - -void BuiltinVaryingsD3D::updateBuiltins(gl::ShaderType shaderType, - const ProgramD3DMetadata &metadata, - const VaryingPacking &packing) -{ - const std::string &userSemantic = GetVaryingSemantic(metadata.getRendererMajorShaderModel(), - metadata.usesSystemValuePointSize()); - - unsigned int reservedSemanticIndex = packing.getMaxSemanticIndex(); - - BuiltinInfo *builtins = &mBuiltinInfo[shaderType]; - - if (metadata.getRendererMajorShaderModel() >= 4) - { - builtins->dxPosition.enableSystem("SV_Position"); - } - else if (shaderType == gl::SHADER_FRAGMENT) - { - builtins->dxPosition.enableSystem("VPOS"); - } - else - { - builtins->dxPosition.enableSystem("POSITION"); - } - - if (metadata.usesTransformFeedbackGLPosition()) - { - builtins->glPosition.enable(userSemantic, reservedSemanticIndex++); - } - - if (metadata.usesFragCoord()) - { - builtins->glFragCoord.enable(userSemantic, reservedSemanticIndex++); - } - - if (shaderType == gl::SHADER_VERTEX ? metadata.addsPointCoordToVertexShader() - : metadata.usesPointCoord()) - { - // SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord) - // In D3D11 we manually compute gl_PointCoord in the GS. - if (metadata.getRendererMajorShaderModel() >= 4) - { - builtins->glPointCoord.enable(userSemantic, reservedSemanticIndex++); - } - else - { - builtins->glPointCoord.enable("TEXCOORD", 0); - } - } - - if (shaderType == gl::SHADER_VERTEX && metadata.hasANGLEMultiviewEnabled()) - { - builtins->glViewIDOVR.enable(userSemantic, reservedSemanticIndex++); - if (metadata.canSelectViewInVertexShader()) - { - builtins->glViewportIndex.enableSystem("SV_ViewportArrayIndex"); - builtins->glLayer.enableSystem("SV_RenderTargetArrayIndex"); - } - } - - if (shaderType == gl::SHADER_FRAGMENT && metadata.hasANGLEMultiviewEnabled()) - { - builtins->glViewIDOVR.enable(userSemantic, reservedSemanticIndex++); - } - - if (shaderType == gl::SHADER_GEOMETRY && metadata.hasANGLEMultiviewEnabled()) - { - // Although it is possible to retrieve gl_ViewID_OVR from the value of - // SV_ViewportArrayIndex or SV_RenderTargetArrayIndex based on the multi-view state in the - // driver constant buffer, it is easier and cleaner to pass it as a varying. - builtins->glViewIDOVR.enable(userSemantic, reservedSemanticIndex++); - - // gl_Layer and gl_ViewportIndex are necessary so that we can write to either based on the - // multiview state in the driver constant buffer. - builtins->glViewportIndex.enableSystem("SV_ViewportArrayIndex"); - builtins->glLayer.enableSystem("SV_RenderTargetArrayIndex"); - } - - // Special case: do not include PSIZE semantic in HLSL 3 pixel shaders - if (metadata.usesSystemValuePointSize() && - (shaderType != gl::SHADER_FRAGMENT || metadata.getRendererMajorShaderModel() >= 4)) - { - builtins->glPointSize.enableSystem("PSIZE"); - } -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h deleted file mode 100644 index fe8d9cb0a3..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h +++ /dev/null @@ -1,175 +0,0 @@ -// -// Copyright (c) 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. -// -// DynamicHLSL.h: Interface for link and run-time HLSL generation -// - -#ifndef LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_ -#define LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_ - -#include <map> -#include <vector> - -#include "angle_gl.h" -#include "common/angleutils.h" -#include "libANGLE/Constants.h" -#include "libANGLE/Program.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" - -namespace sh -{ -struct Attribute; -struct ShaderVariable; -} - -namespace gl -{ -class InfoLog; -struct VariableLocation; -class VaryingPacking; -struct VertexAttribute; -} - -namespace rx -{ -class ProgramD3DMetadata; -class ShaderD3D; - -struct PixelShaderOutputVariable -{ - PixelShaderOutputVariable() {} - PixelShaderOutputVariable(GLenum typeIn, - const std::string &nameIn, - const std::string &sourceIn, - size_t outputIndexIn) - : type(typeIn), name(nameIn), source(sourceIn), outputIndex(outputIndexIn) - { - } - - GLenum type = GL_NONE; - std::string name; - std::string source; - size_t outputIndex = 0; -}; - -struct BuiltinVarying final : private angle::NonCopyable -{ - BuiltinVarying(); - - std::string str() const; - void enableSystem(const std::string &systemValueSemantic); - void enable(const std::string &semanticVal, unsigned int indexVal); - - bool enabled; - std::string semantic; - unsigned int index; - bool systemValue; -}; - -struct BuiltinInfo -{ - BuiltinInfo(); - ~BuiltinInfo(); - - BuiltinVarying dxPosition; - BuiltinVarying glPosition; - BuiltinVarying glFragCoord; - BuiltinVarying glPointCoord; - BuiltinVarying glPointSize; - BuiltinVarying glViewIDOVR; - BuiltinVarying glViewportIndex; - BuiltinVarying glLayer; -}; - -inline std::string GetVaryingSemantic(int majorShaderModel, bool programUsesPointSize) -{ - // SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord) - // In D3D11 we manually compute gl_PointCoord in the GS. - return ((programUsesPointSize && majorShaderModel < 4) ? "COLOR" : "TEXCOORD"); -} - -class BuiltinVaryingsD3D -{ - public: - BuiltinVaryingsD3D(const ProgramD3DMetadata &metadata, const gl::VaryingPacking &packing); - ~BuiltinVaryingsD3D(); - - bool usesPointSize() const { return mBuiltinInfo[gl::SHADER_VERTEX].glPointSize.enabled; } - - const BuiltinInfo &operator[](gl::ShaderType shaderType) const - { - return mBuiltinInfo[shaderType]; - } - BuiltinInfo &operator[](gl::ShaderType shaderType) { return mBuiltinInfo[shaderType]; } - - private: - void updateBuiltins(gl::ShaderType shaderType, - const ProgramD3DMetadata &metadata, - const gl::VaryingPacking &packing); - - std::array<BuiltinInfo, gl::SHADER_TYPE_MAX> mBuiltinInfo; -}; - -class DynamicHLSL : angle::NonCopyable -{ - public: - explicit DynamicHLSL(RendererD3D *const renderer); - - std::string generateVertexShaderForInputLayout( - const std::string &sourceShader, - const gl::InputLayout &inputLayout, - const std::vector<sh::Attribute> &shaderAttributes) const; - std::string generatePixelShaderForOutputSignature( - const std::string &sourceShader, - const std::vector<PixelShaderOutputVariable> &outputVariables, - bool usesFragDepth, - const std::vector<GLenum> &outputLayout) const; - void generateShaderLinkHLSL(const gl::Context *context, - const gl::ProgramState &programData, - const ProgramD3DMetadata &programMetadata, - const gl::VaryingPacking &varyingPacking, - const BuiltinVaryingsD3D &builtinsD3D, - std::string *pixelHLSL, - std::string *vertexHLSL) const; - std::string generateComputeShaderLinkHLSL(const gl::Context *context, - const gl::ProgramState &programData) const; - - std::string generateGeometryShaderPreamble(const gl::VaryingPacking &varyingPacking, - const BuiltinVaryingsD3D &builtinsD3D, - const bool hasANGLEMultiviewEnabled, - const bool selectViewInVS) const; - - std::string generateGeometryShaderHLSL(const gl::Context *context, - gl::PrimitiveType primitiveType, - const gl::ProgramState &programData, - const bool useViewScale, - const bool hasANGLEMultiviewEnabled, - const bool selectViewInVS, - const bool pointSpriteEmulation, - const std::string &preambleString) const; - - void getPixelShaderOutputKey(const gl::ContextState &data, - const gl::ProgramState &programData, - const ProgramD3DMetadata &metadata, - std::vector<PixelShaderOutputVariable> *outPixelShaderKey); - - private: - RendererD3D *const mRenderer; - - void generateVaryingLinkHLSL(const gl::VaryingPacking &varyingPacking, - const BuiltinInfo &builtins, - bool programUsesPointSize, - std::ostringstream &hlslStream) const; - - static void GenerateAttributeConversionHLSL(gl::VertexFormatType vertexFormatType, - const sh::ShaderVariable &shaderAttrib, - std::ostringstream &outStream); -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp deleted file mode 100644 index fcc2456bd6..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp +++ /dev/null @@ -1,87 +0,0 @@ -// -// Copyright (c) 2015 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. -// - -// EGLImageD3D.cpp: Implements the rx::EGLImageD3D class, the D3D implementation of EGL images - -#include "libANGLE/renderer/d3d/EGLImageD3D.h" - -#include "common/debug.h" -#include "common/utilities.h" -#include "libANGLE/AttributeMap.h" -#include "libANGLE/Texture.h" -#include "libANGLE/renderer/d3d/RenderbufferD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/RenderTargetD3D.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" -#include "libANGLE/renderer/d3d/TextureStorage.h" - -#include <EGL/eglext.h> - -namespace rx -{ - -EGLImageD3D::EGLImageD3D(const egl::ImageState &state, - EGLenum target, - const egl::AttributeMap &attribs, - RendererD3D *renderer) - : ImageImpl(state), mRenderer(renderer), mRenderTarget(nullptr) -{ - ASSERT(renderer != nullptr); -} - -EGLImageD3D::~EGLImageD3D() -{ - SafeDelete(mRenderTarget); -} - -egl::Error EGLImageD3D::initialize() -{ - return egl::NoError(); -} - -gl::Error EGLImageD3D::orphan(const gl::Context *context, egl::ImageSibling *sibling) -{ - if (sibling == mState.source.get()) - { - ANGLE_TRY(copyToLocalRendertarget(context)); - } - - return gl::NoError(); -} - -gl::Error EGLImageD3D::getRenderTarget(const gl::Context *context, RenderTargetD3D **outRT) const -{ - if (mState.source.get()) - { - ASSERT(!mRenderTarget); - FramebufferAttachmentRenderTarget *rt = nullptr; - ANGLE_TRY( - mState.source->getAttachmentRenderTarget(context, GL_NONE, mState.imageIndex, &rt)); - *outRT = static_cast<RenderTargetD3D *>(rt); - return gl::NoError(); - } - else - { - ASSERT(mRenderTarget); - *outRT = mRenderTarget; - return gl::NoError(); - } -} - -gl::Error EGLImageD3D::copyToLocalRendertarget(const gl::Context *context) -{ - ASSERT(mState.source.get() != nullptr); - ASSERT(mRenderTarget == nullptr); - - RenderTargetD3D *curRenderTarget = nullptr; - ANGLE_TRY(getRenderTarget(context, &curRenderTarget)); - - // This only currently applies do D3D11, where it invalidates FBOs with this Image attached. - curRenderTarget->signalDirty(context); - - return mRenderer->createRenderTargetCopy(curRenderTarget, &mRenderTarget); -} -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h deleted file mode 100644 index 1ee7984426..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h +++ /dev/null @@ -1,55 +0,0 @@ -// -// Copyright (c) 2015 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. -// - -// EGLImageD3D.h: Defines the rx::EGLImageD3D class, the D3D implementation of EGL images - -#ifndef LIBANGLE_RENDERER_D3D_EGLIMAGED3D_H_ -#define LIBANGLE_RENDERER_D3D_EGLIMAGED3D_H_ - -#include "libANGLE/renderer/ImageImpl.h" - -namespace gl -{ -class Context; -} - -namespace egl -{ -class AttributeMap; -} - -namespace rx -{ -class FramebufferAttachmentObjectImpl; -class TextureD3D; -class RenderbufferD3D; -class RendererD3D; -class RenderTargetD3D; - -class EGLImageD3D final : public ImageImpl -{ - public: - EGLImageD3D(const egl::ImageState &state, - EGLenum target, - const egl::AttributeMap &attribs, - RendererD3D *renderer); - ~EGLImageD3D() override; - - egl::Error initialize() override; - - gl::Error orphan(const gl::Context *context, egl::ImageSibling *sibling) override; - - gl::Error getRenderTarget(const gl::Context *context, RenderTargetD3D **outRT) const; - - private: - gl::Error copyToLocalRendertarget(const gl::Context *context); - - RendererD3D *mRenderer; - RenderTargetD3D *mRenderTarget; -}; -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_EGLIMAGED3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp deleted file mode 100644 index 3d73b2c840..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp +++ /dev/null @@ -1,405 +0,0 @@ -// -// 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. -// - -// FramebufferD3D.cpp: Implements the DefaultAttachmentD3D and FramebufferD3D classes. - -#include "libANGLE/renderer/d3d/FramebufferD3D.h" - -#include "common/bitset_utils.h" -#include "libANGLE/Context.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/Surface.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/ContextImpl.h" -#include "libANGLE/renderer/d3d/RenderTargetD3D.h" -#include "libANGLE/renderer/d3d/RenderbufferD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/SurfaceD3D.h" -#include "libANGLE/renderer/d3d/SwapChainD3D.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" - -namespace rx -{ - -namespace -{ - -ClearParameters GetClearParameters(const gl::State &state, GLbitfield mask) -{ - ClearParameters clearParams; - memset(&clearParams, 0, sizeof(ClearParameters)); - - const auto &blendState = state.getBlendState(); - - for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++) - { - clearParams.clearColor[i] = false; - } - clearParams.colorF = state.getColorClearValue(); - clearParams.colorType = GL_FLOAT; - clearParams.colorMaskRed = blendState.colorMaskRed; - clearParams.colorMaskGreen = blendState.colorMaskGreen; - clearParams.colorMaskBlue = blendState.colorMaskBlue; - clearParams.colorMaskAlpha = blendState.colorMaskAlpha; - clearParams.clearDepth = false; - clearParams.depthValue = state.getDepthClearValue(); - clearParams.clearStencil = false; - clearParams.stencilValue = state.getStencilClearValue(); - clearParams.stencilWriteMask = state.getDepthStencilState().stencilWritemask; - clearParams.scissorEnabled = state.isScissorTestEnabled(); - clearParams.scissor = state.getScissor(); - - const gl::Framebuffer *framebufferObject = state.getDrawFramebuffer(); - if (mask & GL_COLOR_BUFFER_BIT) - { - if (framebufferObject->hasEnabledDrawBuffer()) - { - for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++) - { - clearParams.clearColor[i] = true; - } - } - } - - if (mask & GL_DEPTH_BUFFER_BIT) - { - if (state.getDepthStencilState().depthMask && - framebufferObject->getDepthbuffer() != nullptr) - { - clearParams.clearDepth = true; - } - } - - if (mask & GL_STENCIL_BUFFER_BIT) - { - if (framebufferObject->getStencilbuffer() != nullptr && - framebufferObject->getStencilbuffer()->getStencilSize() > 0) - { - clearParams.clearStencil = true; - } - } - - return clearParams; -} -} - -ClearParameters::ClearParameters() = default; - -ClearParameters::ClearParameters(const ClearParameters &other) = default; - -FramebufferD3D::FramebufferD3D(const gl::FramebufferState &data, RendererD3D *renderer) - : FramebufferImpl(data), mRenderer(renderer) -{ -} - -FramebufferD3D::~FramebufferD3D() -{ -} - -gl::Error FramebufferD3D::clear(const gl::Context *context, GLbitfield mask) -{ - ClearParameters clearParams = GetClearParameters(context->getGLState(), mask); - return clearImpl(context, clearParams); -} - -gl::Error FramebufferD3D::clearBufferfv(const gl::Context *context, - GLenum buffer, - GLint drawbuffer, - const GLfloat *values) -{ - // glClearBufferfv can be called to clear the color buffer or depth buffer - ClearParameters clearParams = GetClearParameters(context->getGLState(), 0); - - if (buffer == GL_COLOR) - { - for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++) - { - clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i)); - } - clearParams.colorF = gl::ColorF(values[0], values[1], values[2], values[3]); - clearParams.colorType = GL_FLOAT; - } - - if (buffer == GL_DEPTH) - { - clearParams.clearDepth = true; - clearParams.depthValue = values[0]; - } - - return clearImpl(context, clearParams); -} - -gl::Error FramebufferD3D::clearBufferuiv(const gl::Context *context, - GLenum buffer, - GLint drawbuffer, - const GLuint *values) -{ - // glClearBufferuiv can only be called to clear a color buffer - ClearParameters clearParams = GetClearParameters(context->getGLState(), 0); - for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++) - { - clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i)); - } - clearParams.colorUI = gl::ColorUI(values[0], values[1], values[2], values[3]); - clearParams.colorType = GL_UNSIGNED_INT; - - return clearImpl(context, clearParams); -} - -gl::Error FramebufferD3D::clearBufferiv(const gl::Context *context, - GLenum buffer, - GLint drawbuffer, - const GLint *values) -{ - // glClearBufferiv can be called to clear the color buffer or stencil buffer - ClearParameters clearParams = GetClearParameters(context->getGLState(), 0); - - if (buffer == GL_COLOR) - { - for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++) - { - clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i)); - } - clearParams.colorI = gl::ColorI(values[0], values[1], values[2], values[3]); - clearParams.colorType = GL_INT; - } - - if (buffer == GL_STENCIL) - { - clearParams.clearStencil = true; - clearParams.stencilValue = values[0]; - } - - return clearImpl(context, clearParams); -} - -gl::Error FramebufferD3D::clearBufferfi(const gl::Context *context, - GLenum buffer, - GLint drawbuffer, - GLfloat depth, - GLint stencil) -{ - // glClearBufferfi can only be called to clear a depth stencil buffer - ClearParameters clearParams = GetClearParameters(context->getGLState(), 0); - clearParams.clearDepth = true; - clearParams.depthValue = depth; - clearParams.clearStencil = true; - clearParams.stencilValue = stencil; - - return clearImpl(context, clearParams); -} - -GLenum FramebufferD3D::getImplementationColorReadFormat(const gl::Context *context) const -{ - const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment(); - - if (readAttachment == nullptr) - { - return GL_NONE; - } - - RenderTargetD3D *attachmentRenderTarget = nullptr; - gl::Error error = readAttachment->getRenderTarget(context, &attachmentRenderTarget); - if (error.isError()) - { - return GL_NONE; - } - - GLenum implementationFormat = getRenderTargetImplementationFormat(attachmentRenderTarget); - const gl::InternalFormat &implementationFormatInfo = - gl::GetSizedInternalFormatInfo(implementationFormat); - - return implementationFormatInfo.getReadPixelsFormat(); -} - -GLenum FramebufferD3D::getImplementationColorReadType(const gl::Context *context) const -{ - const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment(); - - if (readAttachment == nullptr) - { - return GL_NONE; - } - - RenderTargetD3D *attachmentRenderTarget = nullptr; - gl::Error error = readAttachment->getRenderTarget(context, &attachmentRenderTarget); - if (error.isError()) - { - return GL_NONE; - } - - GLenum implementationFormat = getRenderTargetImplementationFormat(attachmentRenderTarget); - const gl::InternalFormat &implementationFormatInfo = - gl::GetSizedInternalFormatInfo(implementationFormat); - - return implementationFormatInfo.getReadPixelsType(context->getClientVersion()); -} - -gl::Error FramebufferD3D::readPixels(const gl::Context *context, - const gl::Rectangle &origArea, - GLenum format, - GLenum type, - void *pixels) -{ - // Clip read area to framebuffer. - const gl::Extents fbSize = getState().getReadAttachment()->getSize(); - const gl::Rectangle fbRect(0, 0, fbSize.width, fbSize.height); - gl::Rectangle area; - if (!ClipRectangle(origArea, fbRect, &area)) - { - // nothing to read - return gl::NoError(); - } - - const gl::PixelPackState &packState = context->getGLState().getPackState(); - - const gl::InternalFormat &sizedFormatInfo = gl::GetInternalFormatInfo(format, type); - - GLuint outputPitch = 0; - ANGLE_TRY_RESULT(sizedFormatInfo.computeRowPitch(type, origArea.width, packState.alignment, - packState.rowLength), - outputPitch); - GLuint outputSkipBytes = 0; - ANGLE_TRY_RESULT(sizedFormatInfo.computeSkipBytes(outputPitch, 0, packState, false), - outputSkipBytes); - outputSkipBytes += - (area.x - origArea.x) * sizedFormatInfo.pixelBytes + (area.y - origArea.y) * outputPitch; - - return readPixelsImpl(context, area, format, type, outputPitch, packState, - reinterpret_cast<uint8_t *>(pixels) + outputSkipBytes); -} - -gl::Error FramebufferD3D::blit(const gl::Context *context, - const gl::Rectangle &sourceArea, - const gl::Rectangle &destArea, - GLbitfield mask, - GLenum filter) -{ - const auto &glState = context->getGLState(); - const gl::Framebuffer *sourceFramebuffer = glState.getReadFramebuffer(); - const gl::Rectangle *scissor = glState.isScissorTestEnabled() ? &glState.getScissor() : nullptr; - ANGLE_TRY(blitImpl(context, sourceArea, destArea, scissor, (mask & GL_COLOR_BUFFER_BIT) != 0, - (mask & GL_DEPTH_BUFFER_BIT) != 0, (mask & GL_STENCIL_BUFFER_BIT) != 0, - filter, sourceFramebuffer)); - - return gl::NoError(); -} - -bool FramebufferD3D::checkStatus(const gl::Context *context) const -{ - // if we have both a depth and stencil buffer, they must refer to the same object - // since we only support packed_depth_stencil and not separate depth and stencil - if (mState.getDepthAttachment() != nullptr && mState.getStencilAttachment() != nullptr && - mState.getDepthStencilAttachment() == nullptr) - { - return false; - } - - // D3D11 does not allow for overlapping RenderTargetViews. - // If WebGL compatibility is enabled, this has already been checked at a higher level. - ASSERT(!context->getExtensions().webglCompatibility || mState.colorAttachmentsAreUniqueImages()); - if (!context->getExtensions().webglCompatibility) - { - if (!mState.colorAttachmentsAreUniqueImages()) - { - return false; - } - } - - // D3D requires all render targets to have the same dimensions. - if (!mState.attachmentsHaveSameDimensions()) - { - return false; - } - - return true; -} - -void FramebufferD3D::syncState(const gl::Context *context, - const gl::Framebuffer::DirtyBits &dirtyBits) -{ - if (!mColorAttachmentsForRender.valid()) - { - return; - } - - for (auto dirtyBit : dirtyBits) - { - if ((dirtyBit >= gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 && - dirtyBit < gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX) || - dirtyBit == gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS) - { - mColorAttachmentsForRender.reset(); - } - } -} - -const gl::AttachmentList &FramebufferD3D::getColorAttachmentsForRender(const gl::Context *context) -{ - gl::DrawBufferMask activeProgramOutputs = - context->getContextState().getState().getProgram()->getActiveOutputVariables(); - - if (mColorAttachmentsForRender.valid() && mCurrentActiveProgramOutputs == activeProgramOutputs) - { - return mColorAttachmentsForRender.value(); - } - - // Does not actually free memory - gl::AttachmentList colorAttachmentsForRender; - - const auto &colorAttachments = mState.getColorAttachments(); - const auto &drawBufferStates = mState.getDrawBufferStates(); - const auto &workarounds = mRenderer->getWorkarounds(); - - for (size_t attachmentIndex = 0; attachmentIndex < colorAttachments.size(); ++attachmentIndex) - { - GLenum drawBufferState = drawBufferStates[attachmentIndex]; - const gl::FramebufferAttachment &colorAttachment = colorAttachments[attachmentIndex]; - - if (colorAttachment.isAttached() && drawBufferState != GL_NONE && - activeProgramOutputs[attachmentIndex]) - { - ASSERT(drawBufferState == GL_BACK || - drawBufferState == (GL_COLOR_ATTACHMENT0_EXT + attachmentIndex)); - colorAttachmentsForRender.push_back(&colorAttachment); - } - else if (!workarounds.mrtPerfWorkaround) - { - colorAttachmentsForRender.push_back(nullptr); - } - } - - // When rendering with no render target on D3D, two bugs lead to incorrect behavior on Intel - // drivers < 4815. The rendering samples always pass neglecting discard statements in pixel - // shader. We add a dummy texture as render target in such case. - if (mRenderer->getWorkarounds().addDummyTextureNoRenderTarget && - colorAttachmentsForRender.empty()) - { - static_assert(static_cast<size_t>(activeProgramOutputs.size()) <= 32, - "Size of active program outputs should less or equal than 32."); - GLenum i = static_cast<GLenum>( - gl::ScanForward(static_cast<uint32_t>(activeProgramOutputs.bits()))); - - gl::Texture *dummyTex = nullptr; - // TODO(Jamie): Handle error if dummy texture can't be created. - ANGLE_SWALLOW_ERR(mRenderer->getIncompleteTexture(context, GL_TEXTURE_2D, &dummyTex)); - if (dummyTex) - { - gl::ImageIndex index = gl::ImageIndex::Make2D(0); - gl::FramebufferAttachment *dummyAttach = new gl::FramebufferAttachment( - context, GL_TEXTURE, GL_COLOR_ATTACHMENT0_EXT + i, index, dummyTex); - colorAttachmentsForRender.push_back(dummyAttach); - } - } - - mColorAttachmentsForRender = std::move(colorAttachmentsForRender); - mCurrentActiveProgramOutputs = activeProgramOutputs; - - return mColorAttachmentsForRender.value(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h deleted file mode 100644 index a7312fdef4..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h +++ /dev/null @@ -1,134 +0,0 @@ -// -// 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. -// - -// FramebufferD3D.h: Defines the DefaultAttachmentD3D and FramebufferD3D classes. - -#ifndef LIBANGLE_RENDERER_D3D_FRAMBUFFERD3D_H_ -#define LIBANGLE_RENDERER_D3D_FRAMBUFFERD3D_H_ - -#include <cstdint> -#include <vector> - -#include "common/Color.h" -#include "common/Optional.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/renderer/FramebufferImpl.h" - -namespace gl -{ -class FramebufferAttachment; -struct PixelPackState; - -typedef std::vector<const FramebufferAttachment *> AttachmentList; -} - -namespace rx -{ -class RendererD3D; -class RenderTargetD3D; - -struct ClearParameters -{ - ClearParameters(); - ClearParameters(const ClearParameters &other); - - bool clearColor[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS]; - gl::ColorF colorF; - gl::ColorI colorI; - gl::ColorUI colorUI; - GLenum colorType; - bool colorMaskRed; - bool colorMaskGreen; - bool colorMaskBlue; - bool colorMaskAlpha; - - bool clearDepth; - float depthValue; - - bool clearStencil; - GLint stencilValue; - GLuint stencilWriteMask; - - bool scissorEnabled; - gl::Rectangle scissor; -}; - -class FramebufferD3D : public FramebufferImpl -{ - public: - FramebufferD3D(const gl::FramebufferState &data, RendererD3D *renderer); - ~FramebufferD3D() override; - - gl::Error clear(const gl::Context *context, GLbitfield mask) override; - gl::Error clearBufferfv(const gl::Context *context, - GLenum buffer, - GLint drawbuffer, - const GLfloat *values) override; - gl::Error clearBufferuiv(const gl::Context *context, - GLenum buffer, - GLint drawbuffer, - const GLuint *values) override; - gl::Error clearBufferiv(const gl::Context *context, - GLenum buffer, - GLint drawbuffer, - const GLint *values) override; - gl::Error clearBufferfi(const gl::Context *context, - GLenum buffer, - GLint drawbuffer, - GLfloat depth, - GLint stencil) override; - - GLenum getImplementationColorReadFormat(const gl::Context *context) const override; - GLenum getImplementationColorReadType(const gl::Context *context) const override; - gl::Error readPixels(const gl::Context *context, - const gl::Rectangle &area, - GLenum format, - GLenum type, - void *pixels) override; - - gl::Error blit(const gl::Context *context, - const gl::Rectangle &sourceArea, - const gl::Rectangle &destArea, - GLbitfield mask, - GLenum filter) override; - - bool checkStatus(const gl::Context *context) const override; - - void syncState(const gl::Context *context, - const gl::Framebuffer::DirtyBits &dirtyBits) override; - - const gl::AttachmentList &getColorAttachmentsForRender(const gl::Context *context); - - private: - virtual gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) = 0; - - virtual gl::Error readPixelsImpl(const gl::Context *context, - const gl::Rectangle &area, - GLenum format, - GLenum type, - size_t outputPitch, - const gl::PixelPackState &pack, - uint8_t *pixels) = 0; - - virtual gl::Error blitImpl(const gl::Context *context, - const gl::Rectangle &sourceArea, - const gl::Rectangle &destArea, - const gl::Rectangle *scissor, - bool blitRenderTarget, - bool blitDepth, - bool blitStencil, - GLenum filter, - const gl::Framebuffer *sourceFramebuffer) = 0; - - virtual GLenum getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const = 0; - - RendererD3D *mRenderer; - Optional<gl::AttachmentList> mColorAttachmentsForRender; - gl::DrawBufferMask mCurrentActiveProgramOutputs; -}; -} - -#endif // LIBANGLE_RENDERER_D3D_FRAMBUFFERD3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp deleted file mode 100644 index 5d47308d67..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp +++ /dev/null @@ -1,354 +0,0 @@ -// -// 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. -// - -#include "libANGLE/renderer/d3d/HLSLCompiler.h" - -#include <sstream> - -#include "common/utilities.h" -#include "libANGLE/Program.h" -#include "libANGLE/features.h" -#include "libANGLE/histogram_macros.h" -#include "third_party/trace_event/trace_event.h" - -#ifndef QT_D3DCOMPILER_DLL -#define QT_D3DCOMPILER_DLL D3DCOMPILER_DLL -#endif - -#if ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED -namespace -{ -#ifdef CREATE_COMPILER_FLAG_INFO - #undef CREATE_COMPILER_FLAG_INFO -#endif - -#define CREATE_COMPILER_FLAG_INFO(flag) { flag, #flag } - -struct CompilerFlagInfo -{ - UINT mFlag; - const char *mName; -}; - -CompilerFlagInfo CompilerFlagInfos[] = -{ - // NOTE: The data below is copied from d3dcompiler.h - // If something changes there it should be changed here as well - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_DEBUG), // (1 << 0) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_SKIP_VALIDATION), // (1 << 1) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_SKIP_OPTIMIZATION), // (1 << 2) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_PACK_MATRIX_ROW_MAJOR), // (1 << 3) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR), // (1 << 4) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_PARTIAL_PRECISION), // (1 << 5) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_FORCE_VS_SOFTWARE_NO_OPT), // (1 << 6) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_FORCE_PS_SOFTWARE_NO_OPT), // (1 << 7) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_NO_PRESHADER), // (1 << 8) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_AVOID_FLOW_CONTROL), // (1 << 9) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_PREFER_FLOW_CONTROL), // (1 << 10) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_ENABLE_STRICTNESS), // (1 << 11) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY), // (1 << 12) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_IEEE_STRICTNESS), // (1 << 13) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_OPTIMIZATION_LEVEL0), // (1 << 14) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_OPTIMIZATION_LEVEL1), // 0 - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_OPTIMIZATION_LEVEL2), // ((1 << 14) | (1 << 15)) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_OPTIMIZATION_LEVEL3), // (1 << 15) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_RESERVED16), // (1 << 16) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_RESERVED17), // (1 << 17) - CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_WARNINGS_ARE_ERRORS) // (1 << 18) -}; - -#undef CREATE_COMPILER_FLAG_INFO - -bool IsCompilerFlagSet(UINT mask, UINT flag) -{ - bool isFlagSet = IsMaskFlagSet(mask, flag); - - switch(flag) - { - case D3DCOMPILE_OPTIMIZATION_LEVEL0: - return isFlagSet && !IsMaskFlagSet(mask, UINT(D3DCOMPILE_OPTIMIZATION_LEVEL3)); - - case D3DCOMPILE_OPTIMIZATION_LEVEL1: - return (mask & D3DCOMPILE_OPTIMIZATION_LEVEL2) == UINT(0); - - case D3DCOMPILE_OPTIMIZATION_LEVEL3: - return isFlagSet && !IsMaskFlagSet(mask, UINT(D3DCOMPILE_OPTIMIZATION_LEVEL0)); - - default: - return isFlagSet; - } -} -} // anonymous namespace -#endif // ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED - -namespace rx -{ - -CompileConfig::CompileConfig() - : flags(0), - name() -{ -} - -CompileConfig::CompileConfig(UINT flags, const std::string &name) - : flags(flags), - name(name) -{ -} - -HLSLCompiler::HLSLCompiler() - : mInitialized(false), - mD3DCompilerModule(nullptr), - mD3DCompileFunc(nullptr), - mD3DDisassembleFunc(nullptr) -{ -} - -HLSLCompiler::~HLSLCompiler() -{ - release(); -} - -gl::Error HLSLCompiler::ensureInitialized() -{ - if (mInitialized) - { - return gl::NoError(); - } - - TRACE_EVENT0("gpu.angle", "HLSLCompiler::initialize"); -#if !defined(ANGLE_ENABLE_WINDOWS_STORE) -#if defined(ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES) - // Find a D3DCompiler module that had already been loaded based on a predefined list of versions. - static const char *d3dCompilerNames[] = ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES; - - for (size_t i = 0; i < ArraySize(d3dCompilerNames); ++i) - { - if (GetModuleHandleExA(0, d3dCompilerNames[i], &mD3DCompilerModule)) - { - break; - } - } -#endif // ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES - - // Load the compiler DLL specified by the environment, or default to QT_D3DCOMPILER_DLL - const wchar_t *defaultCompiler = _wgetenv(L"QT_D3DCOMPILER_DLL"); - if (!defaultCompiler) - defaultCompiler = QT_D3DCOMPILER_DLL; - - const wchar_t *compilerDlls[] = { - defaultCompiler, - L"d3dcompiler_47.dll", - L"d3dcompiler_46.dll", - L"d3dcompiler_43.dll", - 0 - }; - - // Load the first available known compiler DLL - for (int i = 0; compilerDlls[i]; ++i) - { - mD3DCompilerModule = LoadLibrary(compilerDlls[i]); - if (mD3DCompilerModule) - break; - } - - if (!mD3DCompilerModule) - { - // Load the version of the D3DCompiler DLL associated with the Direct3D version ANGLE was built with. - mD3DCompilerModule = LoadLibrary(D3DCOMPILER_DLL); - } - - if (!mD3DCompilerModule) - { - ERR() << "D3D compiler module not found."; - return gl::OutOfMemory() << "D3D compiler module not found."; - } - - mD3DCompileFunc = reinterpret_cast<pD3DCompile>(GetProcAddress(mD3DCompilerModule, "D3DCompile")); - ASSERT(mD3DCompileFunc); - - mD3DDisassembleFunc = reinterpret_cast<pD3DDisassemble>(GetProcAddress(mD3DCompilerModule, "D3DDisassemble")); - ASSERT(mD3DDisassembleFunc); - -#else - // D3D Shader compiler is linked already into this module, so the export - // can be directly assigned. - mD3DCompilerModule = nullptr; - mD3DCompileFunc = reinterpret_cast<pD3DCompile>(D3DCompile); - mD3DDisassembleFunc = reinterpret_cast<pD3DDisassemble>(D3DDisassemble); -#endif - - if (mD3DCompileFunc == nullptr) - { - return gl::OutOfMemory() << "Error finding D3DCompile entry point."; - } - - mInitialized = true; - return gl::NoError(); -} - -void HLSLCompiler::release() -{ - if (mInitialized) - { - FreeLibrary(mD3DCompilerModule); - mD3DCompilerModule = nullptr; - mD3DCompileFunc = nullptr; - mD3DDisassembleFunc = nullptr; - mInitialized = false; - } -} - -gl::Error HLSLCompiler::compileToBinary(gl::InfoLog &infoLog, const std::string &hlsl, const std::string &profile, - const std::vector<CompileConfig> &configs, const D3D_SHADER_MACRO *overrideMacros, - ID3DBlob **outCompiledBlob, std::string *outDebugInfo) -{ - ASSERT(mInitialized); - -#if !defined(ANGLE_ENABLE_WINDOWS_STORE) - ASSERT(mD3DCompilerModule); -#endif - ASSERT(mD3DCompileFunc); - -#if !defined(ANGLE_ENABLE_WINDOWS_STORE) - if (gl::DebugAnnotationsActive()) - { - std::string sourcePath = getTempPath(); - std::ostringstream stream; - stream << "#line 2 \"" << sourcePath << "\"\n\n" << hlsl; - std::string sourceText = stream.str(); - writeFile(sourcePath.c_str(), sourceText.c_str(), sourceText.size()); - } -#endif - - const D3D_SHADER_MACRO *macros = overrideMacros ? overrideMacros : nullptr; - - for (size_t i = 0; i < configs.size(); ++i) - { - ID3DBlob *errorMessage = nullptr; - ID3DBlob *binary = nullptr; - HRESULT result = S_OK; - - { - TRACE_EVENT0("gpu.angle", "D3DCompile"); - SCOPED_ANGLE_HISTOGRAM_TIMER("GPU.ANGLE.D3DCompileMS"); - result = mD3DCompileFunc(hlsl.c_str(), hlsl.length(), gl::g_fakepath, macros, nullptr, - "main", profile.c_str(), configs[i].flags, 0, &binary, - &errorMessage); - } - - if (errorMessage) - { - std::string message = reinterpret_cast<const char*>(errorMessage->GetBufferPointer()); - SafeRelease(errorMessage); - - infoLog.appendSanitized(message.c_str()); - - // This produces unbelievable amounts of spam in about:gpu. - // WARN() << std::endl << hlsl; - - WARN() << std::endl << message; - - if ((message.find("error X3531:") != std::string::npos || // "can't unroll loops marked with loop attribute" - message.find("error X4014:") != std::string::npos) && // "cannot have gradient operations inside loops with divergent flow control", - // even though it is counter-intuitive to disable unrolling for this error, - // some very long shaders have trouble deciding which loops to unroll and - // turning off forced unrolls allows them to compile properly. - macros != nullptr) - { - macros = nullptr; // Disable [loop] and [flatten] - - // Retry without changing compiler flags - i--; - continue; - } - } - - if (SUCCEEDED(result)) - { - *outCompiledBlob = binary; - - (*outDebugInfo) += "// COMPILER INPUT HLSL BEGIN\n\n" + hlsl + "\n// COMPILER INPUT HLSL END\n"; - -#if ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED - (*outDebugInfo) += "\n\n// ASSEMBLY BEGIN\n\n"; - (*outDebugInfo) += "// Compiler configuration: " + configs[i].name + "\n// Flags:\n"; - for (size_t fIx = 0; fIx < ArraySize(CompilerFlagInfos); ++fIx) - { - if (IsCompilerFlagSet(configs[i].flags, CompilerFlagInfos[fIx].mFlag)) - { - (*outDebugInfo) += std::string("// ") + CompilerFlagInfos[fIx].mName + "\n"; - } - } - - (*outDebugInfo) += "// Macros:\n"; - if (macros == nullptr) - { - (*outDebugInfo) += "// - : -\n"; - } - else - { - for (const D3D_SHADER_MACRO *mIt = macros; mIt->Name != nullptr; ++mIt) - { - (*outDebugInfo) += std::string("// ") + mIt->Name + " : " + mIt->Definition + "\n"; - } - } - - std::string disassembly; - ANGLE_TRY(disassembleBinary(binary, &disassembly)); - (*outDebugInfo) += "\n" + disassembly + "\n// ASSEMBLY END\n"; -#endif // ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED - return gl::NoError(); - } - - if (result == E_OUTOFMEMORY) - { - *outCompiledBlob = nullptr; - return gl::OutOfMemory() - << "HLSL compiler had an unexpected failure, " << gl::FmtHR(result); - } - - infoLog << "Warning: D3D shader compilation failed with " << configs[i].name << " flags. (" - << profile << ")"; - - if (i + 1 < configs.size()) - { - infoLog << " Retrying with " << configs[i + 1].name; - } - } - - // None of the configurations succeeded in compiling this shader but the compiler is still intact - *outCompiledBlob = nullptr; - return gl::NoError(); -} - -gl::Error HLSLCompiler::disassembleBinary(ID3DBlob *shaderBinary, std::string *disassemblyOut) -{ - ANGLE_TRY(ensureInitialized()); - - // Retrieve disassembly - UINT flags = D3D_DISASM_ENABLE_DEFAULT_VALUE_PRINTS | D3D_DISASM_ENABLE_INSTRUCTION_NUMBERING; - ID3DBlob *disassembly = nullptr; - pD3DDisassemble disassembleFunc = reinterpret_cast<pD3DDisassemble>(mD3DDisassembleFunc); - LPCVOID buffer = shaderBinary->GetBufferPointer(); - SIZE_T bufSize = shaderBinary->GetBufferSize(); - HRESULT result = disassembleFunc(buffer, bufSize, flags, "", &disassembly); - - if (SUCCEEDED(result)) - { - *disassemblyOut = std::string(reinterpret_cast<const char*>(disassembly->GetBufferPointer())); - } - else - { - *disassemblyOut = ""; - } - - SafeRelease(disassembly); - - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.h deleted file mode 100644 index c8f9eac290..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.h +++ /dev/null @@ -1,64 +0,0 @@ -// -// Copyright (c) 2016 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. -// -// HLSLCompiler: Wrapper for the D3DCompiler DLL. -// - -#ifndef LIBANGLE_RENDERER_D3D_HLSLCOMPILER_H_ -#define LIBANGLE_RENDERER_D3D_HLSLCOMPILER_H_ - -#include "libANGLE/Error.h" - -#include "common/angleutils.h" -#include "common/platform.h" - -#include <vector> -#include <string> - -namespace gl -{ -class InfoLog; -} - -namespace rx -{ - -struct CompileConfig -{ - UINT flags; - std::string name; - - CompileConfig(); - CompileConfig(UINT flags, const std::string &name); -}; - -class HLSLCompiler : angle::NonCopyable -{ - public: - HLSLCompiler(); - ~HLSLCompiler(); - - void release(); - - // Attempt to compile a HLSL shader using the supplied configurations, may output a NULL compiled blob - // even if no GL errors are returned. - gl::Error compileToBinary(gl::InfoLog &infoLog, const std::string &hlsl, const std::string &profile, - const std::vector<CompileConfig> &configs, const D3D_SHADER_MACRO *overrideMacros, - ID3DBlob **outCompiledBlob, std::string *outDebugInfo); - - gl::Error disassembleBinary(ID3DBlob *shaderBinary, std::string *disassemblyOut); - gl::Error ensureInitialized(); - - private: - - bool mInitialized; - HMODULE mD3DCompilerModule; - pD3DCompile mD3DCompileFunc; - pD3DDisassemble mD3DDisassembleFunc; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_HLSLCOMPILER_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.cpp deleted file mode 100644 index dbbcbbed2a..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// -// Copyright (c) 2002-2015 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. -// - -// Image.h: Implements the rx::Image class, an abstract base class for the -// renderer-specific classes which will define the interface to the underlying -// surfaces or resources. - -#include "libANGLE/renderer/d3d/ImageD3D.h" - -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/renderer/d3d/FramebufferD3D.h" -#include "libANGLE/renderer/d3d/RenderTargetD3D.h" - -namespace rx -{ - -ImageD3D::ImageD3D() - : mWidth(0), - mHeight(0), - mDepth(0), - mInternalFormat(GL_NONE), - mRenderable(false), - mTarget(GL_NONE), - mDirty(false) -{ -} - -gl::Error ImageD3D::setManagedSurface2D(const gl::Context *context, - TextureStorage *storage, - int level) -{ - return gl::NoError(); -} - -gl::Error ImageD3D::setManagedSurfaceCube(const gl::Context *context, - TextureStorage *storage, - int face, - int level) -{ - return gl::NoError(); -} - -gl::Error ImageD3D::setManagedSurface3D(const gl::Context *context, - TextureStorage *storage, - int level) -{ - return gl::NoError(); -} - -gl::Error ImageD3D::setManagedSurface2DArray(const gl::Context *context, - TextureStorage *storage, - int layer, - int level) -{ - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.h deleted file mode 100644 index 1b7235fbaa..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.h +++ /dev/null @@ -1,105 +0,0 @@ -// -// Copyright (c) 2002-2015 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. -// - -// ImageD3D.h: Defines the rx::ImageD3D class, an abstract base class for the -// renderer-specific classes which will define the interface to the underlying -// surfaces or resources. - -#ifndef LIBANGLE_RENDERER_D3D_IMAGED3D_H_ -#define LIBANGLE_RENDERER_D3D_IMAGED3D_H_ - -#include "common/debug.h" - -#include "libANGLE/Error.h" - -namespace gl -{ -class Context; -class Framebuffer; -struct ImageIndex; -struct Box; -struct Extents; -struct Offset; -struct Rectangle; -struct PixelUnpackState; -} - -namespace rx -{ -class TextureStorage; -class RendererD3D; -class RenderTargetD3D; - -class ImageD3D : angle::NonCopyable -{ - public: - ImageD3D(); - virtual ~ImageD3D() {}; - - GLsizei getWidth() const { return mWidth; } - GLsizei getHeight() const { return mHeight; } - GLsizei getDepth() const { return mDepth; } - GLenum getInternalFormat() const { return mInternalFormat; } - GLenum getTarget() const { return mTarget; } - bool isRenderableFormat() const { return mRenderable; } - - void markDirty() { mDirty = true; } - void markClean() { mDirty = false; } - virtual bool isDirty() const = 0; - - virtual bool redefine(GLenum target, GLenum internalformat, const gl::Extents &size, bool forceRelease) = 0; - - virtual gl::Error loadData(const gl::Context *context, - const gl::Box &area, - const gl::PixelUnpackState &unpack, - GLenum type, - const void *input, - bool applySkipImages) = 0; - virtual gl::Error loadCompressedData(const gl::Context *context, - const gl::Box &area, - const void *input) = 0; - - virtual gl::Error setManagedSurface2D(const gl::Context *context, - TextureStorage *storage, - int level); - virtual gl::Error setManagedSurfaceCube(const gl::Context *context, - TextureStorage *storage, - int face, - int level); - virtual gl::Error setManagedSurface3D(const gl::Context *context, - TextureStorage *storage, - int level); - virtual gl::Error setManagedSurface2DArray(const gl::Context *context, - TextureStorage *storage, - int layer, - int level); - virtual gl::Error copyToStorage(const gl::Context *context, - TextureStorage *storage, - const gl::ImageIndex &index, - const gl::Box ®ion) = 0; - - virtual gl::Error copyFromTexStorage(const gl::Context *context, - const gl::ImageIndex &imageIndex, - TextureStorage *source) = 0; - virtual gl::Error copyFromFramebuffer(const gl::Context *context, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) = 0; - - protected: - GLsizei mWidth; - GLsizei mHeight; - GLsizei mDepth; - GLenum mInternalFormat; - bool mRenderable; - GLenum mTarget; - - bool mDirty; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_IMAGED3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp deleted file mode 100644 index 937512a96a..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp +++ /dev/null @@ -1,189 +0,0 @@ -// -// Copyright (c) 2002-2012 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. -// - -// IndexBuffer.cpp: Defines the abstract IndexBuffer class and IndexBufferInterface -// class with derivations, classes that perform graphics API agnostic index buffer operations. - -#include "libANGLE/renderer/d3d/IndexBuffer.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" - -namespace rx -{ - -unsigned int IndexBuffer::mNextSerial = 1; - -IndexBuffer::IndexBuffer() -{ - updateSerial(); -} - -IndexBuffer::~IndexBuffer() -{ -} - -unsigned int IndexBuffer::getSerial() const -{ - return mSerial; -} - -void IndexBuffer::updateSerial() -{ - mSerial = mNextSerial++; -} - - -IndexBufferInterface::IndexBufferInterface(BufferFactoryD3D *factory, bool dynamic) -{ - mIndexBuffer = factory->createIndexBuffer(); - - mDynamic = dynamic; - mWritePosition = 0; -} - -IndexBufferInterface::~IndexBufferInterface() -{ - if (mIndexBuffer) - { - delete mIndexBuffer; - } -} - -GLenum IndexBufferInterface::getIndexType() const -{ - return mIndexBuffer->getIndexType(); -} - -unsigned int IndexBufferInterface::getBufferSize() const -{ - return mIndexBuffer->getBufferSize(); -} - -unsigned int IndexBufferInterface::getSerial() const -{ - return mIndexBuffer->getSerial(); -} - -gl::Error IndexBufferInterface::mapBuffer(unsigned int size, void **outMappedMemory, unsigned int *streamOffset) -{ - // Protect against integer overflow - if (mWritePosition + size < mWritePosition) - { - return gl::OutOfMemory() - << "Mapping of internal index buffer would cause an integer overflow."; - } - - gl::Error error = mIndexBuffer->mapBuffer(mWritePosition, size, outMappedMemory); - if (error.isError()) - { - if (outMappedMemory) - { - *outMappedMemory = nullptr; - } - return error; - } - - if (streamOffset) - { - *streamOffset = mWritePosition; - } - - mWritePosition += size; - return gl::NoError(); -} - -gl::Error IndexBufferInterface::unmapBuffer() -{ - return mIndexBuffer->unmapBuffer(); -} - -IndexBuffer * IndexBufferInterface::getIndexBuffer() const -{ - return mIndexBuffer; -} - -unsigned int IndexBufferInterface::getWritePosition() const -{ - return mWritePosition; -} - -void IndexBufferInterface::setWritePosition(unsigned int writePosition) -{ - mWritePosition = writePosition; -} - -gl::Error IndexBufferInterface::discard() -{ - return mIndexBuffer->discard(); -} - -gl::Error IndexBufferInterface::setBufferSize(unsigned int bufferSize, GLenum indexType) -{ - if (mIndexBuffer->getBufferSize() == 0) - { - return mIndexBuffer->initialize(bufferSize, indexType, mDynamic); - } - else - { - return mIndexBuffer->setSize(bufferSize, indexType); - } -} - -StreamingIndexBufferInterface::StreamingIndexBufferInterface(BufferFactoryD3D *factory) - : IndexBufferInterface(factory, true) -{ -} - -StreamingIndexBufferInterface::~StreamingIndexBufferInterface() -{ -} - -gl::Error StreamingIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType) -{ - unsigned int curBufferSize = getBufferSize(); - unsigned int writePos = getWritePosition(); - if (size > curBufferSize) - { - ANGLE_TRY(setBufferSize(std::max(size, 2 * curBufferSize), indexType)); - setWritePosition(0); - } - else if (writePos + size > curBufferSize || writePos + size < writePos) - { - ANGLE_TRY(discard()); - setWritePosition(0); - } - - return gl::NoError(); -} - - -StaticIndexBufferInterface::StaticIndexBufferInterface(BufferFactoryD3D *factory) - : IndexBufferInterface(factory, false) -{ -} - -StaticIndexBufferInterface::~StaticIndexBufferInterface() -{ -} - -gl::Error StaticIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType) -{ - unsigned int curSize = getBufferSize(); - if (curSize == 0) - { - return setBufferSize(size, indexType); - } - else if (curSize >= size && indexType == getIndexType()) - { - return gl::NoError(); - } - else - { - UNREACHABLE(); - return gl::InternalError() << "Internal static index buffers can't be resized"; - } -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.h deleted file mode 100644 index 969cf6ae63..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.h +++ /dev/null @@ -1,100 +0,0 @@ -// -// Copyright (c) 2002-2012 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. -// - -// IndexBuffer.h: Defines the abstract IndexBuffer class and IndexBufferInterface -// class with derivations, classes that perform graphics API agnostic index buffer operations. - -#ifndef LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_ -#define LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_ - -#include "common/angleutils.h" -#include "libANGLE/Error.h" - -namespace rx -{ -class BufferFactoryD3D; - -class IndexBuffer : angle::NonCopyable -{ - public: - IndexBuffer(); - virtual ~IndexBuffer(); - - virtual gl::Error initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) = 0; - - virtual gl::Error mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory) = 0; - virtual gl::Error unmapBuffer() = 0; - - virtual gl::Error discard() = 0; - - virtual GLenum getIndexType() const = 0; - virtual unsigned int getBufferSize() const = 0; - virtual gl::Error setSize(unsigned int bufferSize, GLenum indexType) = 0; - - unsigned int getSerial() const; - - protected: - void updateSerial(); - - private: - unsigned int mSerial; - static unsigned int mNextSerial; -}; - -class IndexBufferInterface : angle::NonCopyable -{ - public: - IndexBufferInterface(BufferFactoryD3D *factory, bool dynamic); - virtual ~IndexBufferInterface(); - - virtual gl::Error reserveBufferSpace(unsigned int size, GLenum indexType) = 0; - - GLenum getIndexType() const; - unsigned int getBufferSize() const; - - unsigned int getSerial() const; - - gl::Error mapBuffer(unsigned int size, void** outMappedMemory, unsigned int *streamOffset); - gl::Error unmapBuffer(); - - IndexBuffer *getIndexBuffer() const; - - protected: - unsigned int getWritePosition() const; - void setWritePosition(unsigned int writePosition); - - gl::Error discard(); - - gl::Error setBufferSize(unsigned int bufferSize, GLenum indexType); - - private: - IndexBuffer *mIndexBuffer; - - unsigned int mWritePosition; - bool mDynamic; -}; - -class StreamingIndexBufferInterface : public IndexBufferInterface -{ - public: - explicit StreamingIndexBufferInterface(BufferFactoryD3D *factory); - ~StreamingIndexBufferInterface() override; - - gl::Error reserveBufferSpace(unsigned int size, GLenum indexType) override; -}; - -class StaticIndexBufferInterface : public IndexBufferInterface -{ - public: - explicit StaticIndexBufferInterface(BufferFactoryD3D *factory); - ~StaticIndexBufferInterface() override; - - gl::Error reserveBufferSpace(unsigned int size, GLenum indexType) override; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp deleted file mode 100644 index e974097b45..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp +++ /dev/null @@ -1,320 +0,0 @@ -// -// Copyright (c) 2002-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. -// - -// IndexDataManager.cpp: Defines the IndexDataManager, a class that -// runs the Buffer translation process for index buffers. - -#include "libANGLE/renderer/d3d/IndexDataManager.h" - -#include "common/utilities.h" -#include "libANGLE/Buffer.h" -#include "libANGLE/Context.h" -#include "libANGLE/VertexArray.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/BufferD3D.h" -#include "libANGLE/renderer/d3d/IndexBuffer.h" - -namespace rx -{ - -namespace -{ - -template <typename InputT, typename DestT> -void ConvertIndexArray(const void *input, - GLenum sourceType, - void *output, - GLenum destinationType, - GLsizei count, - bool usePrimitiveRestartFixedIndex) -{ - const InputT *in = static_cast<const InputT *>(input); - DestT *out = static_cast<DestT *>(output); - - if (usePrimitiveRestartFixedIndex) - { - InputT srcRestartIndex = static_cast<InputT>(gl::GetPrimitiveRestartIndex(sourceType)); - DestT destRestartIndex = static_cast<DestT>(gl::GetPrimitiveRestartIndex(destinationType)); - for (GLsizei i = 0; i < count; i++) - { - out[i] = (in[i] == srcRestartIndex ? destRestartIndex : static_cast<DestT>(in[i])); - } - } - else - { - for (GLsizei i = 0; i < count; i++) - { - out[i] = static_cast<DestT>(in[i]); - } - } -} - -void ConvertIndices(GLenum sourceType, - GLenum destinationType, - const void *input, - GLsizei count, - void *output, - bool usePrimitiveRestartFixedIndex) -{ - if (sourceType == destinationType) - { - const gl::Type &typeInfo = gl::GetTypeInfo(destinationType); - memcpy(output, input, count * typeInfo.bytes); - return; - } - - if (sourceType == GL_UNSIGNED_BYTE) - { - ASSERT(destinationType == GL_UNSIGNED_SHORT); - ConvertIndexArray<GLubyte, GLushort>(input, sourceType, output, destinationType, count, - usePrimitiveRestartFixedIndex); - } - else if (sourceType == GL_UNSIGNED_SHORT) - { - ASSERT(destinationType == GL_UNSIGNED_INT); - ConvertIndexArray<GLushort, GLuint>(input, sourceType, output, destinationType, count, - usePrimitiveRestartFixedIndex); - } - else - UNREACHABLE(); -} - -gl::Error StreamInIndexBuffer(IndexBufferInterface *buffer, - const void *data, - unsigned int count, - GLenum srcType, - GLenum dstType, - bool usePrimitiveRestartFixedIndex, - unsigned int *offset) -{ - const gl::Type &dstTypeInfo = gl::GetTypeInfo(dstType); - - if (count > (std::numeric_limits<unsigned int>::max() >> dstTypeInfo.bytesShift)) - { - return gl::OutOfMemory() << "Reserving " << count << " indices of " << dstTypeInfo.bytes - << " bytes each exceeds the maximum buffer size."; - } - - unsigned int bufferSizeRequired = count << dstTypeInfo.bytesShift; - ANGLE_TRY(buffer->reserveBufferSpace(bufferSizeRequired, dstType)); - - void *output = nullptr; - ANGLE_TRY(buffer->mapBuffer(bufferSizeRequired, &output, offset)); - - ConvertIndices(srcType, dstType, data, count, output, usePrimitiveRestartFixedIndex); - - ANGLE_TRY(buffer->unmapBuffer()); - return gl::NoError(); -} - -unsigned int ElementTypeSize(GLenum elementType) -{ - switch (elementType) - { - case GL_UNSIGNED_BYTE: - return sizeof(GLubyte); - case GL_UNSIGNED_SHORT: - return sizeof(GLushort); - case GL_UNSIGNED_INT: - return sizeof(GLuint); - default: - UNREACHABLE(); - return 0; - } -} - -} // anonymous namespace - -bool IsOffsetAligned(GLenum elementType, unsigned int offset) -{ - return (offset % ElementTypeSize(elementType) == 0); -} - -// IndexDataManager implementation. -IndexDataManager::IndexDataManager(BufferFactoryD3D *factory) - : mFactory(factory), mStreamingBufferShort(), mStreamingBufferInt() -{ -} - -IndexDataManager::~IndexDataManager() -{ -} - -void IndexDataManager::deinitialize() -{ - mStreamingBufferShort.reset(); - mStreamingBufferInt.reset(); -} - -// This function translates a GL-style indices into DX-style indices, with their description -// returned in translated. -// GL can specify vertex data in immediate mode (pointer to CPU array of indices), which is not -// possible in DX and requires streaming (Case 1). If the GL indices are specified with a buffer -// (Case 2), in a format supported by DX (subcase a) then all is good. -// When we have a buffer with an unsupported format (subcase b) then we need to do some translation: -// we will start by falling back to streaming, and after a while will start using a static -// translated copy of the index buffer. -gl::Error IndexDataManager::prepareIndexData(const gl::Context *context, - GLenum srcType, - GLenum dstType, - GLsizei count, - gl::Buffer *glBuffer, - const void *indices, - TranslatedIndexData *translated) -{ - const gl::Type &srcTypeInfo = gl::GetTypeInfo(srcType); - const gl::Type &dstTypeInfo = gl::GetTypeInfo(dstType); - - BufferD3D *buffer = glBuffer ? GetImplAs<BufferD3D>(glBuffer) : nullptr; - - translated->indexType = dstType; - translated->srcIndexData.srcBuffer = buffer; - translated->srcIndexData.srcIndices = indices; - translated->srcIndexData.srcIndexType = srcType; - translated->srcIndexData.srcCount = count; - - // Context can be nullptr in perf tests. - bool primitiveRestartFixedIndexEnabled = - context ? context->getGLState().isPrimitiveRestartEnabled() : false; - - // Case 1: the indices are passed by pointer, which forces the streaming of index data - if (glBuffer == nullptr) - { - translated->storage = nullptr; - return streamIndexData(indices, count, srcType, dstType, primitiveRestartFixedIndexEnabled, - translated); - } - - // Case 2: the indices are already in a buffer - unsigned int offset = static_cast<unsigned int>(reinterpret_cast<uintptr_t>(indices)); - ASSERT(srcTypeInfo.bytes * static_cast<unsigned int>(count) + offset <= buffer->getSize()); - - bool offsetAligned = IsOffsetAligned(srcType, offset); - - // Case 2a: the buffer can be used directly - if (offsetAligned && buffer->supportsDirectBinding() && dstType == srcType) - { - translated->storage = buffer; - translated->indexBuffer = nullptr; - translated->serial = buffer->getSerial(); - translated->startIndex = (offset >> srcTypeInfo.bytesShift); - translated->startOffset = offset; - return gl::NoError(); - } - - translated->storage = nullptr; - - // Case 2b: use a static translated copy or fall back to streaming - StaticIndexBufferInterface *staticBuffer = buffer->getStaticIndexBuffer(); - - bool staticBufferInitialized = staticBuffer && staticBuffer->getBufferSize() != 0; - bool staticBufferUsable = - staticBuffer && offsetAligned && staticBuffer->getIndexType() == dstType; - - if (staticBufferInitialized && !staticBufferUsable) - { - buffer->invalidateStaticData(context); - staticBuffer = nullptr; - } - - if (staticBuffer == nullptr || !offsetAligned) - { - const uint8_t *bufferData = nullptr; - ANGLE_TRY(buffer->getData(context, &bufferData)); - ASSERT(bufferData != nullptr); - - ANGLE_TRY(streamIndexData(bufferData + offset, count, srcType, dstType, - primitiveRestartFixedIndexEnabled, translated)); - buffer->promoteStaticUsage(context, count << srcTypeInfo.bytesShift); - } - else - { - if (!staticBufferInitialized) - { - const uint8_t *bufferData = nullptr; - ANGLE_TRY(buffer->getData(context, &bufferData)); - ASSERT(bufferData != nullptr); - - unsigned int convertCount = - static_cast<unsigned int>(buffer->getSize()) >> srcTypeInfo.bytesShift; - ANGLE_TRY(StreamInIndexBuffer(staticBuffer, bufferData, convertCount, srcType, dstType, - primitiveRestartFixedIndexEnabled, nullptr)); - } - ASSERT(offsetAligned && staticBuffer->getIndexType() == dstType); - - translated->indexBuffer = staticBuffer->getIndexBuffer(); - translated->serial = staticBuffer->getSerial(); - translated->startIndex = (offset >> srcTypeInfo.bytesShift); - translated->startOffset = (offset >> srcTypeInfo.bytesShift) << dstTypeInfo.bytesShift; - } - - return gl::NoError(); -} - -gl::Error IndexDataManager::streamIndexData(const void *data, - unsigned int count, - GLenum srcType, - GLenum dstType, - bool usePrimitiveRestartFixedIndex, - TranslatedIndexData *translated) -{ - const gl::Type &dstTypeInfo = gl::GetTypeInfo(dstType); - - IndexBufferInterface *indexBuffer = nullptr; - ANGLE_TRY(getStreamingIndexBuffer(dstType, &indexBuffer)); - ASSERT(indexBuffer != nullptr); - - unsigned int offset; - ANGLE_TRY(StreamInIndexBuffer(indexBuffer, data, count, srcType, dstType, - usePrimitiveRestartFixedIndex, &offset)); - - translated->indexBuffer = indexBuffer->getIndexBuffer(); - translated->serial = indexBuffer->getSerial(); - translated->startIndex = (offset >> dstTypeInfo.bytesShift); - translated->startOffset = offset; - - return gl::NoError(); -} - -gl::Error IndexDataManager::getStreamingIndexBuffer(GLenum destinationIndexType, - IndexBufferInterface **outBuffer) -{ - ASSERT(outBuffer); - ASSERT(destinationIndexType == GL_UNSIGNED_SHORT || destinationIndexType == GL_UNSIGNED_INT); - - auto &streamingBuffer = - (destinationIndexType == GL_UNSIGNED_INT) ? mStreamingBufferInt : mStreamingBufferShort; - - if (!streamingBuffer) - { - StreamingBuffer newBuffer(new StreamingIndexBufferInterface(mFactory)); - ANGLE_TRY(newBuffer->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, destinationIndexType)); - streamingBuffer = std::move(newBuffer); - } - - *outBuffer = streamingBuffer.get(); - return gl::NoError(); -} - -GLenum GetIndexTranslationDestType(GLenum srcType, - const gl::HasIndexRange &lazyIndexRange, - bool usePrimitiveRestartWorkaround) -{ - // Avoid D3D11's primitive restart index value - // see http://msdn.microsoft.com/en-us/library/windows/desktop/bb205124(v=vs.85).aspx - if (usePrimitiveRestartWorkaround) - { - const gl::IndexRange &indexRange = lazyIndexRange.getIndexRange().value(); - if (indexRange.end == gl::GetPrimitiveRestartIndex(srcType)) - { - return GL_UNSIGNED_INT; - } - } - - return (srcType == GL_UNSIGNED_INT) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.h deleted file mode 100644 index 77f05df92d..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.h +++ /dev/null @@ -1,105 +0,0 @@ -// -// Copyright (c) 2002-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. -// - -// IndexDataManager.h: Defines the IndexDataManager, a class that -// runs the Buffer translation process for index buffers. - -#ifndef LIBANGLE_INDEXDATAMANAGER_H_ -#define LIBANGLE_INDEXDATAMANAGER_H_ - -#include <GLES2/gl2.h> - -#include "common/angleutils.h" -#include "common/mathutil.h" -#include "libANGLE/Error.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" - -namespace -{ -enum -{ - INITIAL_INDEX_BUFFER_SIZE = 4096 * sizeof(GLuint) -}; -} - -namespace gl -{ -class Buffer; -} - -namespace rx -{ -class IndexBufferInterface; -class StaticIndexBufferInterface; -class StreamingIndexBufferInterface; -class IndexBuffer; -class BufferD3D; -class RendererD3D; - -struct SourceIndexData -{ - BufferD3D *srcBuffer; - const void *srcIndices; - unsigned int srcCount; - GLenum srcIndexType; - bool srcIndicesChanged; -}; - -struct TranslatedIndexData -{ - unsigned int startIndex; - unsigned int startOffset; // In bytes - - IndexBuffer *indexBuffer; - BufferD3D *storage; - GLenum indexType; - unsigned int serial; - - SourceIndexData srcIndexData; -}; - -class IndexDataManager : angle::NonCopyable -{ - public: - explicit IndexDataManager(BufferFactoryD3D *factory); - virtual ~IndexDataManager(); - - void deinitialize(); - - gl::Error prepareIndexData(const gl::Context *context, - GLenum srcType, - GLenum dstType, - GLsizei count, - gl::Buffer *glBuffer, - const void *indices, - TranslatedIndexData *translated); - - private: - gl::Error streamIndexData(const void *data, - unsigned int count, - GLenum srcType, - GLenum dstType, - bool usePrimitiveRestartFixedIndex, - TranslatedIndexData *translated); - gl::Error getStreamingIndexBuffer(GLenum destinationIndexType, - IndexBufferInterface **outBuffer); - - using StreamingBuffer = std::unique_ptr<StreamingIndexBufferInterface>; - - BufferFactoryD3D *const mFactory; - std::unique_ptr<StreamingIndexBufferInterface> mStreamingBufferShort; - std::unique_ptr<StreamingIndexBufferInterface> mStreamingBufferInt; -}; - -GLenum GetIndexTranslationDestType(GLenum srcType, - const gl::HasIndexRange &lazyIndexRange, - bool usePrimitiveRestartWorkaround); - -bool IsOffsetAligned(GLenum elementType, unsigned int offset); - -} // namespace rx - -#endif // LIBANGLE_INDEXDATAMANAGER_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.cpp deleted file mode 100644 index 113bad647c..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// NativeWindowD3D.cpp: Defines NativeWindowD3D, a class for managing and performing operations on -// an EGLNativeWindowType for the D3D renderers. - -#include "libANGLE/renderer/d3d/NativeWindowD3D.h" - -namespace rx -{ - -NativeWindowD3D::NativeWindowD3D(EGLNativeWindowType window) : mWindow(window) -{ -} - -NativeWindowD3D::~NativeWindowD3D() -{ -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.h deleted file mode 100644 index 365448488d..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// NativeWindowD3D.h: Defines NativeWindowD3D, a class for managing and performing operations on an -// EGLNativeWindowType for the D3D renderers. - -#ifndef LIBANGLE_RENDERER_D3D_NATIVEWINDOWD3D_H_ -#define LIBANGLE_RENDERER_D3D_NATIVEWINDOWD3D_H_ - -#include "common/debug.h" -#include "common/platform.h" - -#include <EGL/eglplatform.h> -#include "libANGLE/Config.h" - -namespace rx -{ -class NativeWindowD3D : angle::NonCopyable -{ - public: - NativeWindowD3D(EGLNativeWindowType window); - virtual ~NativeWindowD3D(); - - virtual bool initialize() = 0; - virtual bool getClientRect(LPRECT rect) const = 0; - virtual bool isIconic() const = 0; - - inline EGLNativeWindowType getNativeWindow() const { return mWindow; } - - private: - EGLNativeWindowType mWindow; -}; -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_NATIVEWINDOWD3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp deleted file mode 100644 index afc318d9fa..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp +++ /dev/null @@ -1,2867 +0,0 @@ -// -// Copyright (c) 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. -// - -// ProgramD3D.cpp: Defines the rx::ProgramD3D class which implements rx::ProgramImpl. - -#include "libANGLE/renderer/d3d/ProgramD3D.h" - -#include "common/bitset_utils.h" -#include "common/string_utils.h" -#include "common/utilities.h" -#include "libANGLE/Context.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/Program.h" -#include "libANGLE/ProgramLinkedResources.h" -#include "libANGLE/Uniform.h" -#include "libANGLE/VertexArray.h" -#include "libANGLE/features.h" -#include "libANGLE/queryconversions.h" -#include "libANGLE/renderer/ContextImpl.h" -#include "libANGLE/renderer/d3d/DynamicHLSL.h" -#include "libANGLE/renderer/d3d/FramebufferD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/ShaderD3D.h" -#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h" -#include "libANGLE/renderer/d3d/VertexDataManager.h" - -using namespace angle; - -namespace rx -{ - -namespace -{ - -void GetDefaultInputLayoutFromShader(const gl::Context *context, - gl::Shader *vertexShader, - gl::InputLayout *inputLayoutOut) -{ - inputLayoutOut->clear(); - - for (const sh::Attribute &shaderAttr : vertexShader->getActiveAttributes(context)) - { - if (shaderAttr.type != GL_NONE) - { - GLenum transposedType = gl::TransposeMatrixType(shaderAttr.type); - - for (size_t rowIndex = 0; - static_cast<int>(rowIndex) < gl::VariableRowCount(transposedType); ++rowIndex) - { - GLenum componentType = gl::VariableComponentType(transposedType); - GLuint components = static_cast<GLuint>(gl::VariableColumnCount(transposedType)); - bool pureInt = (componentType != GL_FLOAT); - gl::VertexFormatType defaultType = - gl::GetVertexFormatType(componentType, GL_FALSE, components, pureInt); - - inputLayoutOut->push_back(defaultType); - } - } - } -} - -void GetDefaultOutputLayoutFromShader( - const std::vector<PixelShaderOutputVariable> &shaderOutputVars, - std::vector<GLenum> *outputLayoutOut) -{ - outputLayoutOut->clear(); - - if (!shaderOutputVars.empty()) - { - outputLayoutOut->push_back(GL_COLOR_ATTACHMENT0 + - static_cast<unsigned int>(shaderOutputVars[0].outputIndex)); - } -} - -template <typename T, int cols, int rows> -bool TransposeExpandMatrix(T *target, const GLfloat *value) -{ - constexpr int targetWidth = 4; - constexpr int targetHeight = rows; - constexpr int srcWidth = rows; - constexpr int srcHeight = cols; - - constexpr int copyWidth = std::min(targetHeight, srcWidth); - constexpr int copyHeight = std::min(targetWidth, srcHeight); - - T staging[targetWidth * targetHeight] = {0}; - - for (int x = 0; x < copyWidth; x++) - { - for (int y = 0; y < copyHeight; y++) - { - staging[x * targetWidth + y] = static_cast<T>(value[y * srcWidth + x]); - } - } - - if (memcmp(target, staging, targetWidth * targetHeight * sizeof(T)) == 0) - { - return false; - } - - memcpy(target, staging, targetWidth * targetHeight * sizeof(T)); - return true; -} - -template <typename T, int cols, int rows> -bool ExpandMatrix(T *target, const GLfloat *value) -{ - constexpr int targetWidth = 4; - constexpr int targetHeight = rows; - constexpr int srcWidth = cols; - constexpr int srcHeight = rows; - - constexpr int copyWidth = std::min(targetWidth, srcWidth); - constexpr int copyHeight = std::min(targetHeight, srcHeight); - - T staging[targetWidth * targetHeight] = {0}; - - for (int y = 0; y < copyHeight; y++) - { - for (int x = 0; x < copyWidth; x++) - { - staging[y * targetWidth + x] = static_cast<T>(value[y * srcWidth + x]); - } - } - - if (memcmp(target, staging, targetWidth * targetHeight * sizeof(T)) == 0) - { - return false; - } - - memcpy(target, staging, targetWidth * targetHeight * sizeof(T)); - return true; -} - -gl::PrimitiveType GetGeometryShaderTypeFromDrawMode(GLenum drawMode) -{ - switch (drawMode) - { - // Uses the point sprite geometry shader. - case GL_POINTS: - return gl::PRIMITIVE_POINTS; - - // All line drawing uses the same geometry shader. - case GL_LINES: - case GL_LINE_STRIP: - case GL_LINE_LOOP: - return gl::PRIMITIVE_LINES; - - // The triangle fan primitive is emulated with strips in D3D11. - case GL_TRIANGLES: - case GL_TRIANGLE_FAN: - return gl::PRIMITIVE_TRIANGLES; - - // Special case for triangle strips. - case GL_TRIANGLE_STRIP: - return gl::PRIMITIVE_TRIANGLE_STRIP; - - default: - UNREACHABLE(); - return gl::PRIMITIVE_TYPE_MAX; - } -} - -bool FindFlatInterpolationVarying(const std::vector<sh::Varying> &varyings) -{ - // Note: this assumes nested structs can only be packed with one interpolation. - for (const auto &varying : varyings) - { - if (varying.interpolation == sh::INTERPOLATION_FLAT) - { - return true; - } - } - - return false; -} - -// Helper method to de-tranpose a matrix uniform for an API query. -void GetMatrixUniform(GLint columns, GLint rows, GLfloat *dataOut, const GLfloat *source) -{ - for (GLint col = 0; col < columns; ++col) - { - for (GLint row = 0; row < rows; ++row) - { - GLfloat *outptr = dataOut + ((col * rows) + row); - const GLfloat *inptr = source + ((row * 4) + col); - *outptr = *inptr; - } - } -} - -template <typename NonFloatT> -void GetMatrixUniform(GLint columns, GLint rows, NonFloatT *dataOut, const NonFloatT *source) -{ - UNREACHABLE(); -} - -class UniformBlockInfo final : angle::NonCopyable -{ - public: - UniformBlockInfo() {} - - void getShaderBlockInfo(const gl::Context *context, gl::Shader *shader); - - bool getBlockSize(const std::string &name, const std::string &mappedName, size_t *sizeOut); - bool getBlockMemberInfo(const std::string &name, - const std::string &mappedName, - sh::BlockMemberInfo *infoOut); - - private: - size_t getBlockInfo(const sh::InterfaceBlock &interfaceBlock); - - std::map<std::string, size_t> mBlockSizes; - sh::BlockLayoutMap mBlockLayout; -}; - -void UniformBlockInfo::getShaderBlockInfo(const gl::Context *context, gl::Shader *shader) -{ - for (const sh::InterfaceBlock &interfaceBlock : shader->getUniformBlocks(context)) - { - if (!interfaceBlock.staticUse && interfaceBlock.layout == sh::BLOCKLAYOUT_PACKED) - continue; - - if (mBlockSizes.count(interfaceBlock.name) > 0) - continue; - - size_t dataSize = getBlockInfo(interfaceBlock); - mBlockSizes[interfaceBlock.name] = dataSize; - } -} - -size_t UniformBlockInfo::getBlockInfo(const sh::InterfaceBlock &interfaceBlock) -{ - ASSERT(interfaceBlock.staticUse || interfaceBlock.layout != sh::BLOCKLAYOUT_PACKED); - - // define member uniforms - sh::Std140BlockEncoder std140Encoder; - sh::HLSLBlockEncoder hlslEncoder(sh::HLSLBlockEncoder::ENCODE_PACKED, false); - sh::BlockLayoutEncoder *encoder = nullptr; - - if (interfaceBlock.layout == sh::BLOCKLAYOUT_STD140) - { - encoder = &std140Encoder; - } - else - { - encoder = &hlslEncoder; - } - - sh::GetUniformBlockInfo(interfaceBlock.fields, interfaceBlock.fieldPrefix(), encoder, - interfaceBlock.isRowMajorLayout, &mBlockLayout); - - return encoder->getBlockSize(); -} - -bool UniformBlockInfo::getBlockSize(const std::string &name, - const std::string &mappedName, - size_t *sizeOut) -{ - size_t nameLengthWithoutArrayIndex; - gl::ParseArrayIndex(name, &nameLengthWithoutArrayIndex); - std::string baseName = name.substr(0u, nameLengthWithoutArrayIndex); - auto sizeIter = mBlockSizes.find(baseName); - if (sizeIter == mBlockSizes.end()) - { - *sizeOut = 0; - return false; - } - - *sizeOut = sizeIter->second; - return true; -}; - -bool UniformBlockInfo::getBlockMemberInfo(const std::string &name, - const std::string &mappedName, - sh::BlockMemberInfo *infoOut) -{ - auto infoIter = mBlockLayout.find(name); - if (infoIter == mBlockLayout.end()) - { - *infoOut = sh::BlockMemberInfo::getDefaultBlockInfo(); - return false; - } - - *infoOut = infoIter->second; - return true; -}; - -} // anonymous namespace - -// D3DUniform Implementation - -D3DUniform::D3DUniform(GLenum type, - const std::string &nameIn, - const std::vector<unsigned int> &arraySizesIn, - bool defaultBlock) - : typeInfo(gl::GetUniformTypeInfo(type)), - name(nameIn), - arraySizes(arraySizesIn), - vsData(nullptr), - psData(nullptr), - csData(nullptr), - vsRegisterIndex(GL_INVALID_INDEX), - psRegisterIndex(GL_INVALID_INDEX), - csRegisterIndex(GL_INVALID_INDEX), - registerCount(0), - registerElement(0) -{ - // We use data storage for default block uniforms to cache values that are sent to D3D during - // rendering - // Uniform blocks/buffers are treated separately by the Renderer (ES3 path only) - if (defaultBlock) - { - // Use the row count as register count, will work for non-square matrices. - registerCount = typeInfo.rowCount * getArraySizeProduct(); - } -} - -D3DUniform::~D3DUniform() -{ -} - -unsigned int D3DUniform::getArraySizeProduct() const -{ - return gl::ArraySizeProduct(arraySizes); -} - -const uint8_t *D3DUniform::getDataPtrToElement(size_t elementIndex) const -{ - ASSERT((!isArray() && elementIndex == 0) || - (isArray() && elementIndex < getArraySizeProduct())); - - if (isSampler()) - { - return reinterpret_cast<const uint8_t *>(&mSamplerData[elementIndex]); - } - - return firstNonNullData() + (elementIndex > 0 ? (typeInfo.internalSize * elementIndex) : 0u); -} - -bool D3DUniform::isSampler() const -{ - return typeInfo.isSampler; -} - -bool D3DUniform::isReferencedByVertexShader() const -{ - return vsRegisterIndex != GL_INVALID_INDEX; -} - -bool D3DUniform::isReferencedByFragmentShader() const -{ - return psRegisterIndex != GL_INVALID_INDEX; -} - -bool D3DUniform::isReferencedByComputeShader() const -{ - return csRegisterIndex != GL_INVALID_INDEX; -} - -const uint8_t *D3DUniform::firstNonNullData() const -{ - ASSERT(vsData || psData || csData || !mSamplerData.empty()); - - if (!mSamplerData.empty()) - { - return reinterpret_cast<const uint8_t *>(mSamplerData.data()); - } - - return vsData ? vsData : (psData ? psData : csData); -} - -// D3DVarying Implementation - -D3DVarying::D3DVarying() : semanticIndex(0), componentCount(0), outputSlot(0) -{ -} - -D3DVarying::D3DVarying(const std::string &semanticNameIn, - unsigned int semanticIndexIn, - unsigned int componentCountIn, - unsigned int outputSlotIn) - : semanticName(semanticNameIn), - semanticIndex(semanticIndexIn), - componentCount(componentCountIn), - outputSlot(outputSlotIn) -{ -} - -// ProgramD3DMetadata Implementation - -ProgramD3DMetadata::ProgramD3DMetadata(RendererD3D *renderer, - const ShaderD3D *vertexShader, - const ShaderD3D *fragmentShader) - : mRendererMajorShaderModel(renderer->getMajorShaderModel()), - mShaderModelSuffix(renderer->getShaderModelSuffix()), - mUsesInstancedPointSpriteEmulation( - renderer->getWorkarounds().useInstancedPointSpriteEmulation), - mUsesViewScale(renderer->presentPathFastEnabled()), - mHasANGLEMultiviewEnabled(vertexShader->hasANGLEMultiviewEnabled()), - mUsesViewID(fragmentShader->usesViewID()), - mCanSelectViewInVertexShader(renderer->canSelectViewInVertexShader()), - mVertexShader(vertexShader), - mFragmentShader(fragmentShader) -{ -} - -int ProgramD3DMetadata::getRendererMajorShaderModel() const -{ - return mRendererMajorShaderModel; -} - -bool ProgramD3DMetadata::usesBroadcast(const gl::ContextState &data) const -{ - return (mFragmentShader->usesFragColor() && mFragmentShader->usesMultipleRenderTargets() && - data.getClientMajorVersion() < 3); -} - -bool ProgramD3DMetadata::usesFragDepth() const -{ - return mFragmentShader->usesFragDepth(); -} - -bool ProgramD3DMetadata::usesPointCoord() const -{ - return mFragmentShader->usesPointCoord(); -} - -bool ProgramD3DMetadata::usesFragCoord() const -{ - return mFragmentShader->usesFragCoord(); -} - -bool ProgramD3DMetadata::usesPointSize() const -{ - return mVertexShader->usesPointSize(); -} - -bool ProgramD3DMetadata::usesInsertedPointCoordValue() const -{ - return (!usesPointSize() || !mUsesInstancedPointSpriteEmulation) && usesPointCoord() && - mRendererMajorShaderModel >= 4; -} - -bool ProgramD3DMetadata::usesViewScale() const -{ - return mUsesViewScale; -} - -bool ProgramD3DMetadata::hasANGLEMultiviewEnabled() const -{ - return mHasANGLEMultiviewEnabled; -} - -bool ProgramD3DMetadata::usesViewID() const -{ - return mUsesViewID; -} - -bool ProgramD3DMetadata::canSelectViewInVertexShader() const -{ - return mCanSelectViewInVertexShader; -} - -bool ProgramD3DMetadata::addsPointCoordToVertexShader() const -{ - // PointSprite emulation requiress that gl_PointCoord is present in the vertex shader - // VS_OUTPUT structure to ensure compatibility with the generated PS_INPUT of the pixel shader. - // Even with a geometry shader, the app can render triangles or lines and reference - // gl_PointCoord in the fragment shader, requiring us to provide a dummy value. For - // simplicity, we always add this to the vertex shader when the fragment shader - // references gl_PointCoord, even if we could skip it in the geometry shader. - return (mUsesInstancedPointSpriteEmulation && usesPointCoord()) || - usesInsertedPointCoordValue(); -} - -bool ProgramD3DMetadata::usesTransformFeedbackGLPosition() const -{ - // gl_Position only needs to be outputted from the vertex shader if transform feedback is - // active. This isn't supported on D3D11 Feature Level 9_3, so we don't output gl_Position from - // the vertex shader in this case. This saves us 1 output vector. - return !(mRendererMajorShaderModel >= 4 && mShaderModelSuffix != ""); -} - -bool ProgramD3DMetadata::usesSystemValuePointSize() const -{ - return !mUsesInstancedPointSpriteEmulation && usesPointSize(); -} - -bool ProgramD3DMetadata::usesMultipleFragmentOuts() const -{ - return mFragmentShader->usesMultipleRenderTargets(); -} - -GLint ProgramD3DMetadata::getMajorShaderVersion() const -{ - return mVertexShader->getData().getShaderVersion(); -} - -const ShaderD3D *ProgramD3DMetadata::getFragmentShader() const -{ - return mFragmentShader; -} - -// ProgramD3D Implementation - -ProgramD3D::VertexExecutable::VertexExecutable(const gl::InputLayout &inputLayout, - const Signature &signature, - ShaderExecutableD3D *shaderExecutable) - : mInputs(inputLayout), mSignature(signature), mShaderExecutable(shaderExecutable) -{ -} - -ProgramD3D::VertexExecutable::~VertexExecutable() -{ - SafeDelete(mShaderExecutable); -} - -// static -ProgramD3D::VertexExecutable::HLSLAttribType ProgramD3D::VertexExecutable::GetAttribType( - GLenum type) -{ - switch (type) - { - case GL_INT: - return HLSLAttribType::SIGNED_INT; - case GL_UNSIGNED_INT: - return HLSLAttribType::UNSIGNED_INT; - case GL_SIGNED_NORMALIZED: - case GL_UNSIGNED_NORMALIZED: - case GL_FLOAT: - return HLSLAttribType::FLOAT; - default: - UNREACHABLE(); - return HLSLAttribType::FLOAT; - } -} - -// static -void ProgramD3D::VertexExecutable::getSignature(RendererD3D *renderer, - const gl::InputLayout &inputLayout, - Signature *signatureOut) -{ - signatureOut->assign(inputLayout.size(), HLSLAttribType::FLOAT); - - for (size_t index = 0; index < inputLayout.size(); ++index) - { - gl::VertexFormatType vertexFormatType = inputLayout[index]; - if (vertexFormatType == gl::VERTEX_FORMAT_INVALID) - continue; - - VertexConversionType conversionType = renderer->getVertexConversionType(vertexFormatType); - if ((conversionType & VERTEX_CONVERT_GPU) == 0) - continue; - - GLenum componentType = renderer->getVertexComponentType(vertexFormatType); - (*signatureOut)[index] = GetAttribType(componentType); - } -} - -bool ProgramD3D::VertexExecutable::matchesSignature(const Signature &signature) const -{ - size_t limit = std::max(mSignature.size(), signature.size()); - for (size_t index = 0; index < limit; ++index) - { - // treat undefined indexes as FLOAT - auto a = index < signature.size() ? signature[index] : HLSLAttribType::FLOAT; - auto b = index < mSignature.size() ? mSignature[index] : HLSLAttribType::FLOAT; - if (a != b) - return false; - } - - return true; -} - -ProgramD3D::PixelExecutable::PixelExecutable(const std::vector<GLenum> &outputSignature, - ShaderExecutableD3D *shaderExecutable) - : mOutputSignature(outputSignature), mShaderExecutable(shaderExecutable) -{ -} - -ProgramD3D::PixelExecutable::~PixelExecutable() -{ - SafeDelete(mShaderExecutable); -} - -ProgramD3D::Sampler::Sampler() : active(false), logicalTextureUnit(0), textureType(GL_TEXTURE_2D) -{ -} - -unsigned int ProgramD3D::mCurrentSerial = 1; - -ProgramD3D::ProgramD3D(const gl::ProgramState &state, RendererD3D *renderer) - : ProgramImpl(state), - mRenderer(renderer), - mDynamicHLSL(nullptr), - mGeometryExecutables(gl::PRIMITIVE_TYPE_MAX), - mComputeExecutable(nullptr), - mUsesPointSize(false), - mUsesFlatInterpolation(false), - mVertexUniformStorage(nullptr), - mFragmentUniformStorage(nullptr), - mComputeUniformStorage(nullptr), - mUsedVertexSamplerRange(0), - mUsedPixelSamplerRange(0), - mUsedComputeSamplerRange(0), - mDirtySamplerMapping(true), - mSerial(issueSerial()), - mVertexUniformsDirty(true), - mFragmentUniformsDirty(true), - mComputeUniformsDirty(true) -{ - mDynamicHLSL = new DynamicHLSL(renderer); -} - -ProgramD3D::~ProgramD3D() -{ - reset(); - SafeDelete(mDynamicHLSL); -} - -bool ProgramD3D::usesPointSpriteEmulation() const -{ - return mUsesPointSize && mRenderer->getMajorShaderModel() >= 4; -} - -bool ProgramD3D::usesGeometryShaderForPointSpriteEmulation() const -{ - return usesPointSpriteEmulation() && !usesInstancedPointSpriteEmulation(); -} - -bool ProgramD3D::usesGeometryShader(GLenum drawMode) const -{ - if (mHasANGLEMultiviewEnabled && !mRenderer->canSelectViewInVertexShader()) - { - return true; - } - if (drawMode != GL_POINTS) - { - return mUsesFlatInterpolation; - } - return usesGeometryShaderForPointSpriteEmulation(); -} - -bool ProgramD3D::usesInstancedPointSpriteEmulation() const -{ - return mRenderer->getWorkarounds().useInstancedPointSpriteEmulation; -} - -GLint ProgramD3D::getSamplerMapping(gl::SamplerType type, - unsigned int samplerIndex, - const gl::Caps &caps) const -{ - GLint logicalTextureUnit = -1; - - switch (type) - { - case gl::SAMPLER_PIXEL: - ASSERT(samplerIndex < caps.maxTextureImageUnits); - if (samplerIndex < mSamplersPS.size() && mSamplersPS[samplerIndex].active) - { - logicalTextureUnit = mSamplersPS[samplerIndex].logicalTextureUnit; - } - break; - case gl::SAMPLER_VERTEX: - ASSERT(samplerIndex < caps.maxVertexTextureImageUnits); - if (samplerIndex < mSamplersVS.size() && mSamplersVS[samplerIndex].active) - { - logicalTextureUnit = mSamplersVS[samplerIndex].logicalTextureUnit; - } - break; - case gl::SAMPLER_COMPUTE: - ASSERT(samplerIndex < caps.maxComputeTextureImageUnits); - if (samplerIndex < mSamplersCS.size() && mSamplersCS[samplerIndex].active) - { - logicalTextureUnit = mSamplersCS[samplerIndex].logicalTextureUnit; - } - break; - default: - UNREACHABLE(); - } - - if (logicalTextureUnit >= 0 && - logicalTextureUnit < static_cast<GLint>(caps.maxCombinedTextureImageUnits)) - { - return logicalTextureUnit; - } - - return -1; -} - -// Returns the texture type for a given Direct3D 9 sampler type and -// index (0-15 for the pixel shader and 0-3 for the vertex shader). -GLenum ProgramD3D::getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const -{ - switch (type) - { - case gl::SAMPLER_PIXEL: - ASSERT(samplerIndex < mSamplersPS.size()); - ASSERT(mSamplersPS[samplerIndex].active); - return mSamplersPS[samplerIndex].textureType; - case gl::SAMPLER_VERTEX: - ASSERT(samplerIndex < mSamplersVS.size()); - ASSERT(mSamplersVS[samplerIndex].active); - return mSamplersVS[samplerIndex].textureType; - case gl::SAMPLER_COMPUTE: - ASSERT(samplerIndex < mSamplersCS.size()); - ASSERT(mSamplersCS[samplerIndex].active); - return mSamplersCS[samplerIndex].textureType; - default: - UNREACHABLE(); - } - - return GL_TEXTURE_2D; -} - -GLuint ProgramD3D::getUsedSamplerRange(gl::SamplerType type) const -{ - switch (type) - { - case gl::SAMPLER_PIXEL: - return mUsedPixelSamplerRange; - case gl::SAMPLER_VERTEX: - return mUsedVertexSamplerRange; - case gl::SAMPLER_COMPUTE: - return mUsedComputeSamplerRange; - default: - UNREACHABLE(); - return 0u; - } -} - -ProgramD3D::SamplerMapping ProgramD3D::updateSamplerMapping() -{ - if (!mDirtySamplerMapping) - { - return SamplerMapping::WasClean; - } - - mDirtySamplerMapping = false; - - // Retrieve sampler uniform values - for (const D3DUniform *d3dUniform : mD3DUniforms) - { - if (!d3dUniform->isSampler()) - continue; - - int count = d3dUniform->getArraySizeProduct(); - - if (d3dUniform->isReferencedByFragmentShader()) - { - unsigned int firstIndex = d3dUniform->psRegisterIndex; - - for (int i = 0; i < count; i++) - { - unsigned int samplerIndex = firstIndex + i; - - if (samplerIndex < mSamplersPS.size()) - { - ASSERT(mSamplersPS[samplerIndex].active); - mSamplersPS[samplerIndex].logicalTextureUnit = d3dUniform->mSamplerData[i]; - } - } - } - - if (d3dUniform->isReferencedByVertexShader()) - { - unsigned int firstIndex = d3dUniform->vsRegisterIndex; - - for (int i = 0; i < count; i++) - { - unsigned int samplerIndex = firstIndex + i; - - if (samplerIndex < mSamplersVS.size()) - { - ASSERT(mSamplersVS[samplerIndex].active); - mSamplersVS[samplerIndex].logicalTextureUnit = d3dUniform->mSamplerData[i]; - } - } - } - - if (d3dUniform->isReferencedByComputeShader()) - { - unsigned int firstIndex = d3dUniform->csRegisterIndex; - - for (int i = 0; i < count; i++) - { - unsigned int samplerIndex = firstIndex + i; - - if (samplerIndex < mSamplersCS.size()) - { - ASSERT(mSamplersCS[samplerIndex].active); - mSamplersCS[samplerIndex].logicalTextureUnit = d3dUniform->mSamplerData[i]; - } - } - } - } - - return SamplerMapping::WasDirty; -} - -gl::LinkResult ProgramD3D::load(const gl::Context *context, - gl::InfoLog &infoLog, - gl::BinaryInputStream *stream) -{ - // TODO(jmadill): Use Renderer from contextImpl. - - reset(); - - DeviceIdentifier binaryDeviceIdentifier = {0}; - stream->readBytes(reinterpret_cast<unsigned char *>(&binaryDeviceIdentifier), - sizeof(DeviceIdentifier)); - - DeviceIdentifier identifier = mRenderer->getAdapterIdentifier(); - if (memcmp(&identifier, &binaryDeviceIdentifier, sizeof(DeviceIdentifier)) != 0) - { - infoLog << "Invalid program binary, device configuration has changed."; - return false; - } - - int compileFlags = stream->readInt<int>(); - if (compileFlags != ANGLE_COMPILE_OPTIMIZATION_LEVEL) - { - infoLog << "Mismatched compilation flags."; - return false; - } - - for (int &index : mAttribLocationToD3DSemantic) - { - stream->readInt(&index); - } - - const unsigned int psSamplerCount = stream->readInt<unsigned int>(); - for (unsigned int i = 0; i < psSamplerCount; ++i) - { - Sampler sampler; - stream->readBool(&sampler.active); - stream->readInt(&sampler.logicalTextureUnit); - stream->readInt(&sampler.textureType); - mSamplersPS.push_back(sampler); - } - const unsigned int vsSamplerCount = stream->readInt<unsigned int>(); - for (unsigned int i = 0; i < vsSamplerCount; ++i) - { - Sampler sampler; - stream->readBool(&sampler.active); - stream->readInt(&sampler.logicalTextureUnit); - stream->readInt(&sampler.textureType); - mSamplersVS.push_back(sampler); - } - - const unsigned int csSamplerCount = stream->readInt<unsigned int>(); - for (unsigned int i = 0; i < csSamplerCount; ++i) - { - Sampler sampler; - stream->readBool(&sampler.active); - stream->readInt(&sampler.logicalTextureUnit); - stream->readInt(&sampler.textureType); - mSamplersCS.push_back(sampler); - } - - stream->readInt(&mUsedVertexSamplerRange); - stream->readInt(&mUsedPixelSamplerRange); - stream->readInt(&mUsedComputeSamplerRange); - - const unsigned int uniformCount = stream->readInt<unsigned int>(); - if (stream->error()) - { - infoLog << "Invalid program binary."; - return false; - } - - const auto &linkedUniforms = mState.getUniforms(); - ASSERT(mD3DUniforms.empty()); - for (unsigned int uniformIndex = 0; uniformIndex < uniformCount; uniformIndex++) - { - const gl::LinkedUniform &linkedUniform = linkedUniforms[uniformIndex]; - - D3DUniform *d3dUniform = - new D3DUniform(linkedUniform.type, linkedUniform.name, linkedUniform.arraySizes, - linkedUniform.isInDefaultBlock()); - stream->readInt(&d3dUniform->psRegisterIndex); - stream->readInt(&d3dUniform->vsRegisterIndex); - stream->readInt(&d3dUniform->csRegisterIndex); - stream->readInt(&d3dUniform->registerCount); - stream->readInt(&d3dUniform->registerElement); - - mD3DUniforms.push_back(d3dUniform); - } - - const unsigned int blockCount = stream->readInt<unsigned int>(); - if (stream->error()) - { - infoLog << "Invalid program binary."; - return false; - } - - ASSERT(mD3DUniformBlocks.empty()); - for (unsigned int blockIndex = 0; blockIndex < blockCount; ++blockIndex) - { - D3DUniformBlock uniformBlock; - stream->readInt(&uniformBlock.psRegisterIndex); - stream->readInt(&uniformBlock.vsRegisterIndex); - stream->readInt(&uniformBlock.csRegisterIndex); - mD3DUniformBlocks.push_back(uniformBlock); - } - - const unsigned int streamOutVaryingCount = stream->readInt<unsigned int>(); - mStreamOutVaryings.resize(streamOutVaryingCount); - for (unsigned int varyingIndex = 0; varyingIndex < streamOutVaryingCount; ++varyingIndex) - { - D3DVarying *varying = &mStreamOutVaryings[varyingIndex]; - - stream->readString(&varying->semanticName); - stream->readInt(&varying->semanticIndex); - stream->readInt(&varying->componentCount); - stream->readInt(&varying->outputSlot); - } - - stream->readString(&mVertexHLSL); - stream->readBytes(reinterpret_cast<unsigned char *>(&mVertexWorkarounds), - sizeof(angle::CompilerWorkaroundsD3D)); - stream->readString(&mPixelHLSL); - stream->readBytes(reinterpret_cast<unsigned char *>(&mPixelWorkarounds), - sizeof(angle::CompilerWorkaroundsD3D)); - stream->readBool(&mUsesFragDepth); - stream->readBool(&mHasANGLEMultiviewEnabled); - stream->readBool(&mUsesViewID); - stream->readBool(&mUsesPointSize); - stream->readBool(&mUsesFlatInterpolation); - - const size_t pixelShaderKeySize = stream->readInt<unsigned int>(); - mPixelShaderKey.resize(pixelShaderKeySize); - for (size_t pixelShaderKeyIndex = 0; pixelShaderKeyIndex < pixelShaderKeySize; - pixelShaderKeyIndex++) - { - stream->readInt(&mPixelShaderKey[pixelShaderKeyIndex].type); - stream->readString(&mPixelShaderKey[pixelShaderKeyIndex].name); - stream->readString(&mPixelShaderKey[pixelShaderKeyIndex].source); - stream->readInt(&mPixelShaderKey[pixelShaderKeyIndex].outputIndex); - } - - stream->readString(&mGeometryShaderPreamble); - - const unsigned char *binary = reinterpret_cast<const unsigned char *>(stream->data()); - - bool separateAttribs = (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS); - - const unsigned int vertexShaderCount = stream->readInt<unsigned int>(); - for (unsigned int vertexShaderIndex = 0; vertexShaderIndex < vertexShaderCount; - vertexShaderIndex++) - { - size_t inputLayoutSize = stream->readInt<size_t>(); - gl::InputLayout inputLayout(inputLayoutSize, gl::VERTEX_FORMAT_INVALID); - - for (size_t inputIndex = 0; inputIndex < inputLayoutSize; inputIndex++) - { - inputLayout[inputIndex] = stream->readInt<gl::VertexFormatType>(); - } - - unsigned int vertexShaderSize = stream->readInt<unsigned int>(); - const unsigned char *vertexShaderFunction = binary + stream->offset(); - - ShaderExecutableD3D *shaderExecutable = nullptr; - - ANGLE_TRY(mRenderer->loadExecutable(vertexShaderFunction, vertexShaderSize, - gl::SHADER_VERTEX, mStreamOutVaryings, separateAttribs, - &shaderExecutable)); - - if (!shaderExecutable) - { - infoLog << "Could not create vertex shader."; - return false; - } - - // generated converted input layout - VertexExecutable::Signature signature; - VertexExecutable::getSignature(mRenderer, inputLayout, &signature); - - // add new binary - mVertexExecutables.push_back(std::unique_ptr<VertexExecutable>( - new VertexExecutable(inputLayout, signature, shaderExecutable))); - - stream->skip(vertexShaderSize); - } - - const size_t pixelShaderCount = stream->readInt<unsigned int>(); - for (size_t pixelShaderIndex = 0; pixelShaderIndex < pixelShaderCount; pixelShaderIndex++) - { - const size_t outputCount = stream->readInt<unsigned int>(); - std::vector<GLenum> outputs(outputCount); - for (size_t outputIndex = 0; outputIndex < outputCount; outputIndex++) - { - stream->readInt(&outputs[outputIndex]); - } - - const size_t pixelShaderSize = stream->readInt<unsigned int>(); - const unsigned char *pixelShaderFunction = binary + stream->offset(); - ShaderExecutableD3D *shaderExecutable = nullptr; - - ANGLE_TRY(mRenderer->loadExecutable(pixelShaderFunction, pixelShaderSize, - gl::SHADER_FRAGMENT, mStreamOutVaryings, - separateAttribs, &shaderExecutable)); - - if (!shaderExecutable) - { - infoLog << "Could not create pixel shader."; - return false; - } - - // add new binary - mPixelExecutables.push_back( - std::unique_ptr<PixelExecutable>(new PixelExecutable(outputs, shaderExecutable))); - - stream->skip(pixelShaderSize); - } - - for (unsigned int geometryExeIndex = 0; geometryExeIndex < gl::PRIMITIVE_TYPE_MAX; - ++geometryExeIndex) - { - unsigned int geometryShaderSize = stream->readInt<unsigned int>(); - if (geometryShaderSize == 0) - { - continue; - } - - const unsigned char *geometryShaderFunction = binary + stream->offset(); - - ShaderExecutableD3D *geometryExecutable = nullptr; - ANGLE_TRY(mRenderer->loadExecutable(geometryShaderFunction, geometryShaderSize, - gl::SHADER_GEOMETRY, mStreamOutVaryings, - separateAttribs, &geometryExecutable)); - - if (!geometryExecutable) - { - infoLog << "Could not create geometry shader."; - return false; - } - - mGeometryExecutables[geometryExeIndex].reset(geometryExecutable); - - stream->skip(geometryShaderSize); - } - - unsigned int computeShaderSize = stream->readInt<unsigned int>(); - if (computeShaderSize > 0) - { - const unsigned char *computeShaderFunction = binary + stream->offset(); - - ShaderExecutableD3D *computeExecutable = nullptr; - ANGLE_TRY(mRenderer->loadExecutable(computeShaderFunction, computeShaderSize, - gl::SHADER_COMPUTE, std::vector<D3DVarying>(), false, - &computeExecutable)); - - if (!computeExecutable) - { - infoLog << "Could not create compute shader."; - return false; - } - - mComputeExecutable.reset(computeExecutable); - } - - initializeUniformStorage(); - - return true; -} - -void ProgramD3D::save(const gl::Context *context, gl::BinaryOutputStream *stream) -{ - // Output the DeviceIdentifier before we output any shader code - // When we load the binary again later, we can validate the device identifier before trying to - // compile any HLSL - DeviceIdentifier binaryIdentifier = mRenderer->getAdapterIdentifier(); - stream->writeBytes(reinterpret_cast<unsigned char *>(&binaryIdentifier), - sizeof(DeviceIdentifier)); - - stream->writeInt(ANGLE_COMPILE_OPTIMIZATION_LEVEL); - - for (int d3dSemantic : mAttribLocationToD3DSemantic) - { - stream->writeInt(d3dSemantic); - } - - stream->writeInt(mSamplersPS.size()); - for (unsigned int i = 0; i < mSamplersPS.size(); ++i) - { - stream->writeInt(mSamplersPS[i].active); - stream->writeInt(mSamplersPS[i].logicalTextureUnit); - stream->writeInt(mSamplersPS[i].textureType); - } - - stream->writeInt(mSamplersVS.size()); - for (unsigned int i = 0; i < mSamplersVS.size(); ++i) - { - stream->writeInt(mSamplersVS[i].active); - stream->writeInt(mSamplersVS[i].logicalTextureUnit); - stream->writeInt(mSamplersVS[i].textureType); - } - - stream->writeInt(mSamplersCS.size()); - for (unsigned int i = 0; i < mSamplersCS.size(); ++i) - { - stream->writeInt(mSamplersCS[i].active); - stream->writeInt(mSamplersCS[i].logicalTextureUnit); - stream->writeInt(mSamplersCS[i].textureType); - } - - stream->writeInt(mUsedVertexSamplerRange); - stream->writeInt(mUsedPixelSamplerRange); - stream->writeInt(mUsedComputeSamplerRange); - - stream->writeInt(mD3DUniforms.size()); - for (const D3DUniform *uniform : mD3DUniforms) - { - // Type, name and arraySize are redundant, so aren't stored in the binary. - stream->writeIntOrNegOne(uniform->psRegisterIndex); - stream->writeIntOrNegOne(uniform->vsRegisterIndex); - stream->writeIntOrNegOne(uniform->csRegisterIndex); - stream->writeInt(uniform->registerCount); - stream->writeInt(uniform->registerElement); - } - - stream->writeInt(mD3DUniformBlocks.size()); - for (const D3DUniformBlock &uniformBlock : mD3DUniformBlocks) - { - stream->writeIntOrNegOne(uniformBlock.psRegisterIndex); - stream->writeIntOrNegOne(uniformBlock.vsRegisterIndex); - stream->writeIntOrNegOne(uniformBlock.csRegisterIndex); - } - - stream->writeInt(mStreamOutVaryings.size()); - for (const auto &varying : mStreamOutVaryings) - { - stream->writeString(varying.semanticName); - stream->writeInt(varying.semanticIndex); - stream->writeInt(varying.componentCount); - stream->writeInt(varying.outputSlot); - } - - stream->writeString(mVertexHLSL); - stream->writeBytes(reinterpret_cast<unsigned char *>(&mVertexWorkarounds), - sizeof(angle::CompilerWorkaroundsD3D)); - stream->writeString(mPixelHLSL); - stream->writeBytes(reinterpret_cast<unsigned char *>(&mPixelWorkarounds), - sizeof(angle::CompilerWorkaroundsD3D)); - stream->writeInt(mUsesFragDepth); - stream->writeInt(mHasANGLEMultiviewEnabled); - stream->writeInt(mUsesViewID); - stream->writeInt(mUsesPointSize); - stream->writeInt(mUsesFlatInterpolation); - - const std::vector<PixelShaderOutputVariable> &pixelShaderKey = mPixelShaderKey; - stream->writeInt(pixelShaderKey.size()); - for (size_t pixelShaderKeyIndex = 0; pixelShaderKeyIndex < pixelShaderKey.size(); - pixelShaderKeyIndex++) - { - const PixelShaderOutputVariable &variable = pixelShaderKey[pixelShaderKeyIndex]; - stream->writeInt(variable.type); - stream->writeString(variable.name); - stream->writeString(variable.source); - stream->writeInt(variable.outputIndex); - } - - stream->writeString(mGeometryShaderPreamble); - - stream->writeInt(mVertexExecutables.size()); - for (size_t vertexExecutableIndex = 0; vertexExecutableIndex < mVertexExecutables.size(); - vertexExecutableIndex++) - { - VertexExecutable *vertexExecutable = mVertexExecutables[vertexExecutableIndex].get(); - - const auto &inputLayout = vertexExecutable->inputs(); - stream->writeInt(inputLayout.size()); - - for (size_t inputIndex = 0; inputIndex < inputLayout.size(); inputIndex++) - { - stream->writeInt(static_cast<unsigned int>(inputLayout[inputIndex])); - } - - size_t vertexShaderSize = vertexExecutable->shaderExecutable()->getLength(); - stream->writeInt(vertexShaderSize); - - const uint8_t *vertexBlob = vertexExecutable->shaderExecutable()->getFunction(); - stream->writeBytes(vertexBlob, vertexShaderSize); - } - - stream->writeInt(mPixelExecutables.size()); - for (size_t pixelExecutableIndex = 0; pixelExecutableIndex < mPixelExecutables.size(); - pixelExecutableIndex++) - { - PixelExecutable *pixelExecutable = mPixelExecutables[pixelExecutableIndex].get(); - - const std::vector<GLenum> outputs = pixelExecutable->outputSignature(); - stream->writeInt(outputs.size()); - for (size_t outputIndex = 0; outputIndex < outputs.size(); outputIndex++) - { - stream->writeInt(outputs[outputIndex]); - } - - size_t pixelShaderSize = pixelExecutable->shaderExecutable()->getLength(); - stream->writeInt(pixelShaderSize); - - const uint8_t *pixelBlob = pixelExecutable->shaderExecutable()->getFunction(); - stream->writeBytes(pixelBlob, pixelShaderSize); - } - - for (auto const &geometryExecutable : mGeometryExecutables) - { - if (!geometryExecutable) - { - stream->writeInt(0); - continue; - } - - size_t geometryShaderSize = geometryExecutable->getLength(); - stream->writeInt(geometryShaderSize); - stream->writeBytes(geometryExecutable->getFunction(), geometryShaderSize); - } - - if (mComputeExecutable) - { - size_t computeShaderSize = mComputeExecutable->getLength(); - stream->writeInt(computeShaderSize); - stream->writeBytes(mComputeExecutable->getFunction(), computeShaderSize); - } - else - { - stream->writeInt(0); - } -} - -void ProgramD3D::setBinaryRetrievableHint(bool /* retrievable */) -{ -} - -void ProgramD3D::setSeparable(bool /* separable */) -{ -} - -gl::Error ProgramD3D::getPixelExecutableForCachedOutputLayout(ShaderExecutableD3D **outExecutable, - gl::InfoLog *infoLog) -{ - if (mCachedPixelExecutableIndex.valid()) - { - *outExecutable = mPixelExecutables[mCachedPixelExecutableIndex.value()]->shaderExecutable(); - return gl::NoError(); - } - - std::string finalPixelHLSL = mDynamicHLSL->generatePixelShaderForOutputSignature( - mPixelHLSL, mPixelShaderKey, mUsesFragDepth, mPixelShaderOutputLayoutCache); - - // Generate new pixel executable - ShaderExecutableD3D *pixelExecutable = nullptr; - - gl::InfoLog tempInfoLog; - gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog; - - ANGLE_TRY(mRenderer->compileToExecutable( - *currentInfoLog, finalPixelHLSL, gl::SHADER_FRAGMENT, mStreamOutVaryings, - (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), mPixelWorkarounds, - &pixelExecutable)); - - if (pixelExecutable) - { - mPixelExecutables.push_back(std::unique_ptr<PixelExecutable>( - new PixelExecutable(mPixelShaderOutputLayoutCache, pixelExecutable))); - mCachedPixelExecutableIndex = mPixelExecutables.size() - 1; - } - else if (!infoLog) - { - ERR() << "Error compiling dynamic pixel executable:" << std::endl - << tempInfoLog.str() << std::endl; - } - - *outExecutable = pixelExecutable; - return gl::NoError(); -} - -gl::Error ProgramD3D::getVertexExecutableForCachedInputLayout(ShaderExecutableD3D **outExectuable, - gl::InfoLog *infoLog) -{ - if (mCachedVertexExecutableIndex.valid()) - { - *outExectuable = - mVertexExecutables[mCachedVertexExecutableIndex.value()]->shaderExecutable(); - return gl::NoError(); - } - - // Generate new dynamic layout with attribute conversions - std::string finalVertexHLSL = mDynamicHLSL->generateVertexShaderForInputLayout( - mVertexHLSL, mCachedInputLayout, mState.getAttributes()); - - // Generate new vertex executable - ShaderExecutableD3D *vertexExecutable = nullptr; - - gl::InfoLog tempInfoLog; - gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog; - - ANGLE_TRY(mRenderer->compileToExecutable( - *currentInfoLog, finalVertexHLSL, gl::SHADER_VERTEX, mStreamOutVaryings, - (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), mVertexWorkarounds, - &vertexExecutable)); - - if (vertexExecutable) - { - mVertexExecutables.push_back(std::unique_ptr<VertexExecutable>( - new VertexExecutable(mCachedInputLayout, mCachedVertexSignature, vertexExecutable))); - mCachedVertexExecutableIndex = mVertexExecutables.size() - 1; - } - else if (!infoLog) - { - ERR() << "Error compiling dynamic vertex executable:" << std::endl - << tempInfoLog.str() << std::endl; - } - - *outExectuable = vertexExecutable; - return gl::NoError(); -} - -gl::Error ProgramD3D::getGeometryExecutableForPrimitiveType(const gl::Context *context, - GLenum drawMode, - ShaderExecutableD3D **outExecutable, - gl::InfoLog *infoLog) -{ - if (outExecutable) - { - *outExecutable = nullptr; - } - - // Return a null shader if the current rendering doesn't use a geometry shader - if (!usesGeometryShader(drawMode)) - { - return gl::NoError(); - } - - gl::PrimitiveType geometryShaderType = GetGeometryShaderTypeFromDrawMode(drawMode); - - if (mGeometryExecutables[geometryShaderType]) - { - if (outExecutable) - { - *outExecutable = mGeometryExecutables[geometryShaderType].get(); - } - return gl::NoError(); - } - - std::string geometryHLSL = mDynamicHLSL->generateGeometryShaderHLSL( - context, geometryShaderType, mState, mRenderer->presentPathFastEnabled(), - mHasANGLEMultiviewEnabled, mRenderer->canSelectViewInVertexShader(), - usesGeometryShaderForPointSpriteEmulation(), mGeometryShaderPreamble); - - gl::InfoLog tempInfoLog; - gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog; - - ShaderExecutableD3D *geometryExecutable = nullptr; - gl::Error error = mRenderer->compileToExecutable( - *currentInfoLog, geometryHLSL, gl::SHADER_GEOMETRY, mStreamOutVaryings, - (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), - angle::CompilerWorkaroundsD3D(), &geometryExecutable); - - if (!infoLog && error.isError()) - { - ERR() << "Error compiling dynamic geometry executable:" << std::endl - << tempInfoLog.str() << std::endl; - } - - if (geometryExecutable != nullptr) - { - mGeometryExecutables[geometryShaderType].reset(geometryExecutable); - } - - if (outExecutable) - { - *outExecutable = mGeometryExecutables[geometryShaderType].get(); - } - return error; -} - -class ProgramD3D::GetExecutableTask : public Closure -{ - public: - GetExecutableTask(ProgramD3D *program) - : mProgram(program), mError(gl::NoError()), mInfoLog(), mResult(nullptr) - { - } - - virtual gl::Error run() = 0; - - void operator()() override { mError = run(); } - - const gl::Error &getError() const { return mError; } - const gl::InfoLog &getInfoLog() const { return mInfoLog; } - ShaderExecutableD3D *getResult() { return mResult; } - - protected: - ProgramD3D *mProgram; - gl::Error mError; - gl::InfoLog mInfoLog; - ShaderExecutableD3D *mResult; -}; - -class ProgramD3D::GetVertexExecutableTask : public ProgramD3D::GetExecutableTask -{ - public: - GetVertexExecutableTask(ProgramD3D *program, const gl::Context *context) - : GetExecutableTask(program), mContext(context) - { - } - gl::Error run() override - { - mProgram->updateCachedInputLayoutFromShader(mContext); - - ANGLE_TRY(mProgram->getVertexExecutableForCachedInputLayout(&mResult, &mInfoLog)); - - return gl::NoError(); - } - - private: - const gl::Context *mContext; -}; - -void ProgramD3D::updateCachedInputLayoutFromShader(const gl::Context *context) -{ - GetDefaultInputLayoutFromShader(context, mState.getAttachedVertexShader(), &mCachedInputLayout); - VertexExecutable::getSignature(mRenderer, mCachedInputLayout, &mCachedVertexSignature); - updateCachedVertexExecutableIndex(); -} - -class ProgramD3D::GetPixelExecutableTask : public ProgramD3D::GetExecutableTask -{ - public: - GetPixelExecutableTask(ProgramD3D *program) : GetExecutableTask(program) {} - gl::Error run() override - { - mProgram->updateCachedOutputLayoutFromShader(); - - ANGLE_TRY(mProgram->getPixelExecutableForCachedOutputLayout(&mResult, &mInfoLog)); - - return gl::NoError(); - } -}; - -void ProgramD3D::updateCachedOutputLayoutFromShader() -{ - GetDefaultOutputLayoutFromShader(mPixelShaderKey, &mPixelShaderOutputLayoutCache); - updateCachedPixelExecutableIndex(); -} - -class ProgramD3D::GetGeometryExecutableTask : public ProgramD3D::GetExecutableTask -{ - public: - GetGeometryExecutableTask(ProgramD3D *program, const gl::Context *context) - : GetExecutableTask(program), mContext(context) - { - } - - gl::Error run() override - { - // Auto-generate the geometry shader here, if we expect to be using point rendering in - // D3D11. - if (mProgram->usesGeometryShader(GL_POINTS)) - { - ANGLE_TRY(mProgram->getGeometryExecutableForPrimitiveType(mContext, GL_POINTS, &mResult, - &mInfoLog)); - } - - return gl::NoError(); - } - - private: - const gl::Context *mContext; -}; - -gl::Error ProgramD3D::getComputeExecutable(ShaderExecutableD3D **outExecutable) -{ - if (outExecutable) - { - *outExecutable = mComputeExecutable.get(); - } - - return gl::NoError(); -} - -gl::LinkResult ProgramD3D::compileProgramExecutables(const gl::Context *context, - gl::InfoLog &infoLog) -{ - // Ensure the compiler is initialized to avoid race conditions. - ANGLE_TRY(mRenderer->ensureHLSLCompilerInitialized()); - - WorkerThreadPool *workerPool = mRenderer->getWorkerThreadPool(); - - GetVertexExecutableTask vertexTask(this, context); - GetPixelExecutableTask pixelTask(this); - GetGeometryExecutableTask geometryTask(this, context); - - std::array<WaitableEvent, 3> waitEvents = {{workerPool->postWorkerTask(&vertexTask), - workerPool->postWorkerTask(&pixelTask), - workerPool->postWorkerTask(&geometryTask)}}; - - WaitableEvent::WaitMany(&waitEvents); - - infoLog << vertexTask.getInfoLog().str(); - infoLog << pixelTask.getInfoLog().str(); - infoLog << geometryTask.getInfoLog().str(); - - ANGLE_TRY(vertexTask.getError()); - ANGLE_TRY(pixelTask.getError()); - ANGLE_TRY(geometryTask.getError()); - - ShaderExecutableD3D *defaultVertexExecutable = vertexTask.getResult(); - ShaderExecutableD3D *defaultPixelExecutable = pixelTask.getResult(); - ShaderExecutableD3D *pointGS = geometryTask.getResult(); - - const ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedVertexShader()); - - if (usesGeometryShader(GL_POINTS) && pointGS) - { - // Geometry shaders are currently only used internally, so there is no corresponding shader - // object at the interface level. For now the geometry shader debug info is prepended to - // the vertex shader. - vertexShaderD3D->appendDebugInfo("// GEOMETRY SHADER BEGIN\n\n"); - vertexShaderD3D->appendDebugInfo(pointGS->getDebugInfo()); - vertexShaderD3D->appendDebugInfo("\nGEOMETRY SHADER END\n\n\n"); - } - - if (defaultVertexExecutable) - { - vertexShaderD3D->appendDebugInfo(defaultVertexExecutable->getDebugInfo()); - } - - if (defaultPixelExecutable) - { - const ShaderD3D *fragmentShaderD3D = - GetImplAs<ShaderD3D>(mState.getAttachedFragmentShader()); - fragmentShaderD3D->appendDebugInfo(defaultPixelExecutable->getDebugInfo()); - } - - return (defaultVertexExecutable && defaultPixelExecutable && - (!usesGeometryShader(GL_POINTS) || pointGS)); -} - -gl::LinkResult ProgramD3D::compileComputeExecutable(const gl::Context *context, - gl::InfoLog &infoLog) -{ - // Ensure the compiler is initialized to avoid race conditions. - ANGLE_TRY(mRenderer->ensureHLSLCompilerInitialized()); - - std::string computeShader = mDynamicHLSL->generateComputeShaderLinkHLSL(context, mState); - - ShaderExecutableD3D *computeExecutable = nullptr; - ANGLE_TRY(mRenderer->compileToExecutable(infoLog, computeShader, gl::SHADER_COMPUTE, - std::vector<D3DVarying>(), false, - angle::CompilerWorkaroundsD3D(), &computeExecutable)); - - if (computeExecutable == nullptr) - { - ERR() << "Error compiling dynamic compute executable:" << std::endl - << infoLog.str() << std::endl; - } - else - { - const ShaderD3D *computeShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedComputeShader()); - computeShaderD3D->appendDebugInfo(computeExecutable->getDebugInfo()); - mComputeExecutable.reset(computeExecutable); - } - - return mComputeExecutable.get() != nullptr; -} - -gl::LinkResult ProgramD3D::link(const gl::Context *context, - const gl::ProgramLinkedResources &resources, - gl::InfoLog &infoLog) -{ - const auto &data = context->getContextState(); - - reset(); - - gl::Shader *computeShader = mState.getAttachedComputeShader(); - if (computeShader) - { - mSamplersCS.resize(data.getCaps().maxComputeTextureImageUnits); - - defineUniformsAndAssignRegisters(context); - - gl::LinkResult result = compileComputeExecutable(context, infoLog); - if (result.isError()) - { - infoLog << result.getError().getMessage(); - return result; - } - else if (!result.getResult()) - { - infoLog << "Failed to create D3D compute shader."; - return result; - } - } - else - { - gl::Shader *vertexShader = mState.getAttachedVertexShader(); - gl::Shader *fragmentShader = mState.getAttachedFragmentShader(); - - const ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(vertexShader); - const ShaderD3D *fragmentShaderD3D = GetImplAs<ShaderD3D>(fragmentShader); - - mSamplersVS.resize(data.getCaps().maxVertexTextureImageUnits); - mSamplersPS.resize(data.getCaps().maxTextureImageUnits); - - vertexShaderD3D->generateWorkarounds(&mVertexWorkarounds); - fragmentShaderD3D->generateWorkarounds(&mPixelWorkarounds); - - if (mRenderer->getNativeLimitations().noFrontFacingSupport) - { - if (fragmentShaderD3D->usesFrontFacing()) - { - infoLog << "The current renderer doesn't support gl_FrontFacing"; - return false; - } - } - - // TODO(jmadill): Implement more sophisticated component packing in D3D9. - // We can fail here because we use one semantic per GLSL varying. D3D11 can pack varyings - // intelligently, but D3D9 assumes one semantic per register. - if (mRenderer->getRendererClass() == RENDERER_D3D9 && - resources.varyingPacking.getMaxSemanticIndex() > data.getCaps().maxVaryingVectors) - { - infoLog << "Cannot pack these varyings on D3D9."; - return false; - } - - ProgramD3DMetadata metadata(mRenderer, vertexShaderD3D, fragmentShaderD3D); - BuiltinVaryingsD3D builtins(metadata, resources.varyingPacking); - - mDynamicHLSL->generateShaderLinkHLSL(context, mState, metadata, resources.varyingPacking, - builtins, &mPixelHLSL, &mVertexHLSL); - - mUsesPointSize = vertexShaderD3D->usesPointSize(); - mDynamicHLSL->getPixelShaderOutputKey(data, mState, metadata, &mPixelShaderKey); - mUsesFragDepth = metadata.usesFragDepth(); - mUsesViewID = metadata.usesViewID(); - mHasANGLEMultiviewEnabled = metadata.hasANGLEMultiviewEnabled(); - - // Cache if we use flat shading - mUsesFlatInterpolation = - (FindFlatInterpolationVarying(fragmentShader->getInputVaryings(context)) || - FindFlatInterpolationVarying(vertexShader->getOutputVaryings(context))); - - if (mRenderer->getMajorShaderModel() >= 4) - { - mGeometryShaderPreamble = mDynamicHLSL->generateGeometryShaderPreamble( - resources.varyingPacking, builtins, mHasANGLEMultiviewEnabled, - metadata.canSelectViewInVertexShader()); - } - - initAttribLocationsToD3DSemantic(context); - - defineUniformsAndAssignRegisters(context); - - gatherTransformFeedbackVaryings(resources.varyingPacking, builtins[gl::SHADER_VERTEX]); - - gl::LinkResult result = compileProgramExecutables(context, infoLog); - if (result.isError()) - { - infoLog << result.getError().getMessage(); - return result; - } - else if (!result.getResult()) - { - infoLog << "Failed to create D3D shaders."; - return result; - } - } - - linkResources(context, resources); - - return true; -} - -GLboolean ProgramD3D::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLog*/) -{ - // TODO(jmadill): Do something useful here? - return GL_TRUE; -} - -void ProgramD3D::initializeUniformBlocks() -{ - if (mState.getUniformBlocks().empty()) - { - return; - } - - ASSERT(mD3DUniformBlocks.empty()); - - // Assign registers and update sizes. - const ShaderD3D *vertexShaderD3D = SafeGetImplAs<ShaderD3D>(mState.getAttachedVertexShader()); - const ShaderD3D *fragmentShaderD3D = - SafeGetImplAs<ShaderD3D>(mState.getAttachedFragmentShader()); - const ShaderD3D *computeShaderD3D = SafeGetImplAs<ShaderD3D>(mState.getAttachedComputeShader()); - - for (const gl::InterfaceBlock &uniformBlock : mState.getUniformBlocks()) - { - unsigned int uniformBlockElement = uniformBlock.isArray ? uniformBlock.arrayElement : 0; - - D3DUniformBlock d3dUniformBlock; - - if (uniformBlock.vertexStaticUse) - { - ASSERT(vertexShaderD3D != nullptr); - unsigned int baseRegister = vertexShaderD3D->getUniformBlockRegister(uniformBlock.name); - d3dUniformBlock.vsRegisterIndex = baseRegister + uniformBlockElement; - } - - if (uniformBlock.fragmentStaticUse) - { - ASSERT(fragmentShaderD3D != nullptr); - unsigned int baseRegister = - fragmentShaderD3D->getUniformBlockRegister(uniformBlock.name); - d3dUniformBlock.psRegisterIndex = baseRegister + uniformBlockElement; - } - - if (uniformBlock.computeStaticUse) - { - ASSERT(computeShaderD3D != nullptr); - unsigned int baseRegister = - computeShaderD3D->getUniformBlockRegister(uniformBlock.name); - d3dUniformBlock.csRegisterIndex = baseRegister + uniformBlockElement; - } - - mD3DUniformBlocks.push_back(d3dUniformBlock); - } -} - -void ProgramD3D::initializeUniformStorage() -{ - // Compute total default block size - unsigned int vertexRegisters = 0; - unsigned int fragmentRegisters = 0; - unsigned int computeRegisters = 0; - for (const D3DUniform *d3dUniform : mD3DUniforms) - { - if (!d3dUniform->isSampler()) - { - if (d3dUniform->isReferencedByVertexShader()) - { - vertexRegisters = std::max(vertexRegisters, - d3dUniform->vsRegisterIndex + d3dUniform->registerCount); - } - if (d3dUniform->isReferencedByFragmentShader()) - { - fragmentRegisters = std::max( - fragmentRegisters, d3dUniform->psRegisterIndex + d3dUniform->registerCount); - } - if (d3dUniform->isReferencedByComputeShader()) - { - computeRegisters = std::max( - computeRegisters, d3dUniform->csRegisterIndex + d3dUniform->registerCount); - } - } - } - - mVertexUniformStorage = - std::unique_ptr<UniformStorageD3D>(mRenderer->createUniformStorage(vertexRegisters * 16u)); - mFragmentUniformStorage = std::unique_ptr<UniformStorageD3D>( - mRenderer->createUniformStorage(fragmentRegisters * 16u)); - mComputeUniformStorage = - std::unique_ptr<UniformStorageD3D>(mRenderer->createUniformStorage(computeRegisters * 16u)); - - // Iterate the uniforms again to assign data pointers to default block uniforms. - for (D3DUniform *d3dUniform : mD3DUniforms) - { - if (d3dUniform->isSampler()) - { - d3dUniform->mSamplerData.resize(d3dUniform->getArraySizeProduct(), 0); - continue; - } - - if (d3dUniform->isReferencedByVertexShader()) - { - d3dUniform->vsData = mVertexUniformStorage->getDataPointer(d3dUniform->vsRegisterIndex, - d3dUniform->registerElement); - } - - if (d3dUniform->isReferencedByFragmentShader()) - { - d3dUniform->psData = mFragmentUniformStorage->getDataPointer( - d3dUniform->psRegisterIndex, d3dUniform->registerElement); - } - - if (d3dUniform->isReferencedByComputeShader()) - { - d3dUniform->csData = mComputeUniformStorage->getDataPointer( - d3dUniform->csRegisterIndex, d3dUniform->registerElement); - } - } -} - -void ProgramD3D::updateUniformBufferCache(const gl::Caps &caps, - unsigned int reservedVertex, - unsigned int reservedFragment) -{ - if (mState.getUniformBlocks().empty()) - { - return; - } - - mVertexUBOCache.clear(); - mFragmentUBOCache.clear(); - - for (unsigned int uniformBlockIndex = 0; uniformBlockIndex < mD3DUniformBlocks.size(); - uniformBlockIndex++) - { - const D3DUniformBlock &uniformBlock = mD3DUniformBlocks[uniformBlockIndex]; - GLuint blockBinding = mState.getUniformBlockBinding(uniformBlockIndex); - - // Unnecessary to apply an unreferenced standard or shared UBO - if (!uniformBlock.vertexStaticUse() && !uniformBlock.fragmentStaticUse()) - { - continue; - } - - if (uniformBlock.vertexStaticUse()) - { - unsigned int registerIndex = uniformBlock.vsRegisterIndex - reservedVertex; - ASSERT(registerIndex < caps.maxVertexUniformBlocks); - - if (mVertexUBOCache.size() <= registerIndex) - { - mVertexUBOCache.resize(registerIndex + 1, -1); - } - - ASSERT(mVertexUBOCache[registerIndex] == -1); - mVertexUBOCache[registerIndex] = blockBinding; - } - - if (uniformBlock.fragmentStaticUse()) - { - unsigned int registerIndex = uniformBlock.psRegisterIndex - reservedFragment; - ASSERT(registerIndex < caps.maxFragmentUniformBlocks); - - if (mFragmentUBOCache.size() <= registerIndex) - { - mFragmentUBOCache.resize(registerIndex + 1, -1); - } - - ASSERT(mFragmentUBOCache[registerIndex] == -1); - mFragmentUBOCache[registerIndex] = blockBinding; - } - } -} - -const std::vector<GLint> &ProgramD3D::getVertexUniformBufferCache() const -{ - return mVertexUBOCache; -} - -const std::vector<GLint> &ProgramD3D::getFragmentUniformBufferCache() const -{ - return mFragmentUBOCache; -} - -void ProgramD3D::dirtyAllUniforms() -{ - mVertexUniformsDirty = true; - mFragmentUniformsDirty = true; - mComputeUniformsDirty = true; -} - -void ProgramD3D::markUniformsClean() -{ - mVertexUniformsDirty = false; - mFragmentUniformsDirty = false; - mComputeUniformsDirty = false; -} - -void ProgramD3D::setUniform1fv(GLint location, GLsizei count, const GLfloat *v) -{ - setUniformInternal(location, count, v, GL_FLOAT); -} - -void ProgramD3D::setUniform2fv(GLint location, GLsizei count, const GLfloat *v) -{ - setUniformInternal(location, count, v, GL_FLOAT_VEC2); -} - -void ProgramD3D::setUniform3fv(GLint location, GLsizei count, const GLfloat *v) -{ - setUniformInternal(location, count, v, GL_FLOAT_VEC3); -} - -void ProgramD3D::setUniform4fv(GLint location, GLsizei count, const GLfloat *v) -{ - setUniformInternal(location, count, v, GL_FLOAT_VEC4); -} - -void ProgramD3D::setUniformMatrix2fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) -{ - setUniformMatrixfvInternal<2, 2>(location, count, transpose, value, GL_FLOAT_MAT2); -} - -void ProgramD3D::setUniformMatrix3fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) -{ - setUniformMatrixfvInternal<3, 3>(location, count, transpose, value, GL_FLOAT_MAT3); -} - -void ProgramD3D::setUniformMatrix4fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) -{ - setUniformMatrixfvInternal<4, 4>(location, count, transpose, value, GL_FLOAT_MAT4); -} - -void ProgramD3D::setUniformMatrix2x3fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) -{ - setUniformMatrixfvInternal<2, 3>(location, count, transpose, value, GL_FLOAT_MAT2x3); -} - -void ProgramD3D::setUniformMatrix3x2fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) -{ - setUniformMatrixfvInternal<3, 2>(location, count, transpose, value, GL_FLOAT_MAT3x2); -} - -void ProgramD3D::setUniformMatrix2x4fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) -{ - setUniformMatrixfvInternal<2, 4>(location, count, transpose, value, GL_FLOAT_MAT2x4); -} - -void ProgramD3D::setUniformMatrix4x2fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) -{ - setUniformMatrixfvInternal<4, 2>(location, count, transpose, value, GL_FLOAT_MAT4x2); -} - -void ProgramD3D::setUniformMatrix3x4fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) -{ - setUniformMatrixfvInternal<3, 4>(location, count, transpose, value, GL_FLOAT_MAT3x4); -} - -void ProgramD3D::setUniformMatrix4x3fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) -{ - setUniformMatrixfvInternal<4, 3>(location, count, transpose, value, GL_FLOAT_MAT4x3); -} - -void ProgramD3D::setUniform1iv(GLint location, GLsizei count, const GLint *v) -{ - setUniformInternal(location, count, v, GL_INT); -} - -void ProgramD3D::setUniform2iv(GLint location, GLsizei count, const GLint *v) -{ - setUniformInternal(location, count, v, GL_INT_VEC2); -} - -void ProgramD3D::setUniform3iv(GLint location, GLsizei count, const GLint *v) -{ - setUniformInternal(location, count, v, GL_INT_VEC3); -} - -void ProgramD3D::setUniform4iv(GLint location, GLsizei count, const GLint *v) -{ - setUniformInternal(location, count, v, GL_INT_VEC4); -} - -void ProgramD3D::setUniform1uiv(GLint location, GLsizei count, const GLuint *v) -{ - setUniformInternal(location, count, v, GL_UNSIGNED_INT); -} - -void ProgramD3D::setUniform2uiv(GLint location, GLsizei count, const GLuint *v) -{ - setUniformInternal(location, count, v, GL_UNSIGNED_INT_VEC2); -} - -void ProgramD3D::setUniform3uiv(GLint location, GLsizei count, const GLuint *v) -{ - setUniformInternal(location, count, v, GL_UNSIGNED_INT_VEC3); -} - -void ProgramD3D::setUniform4uiv(GLint location, GLsizei count, const GLuint *v) -{ - setUniformInternal(location, count, v, GL_UNSIGNED_INT_VEC4); -} - -void ProgramD3D::setUniformBlockBinding(GLuint /*uniformBlockIndex*/, - GLuint /*uniformBlockBinding*/) -{ -} - -void ProgramD3D::defineUniformsAndAssignRegisters(const gl::Context *context) -{ - D3DUniformMap uniformMap; - gl::Shader *computeShader = mState.getAttachedComputeShader(); - if (computeShader) - { - for (const sh::Uniform &computeUniform : computeShader->getUniforms(context)) - { - if (computeUniform.staticUse) - { - defineUniformBase(computeShader, computeUniform, &uniformMap); - } - } - } - else - { - gl::Shader *vertexShader = mState.getAttachedVertexShader(); - for (const sh::Uniform &vertexUniform : vertexShader->getUniforms(context)) - { - if (vertexUniform.staticUse) - { - defineUniformBase(vertexShader, vertexUniform, &uniformMap); - } - } - - gl::Shader *fragmentShader = mState.getAttachedFragmentShader(); - for (const sh::Uniform &fragmentUniform : fragmentShader->getUniforms(context)) - { - if (fragmentUniform.staticUse) - { - defineUniformBase(fragmentShader, fragmentUniform, &uniformMap); - } - } - } - - // Initialize the D3DUniform list to mirror the indexing of the GL layer. - for (const gl::LinkedUniform &glUniform : mState.getUniforms()) - { - if (!glUniform.isInDefaultBlock()) - continue; - - std::string name = glUniform.name; - if (glUniform.isArray()) - { - // In the program state, array uniform names include [0] as in the program resource - // spec. Here we don't include it. - // TODO(oetuaho@nvidia.com): consider using the same uniform naming here as in the GL - // layer. - ASSERT(angle::EndsWith(name, "[0]")); - name.resize(name.length() - 3); - } - auto mapEntry = uniformMap.find(name); - ASSERT(mapEntry != uniformMap.end()); - mD3DUniforms.push_back(mapEntry->second); - } - - assignAllSamplerRegisters(); - initializeUniformStorage(); -} - -void ProgramD3D::defineUniformBase(const gl::Shader *shader, - const sh::Uniform &uniform, - D3DUniformMap *uniformMap) -{ - // Samplers get their registers assigned in assignAllSamplerRegisters. - if (uniform.isBuiltIn() || gl::IsSamplerType(uniform.type)) - { - defineUniform(shader->getType(), uniform, uniform.name, nullptr, uniformMap); - return; - } - - const ShaderD3D *shaderD3D = GetImplAs<ShaderD3D>(shader); - - unsigned int startRegister = shaderD3D->getUniformRegister(uniform.name); - ShShaderOutput outputType = shaderD3D->getCompilerOutputType(); - sh::HLSLBlockEncoder encoder(sh::HLSLBlockEncoder::GetStrategyFor(outputType), true); - encoder.skipRegisters(startRegister); - - defineUniform(shader->getType(), uniform, uniform.name, &encoder, uniformMap); -} - -D3DUniform *ProgramD3D::getD3DUniformByName(const std::string &name) -{ - for (D3DUniform *d3dUniform : mD3DUniforms) - { - if (d3dUniform->name == name) - { - return d3dUniform; - } - } - - return nullptr; -} - -void ProgramD3D::defineStructUniformFields(GLenum shaderType, - const std::vector<sh::ShaderVariable> &fields, - const std::string &namePrefix, - sh::HLSLBlockEncoder *encoder, - D3DUniformMap *uniformMap) -{ - if (encoder) - encoder->enterAggregateType(); - - for (size_t fieldIndex = 0; fieldIndex < fields.size(); fieldIndex++) - { - const sh::ShaderVariable &field = fields[fieldIndex]; - const std::string &fieldFullName = (namePrefix + "." + field.name); - - // Samplers get their registers assigned in assignAllSamplerRegisters. - // Also they couldn't use the same encoder as the rest of the struct, since they are - // extracted out of the struct by the shader translator. - if (gl::IsSamplerType(field.type)) - { - defineUniform(shaderType, field, fieldFullName, nullptr, uniformMap); - } - else - { - defineUniform(shaderType, field, fieldFullName, encoder, uniformMap); - } - } - - if (encoder) - encoder->exitAggregateType(); -} - -void ProgramD3D::defineArrayOfStructsUniformFields(GLenum shaderType, - const sh::ShaderVariable &uniform, - unsigned int arrayNestingIndex, - const std::string &prefix, - sh::HLSLBlockEncoder *encoder, - D3DUniformMap *uniformMap) -{ - // Nested arrays are processed starting from outermost (arrayNestingIndex 0u) and ending at the - // innermost. - const unsigned int currentArraySize = uniform.getNestedArraySize(arrayNestingIndex); - for (unsigned int arrayElement = 0u; arrayElement < currentArraySize; ++arrayElement) - { - const std::string &elementString = prefix + ArrayString(arrayElement); - if (arrayNestingIndex + 1u < uniform.arraySizes.size()) - { - defineArrayOfStructsUniformFields(shaderType, uniform, arrayNestingIndex + 1u, - elementString, encoder, uniformMap); - } - else - { - defineStructUniformFields(shaderType, uniform.fields, elementString, encoder, - uniformMap); - } - } -} - -void ProgramD3D::defineArrayUniformElements(GLenum shaderType, - const sh::ShaderVariable &uniform, - const std::string &fullName, - sh::HLSLBlockEncoder *encoder, - D3DUniformMap *uniformMap) -{ - if (encoder) - encoder->enterAggregateType(); - - sh::ShaderVariable uniformElement = uniform; - uniformElement.arraySizes.pop_back(); - for (unsigned int arrayIndex = 0u; arrayIndex < uniform.getOutermostArraySize(); ++arrayIndex) - { - std::string elementFullName = fullName + ArrayString(arrayIndex); - defineUniform(shaderType, uniformElement, elementFullName, encoder, uniformMap); - } - - if (encoder) - encoder->exitAggregateType(); -} - -void ProgramD3D::defineUniform(GLenum shaderType, - const sh::ShaderVariable &uniform, - const std::string &fullName, - sh::HLSLBlockEncoder *encoder, - D3DUniformMap *uniformMap) -{ - if (uniform.isStruct()) - { - if (uniform.isArray()) - { - defineArrayOfStructsUniformFields(shaderType, uniform, 0u, fullName, encoder, - uniformMap); - } - else - { - defineStructUniformFields(shaderType, uniform.fields, fullName, encoder, uniformMap); - } - return; - } - if (uniform.isArrayOfArrays()) - { - defineArrayUniformElements(shaderType, uniform, fullName, encoder, uniformMap); - return; - } - - // Not a struct. Arrays are treated as aggregate types. - if (uniform.isArray() && encoder) - { - encoder->enterAggregateType(); - } - - // Advance the uniform offset, to track registers allocation for structs - sh::BlockMemberInfo blockInfo = - encoder ? encoder->encodeType(uniform.type, uniform.arraySizes, false) - : sh::BlockMemberInfo::getDefaultBlockInfo(); - - auto uniformMapEntry = uniformMap->find(fullName); - D3DUniform *d3dUniform = nullptr; - - if (uniformMapEntry != uniformMap->end()) - { - d3dUniform = uniformMapEntry->second; - } - else - { - d3dUniform = new D3DUniform(uniform.type, fullName, uniform.arraySizes, true); - (*uniformMap)[fullName] = d3dUniform; - } - - if (encoder) - { - d3dUniform->registerElement = - static_cast<unsigned int>(sh::HLSLBlockEncoder::getBlockRegisterElement(blockInfo)); - unsigned int reg = - static_cast<unsigned int>(sh::HLSLBlockEncoder::getBlockRegister(blockInfo)); - if (shaderType == GL_FRAGMENT_SHADER) - { - d3dUniform->psRegisterIndex = reg; - } - else if (shaderType == GL_VERTEX_SHADER) - { - d3dUniform->vsRegisterIndex = reg; - } - else - { - ASSERT(shaderType == GL_COMPUTE_SHADER); - d3dUniform->csRegisterIndex = reg; - } - - // Arrays are treated as aggregate types - if (uniform.isArray()) - { - encoder->exitAggregateType(); - } - } -} - -// Assume count is already clamped. -template <typename T> -void ProgramD3D::setUniformImpl(const gl::VariableLocation &locationInfo, - GLsizei count, - const T *v, - uint8_t *targetData, - GLenum uniformType) -{ - D3DUniform *targetUniform = mD3DUniforms[locationInfo.index]; - const int components = targetUniform->typeInfo.componentCount; - const unsigned int arrayElementOffset = locationInfo.arrayIndex; - - if (targetUniform->typeInfo.type == uniformType) - { - T *dest = reinterpret_cast<T *>(targetData) + arrayElementOffset * 4; - const T *source = v; - - for (GLint i = 0; i < count; i++, dest += 4, source += components) - { - memcpy(dest, source, components * sizeof(T)); - } - } - else - { - ASSERT(targetUniform->typeInfo.type == gl::VariableBoolVectorType(uniformType)); - GLint *boolParams = reinterpret_cast<GLint *>(targetData) + arrayElementOffset * 4; - - for (GLint i = 0; i < count; i++) - { - GLint *dest = boolParams + (i * 4); - const T *source = v + (i * components); - - for (int c = 0; c < components; c++) - { - dest[c] = (source[c] == static_cast<T>(0)) ? GL_FALSE : GL_TRUE; - } - } - } -} - -template <typename T> -void ProgramD3D::setUniformInternal(GLint location, GLsizei count, const T *v, GLenum uniformType) -{ - const gl::VariableLocation &locationInfo = mState.getUniformLocations()[location]; - D3DUniform *targetUniform = mD3DUniforms[locationInfo.index]; - - if (targetUniform->typeInfo.isSampler) - { - ASSERT(uniformType == GL_INT); - size_t size = count * sizeof(T); - GLint *dest = &targetUniform->mSamplerData[locationInfo.arrayIndex]; - if (memcmp(dest, v, size) != 0) - { - memcpy(dest, v, size); - mDirtySamplerMapping = true; - } - return; - } - - if (targetUniform->vsData) - { - setUniformImpl(locationInfo, count, v, targetUniform->vsData, uniformType); - mVertexUniformsDirty = true; - } - - if (targetUniform->psData) - { - setUniformImpl(locationInfo, count, v, targetUniform->psData, uniformType); - mFragmentUniformsDirty = true; - } - - if (targetUniform->csData) - { - setUniformImpl(locationInfo, count, v, targetUniform->csData, uniformType); - mComputeUniformsDirty = true; - } -} - -template <int cols, int rows> -bool ProgramD3D::setUniformMatrixfvImpl(GLint location, - GLsizei countIn, - GLboolean transpose, - const GLfloat *value, - uint8_t *targetData, - GLenum targetUniformType) -{ - D3DUniform *targetUniform = getD3DUniformFromLocation(location); - - unsigned int elementCount = targetUniform->getArraySizeProduct(); - unsigned int arrayElementOffset = mState.getUniformLocations()[location].arrayIndex; - unsigned int count = - std::min(elementCount - arrayElementOffset, static_cast<unsigned int>(countIn)); - - const unsigned int targetMatrixStride = (4 * rows); - GLfloat *target = reinterpret_cast<GLfloat *>( - targetData + arrayElementOffset * sizeof(GLfloat) * targetMatrixStride); - - bool dirty = false; - - for (unsigned int i = 0; i < count; i++) - { - // Internally store matrices as transposed versions to accomodate HLSL matrix indexing - if (transpose == GL_FALSE) - { - dirty = TransposeExpandMatrix<GLfloat, cols, rows>(target, value) || dirty; - } - else - { - dirty = ExpandMatrix<GLfloat, cols, rows>(target, value) || dirty; - } - target += targetMatrixStride; - value += cols * rows; - } - - return dirty; -} - -template <int cols, int rows> -void ProgramD3D::setUniformMatrixfvInternal(GLint location, - GLsizei countIn, - GLboolean transpose, - const GLfloat *value, - GLenum targetUniformType) -{ - D3DUniform *targetUniform = getD3DUniformFromLocation(location); - - if (targetUniform->vsData) - { - if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value, - targetUniform->vsData, targetUniformType)) - { - mVertexUniformsDirty = true; - } - } - - if (targetUniform->psData) - { - if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value, - targetUniform->psData, targetUniformType)) - { - mFragmentUniformsDirty = true; - } - } - - if (targetUniform->csData) - { - if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value, - targetUniform->csData, targetUniformType)) - { - mComputeUniformsDirty = true; - } - } -} - -void ProgramD3D::assignAllSamplerRegisters() -{ - for (size_t uniformIndex = 0; uniformIndex < mD3DUniforms.size(); ++uniformIndex) - { - if (mD3DUniforms[uniformIndex]->isSampler()) - { - assignSamplerRegisters(uniformIndex); - } - } -} - -void ProgramD3D::assignSamplerRegisters(size_t uniformIndex) -{ - D3DUniform *d3dUniform = mD3DUniforms[uniformIndex]; - ASSERT(d3dUniform->isSampler()); - // If the uniform is an array of arrays, then we have separate entries for each inner array in - // mD3DUniforms. However, the sampler register info is stored in the shader only for the - // outermost array. - std::vector<unsigned int> subscripts; - const std::string baseName = gl::ParseResourceName(d3dUniform->name, &subscripts); - unsigned int registerOffset = mState.getUniforms()[uniformIndex].flattenedOffsetInParentArrays * - d3dUniform->getArraySizeProduct(); - - const gl::Shader *computeShader = mState.getAttachedComputeShader(); - if (computeShader) - { - const ShaderD3D *computeShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedComputeShader()); - ASSERT(computeShaderD3D->hasUniform(baseName)); - d3dUniform->csRegisterIndex = - computeShaderD3D->getUniformRegister(baseName) + registerOffset; - ASSERT(d3dUniform->csRegisterIndex != GL_INVALID_INDEX); - AssignSamplers(d3dUniform->csRegisterIndex, d3dUniform->typeInfo, - d3dUniform->getArraySizeProduct(), mSamplersCS, &mUsedComputeSamplerRange); - } - else - { - const ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedVertexShader()); - const ShaderD3D *fragmentShaderD3D = - GetImplAs<ShaderD3D>(mState.getAttachedFragmentShader()); - ASSERT(vertexShaderD3D->hasUniform(baseName) || fragmentShaderD3D->hasUniform(baseName)); - if (vertexShaderD3D->hasUniform(baseName)) - { - d3dUniform->vsRegisterIndex = - vertexShaderD3D->getUniformRegister(baseName) + registerOffset; - ASSERT(d3dUniform->vsRegisterIndex != GL_INVALID_INDEX); - AssignSamplers(d3dUniform->vsRegisterIndex, d3dUniform->typeInfo, - d3dUniform->getArraySizeProduct(), mSamplersVS, - &mUsedVertexSamplerRange); - } - if (fragmentShaderD3D->hasUniform(baseName)) - { - d3dUniform->psRegisterIndex = - fragmentShaderD3D->getUniformRegister(baseName) + registerOffset; - ASSERT(d3dUniform->psRegisterIndex != GL_INVALID_INDEX); - AssignSamplers(d3dUniform->psRegisterIndex, d3dUniform->typeInfo, - d3dUniform->getArraySizeProduct(), mSamplersPS, &mUsedPixelSamplerRange); - } - } -} - -// static -void ProgramD3D::AssignSamplers(unsigned int startSamplerIndex, - const gl::UniformTypeInfo &typeInfo, - unsigned int samplerCount, - std::vector<Sampler> &outSamplers, - GLuint *outUsedRange) -{ - unsigned int samplerIndex = startSamplerIndex; - - do - { - ASSERT(samplerIndex < outSamplers.size()); - Sampler *sampler = &outSamplers[samplerIndex]; - sampler->active = true; - sampler->textureType = typeInfo.samplerTextureType; - sampler->logicalTextureUnit = 0; - *outUsedRange = std::max(samplerIndex + 1, *outUsedRange); - samplerIndex++; - } while (samplerIndex < startSamplerIndex + samplerCount); -} - -void ProgramD3D::reset() -{ - mVertexExecutables.clear(); - mPixelExecutables.clear(); - - for (auto &geometryExecutable : mGeometryExecutables) - { - geometryExecutable.reset(nullptr); - } - - mComputeExecutable.reset(nullptr); - - mVertexHLSL.clear(); - mVertexWorkarounds = angle::CompilerWorkaroundsD3D(); - - mPixelHLSL.clear(); - mPixelWorkarounds = angle::CompilerWorkaroundsD3D(); - mUsesFragDepth = false; - mHasANGLEMultiviewEnabled = false; - mUsesViewID = false; - mPixelShaderKey.clear(); - mUsesPointSize = false; - mUsesFlatInterpolation = false; - - SafeDeleteContainer(mD3DUniforms); - mD3DUniformBlocks.clear(); - - mVertexUniformStorage.reset(nullptr); - mFragmentUniformStorage.reset(nullptr); - mComputeUniformStorage.reset(nullptr); - - mSamplersPS.clear(); - mSamplersVS.clear(); - mSamplersCS.clear(); - - mUsedVertexSamplerRange = 0; - mUsedPixelSamplerRange = 0; - mUsedComputeSamplerRange = 0; - mDirtySamplerMapping = true; - - mAttribLocationToD3DSemantic.fill(-1); - - mStreamOutVaryings.clear(); - - mGeometryShaderPreamble.clear(); - - dirtyAllUniforms(); - - mCachedPixelExecutableIndex.reset(); - mCachedVertexExecutableIndex.reset(); -} - -unsigned int ProgramD3D::getSerial() const -{ - return mSerial; -} - -unsigned int ProgramD3D::issueSerial() -{ - return mCurrentSerial++; -} - -void ProgramD3D::initAttribLocationsToD3DSemantic(const gl::Context *context) -{ - gl::Shader *vertexShader = mState.getAttachedVertexShader(); - ASSERT(vertexShader != nullptr); - - // Init semantic index - int semanticIndex = 0; - for (const sh::Attribute &attribute : vertexShader->getActiveAttributes(context)) - { - int regCount = gl::VariableRegisterCount(attribute.type); - GLuint location = mState.getAttributeLocation(attribute.name); - ASSERT(location != std::numeric_limits<GLuint>::max()); - - for (int reg = 0; reg < regCount; ++reg) - { - mAttribLocationToD3DSemantic[location + reg] = semanticIndex++; - } - } -} - -void ProgramD3D::updateCachedInputLayout(Serial associatedSerial, const gl::State &state) -{ - if (mCurrentVertexArrayStateSerial == associatedSerial) - { - return; - } - - mCurrentVertexArrayStateSerial = associatedSerial; - mCachedInputLayout.clear(); - - const auto &vertexAttributes = state.getVertexArray()->getVertexAttributes(); - - for (size_t locationIndex : mState.getActiveAttribLocationsMask()) - { - int d3dSemantic = mAttribLocationToD3DSemantic[locationIndex]; - - if (d3dSemantic != -1) - { - if (mCachedInputLayout.size() < static_cast<size_t>(d3dSemantic + 1)) - { - mCachedInputLayout.resize(d3dSemantic + 1, gl::VERTEX_FORMAT_INVALID); - } - mCachedInputLayout[d3dSemantic] = - GetVertexFormatType(vertexAttributes[locationIndex], - state.getVertexAttribCurrentValue(locationIndex).Type); - } - } - - VertexExecutable::getSignature(mRenderer, mCachedInputLayout, &mCachedVertexSignature); - - updateCachedVertexExecutableIndex(); -} - -void ProgramD3D::updateCachedOutputLayout(const gl::Context *context, - const gl::Framebuffer *framebuffer) -{ - mPixelShaderOutputLayoutCache.clear(); - - FramebufferD3D *fboD3D = GetImplAs<FramebufferD3D>(framebuffer); - const auto &colorbuffers = fboD3D->getColorAttachmentsForRender(context); - - for (size_t colorAttachment = 0; colorAttachment < colorbuffers.size(); ++colorAttachment) - { - const gl::FramebufferAttachment *colorbuffer = colorbuffers[colorAttachment]; - - if (colorbuffer) - { - auto binding = colorbuffer->getBinding() == GL_BACK ? GL_COLOR_ATTACHMENT0 - : colorbuffer->getBinding(); - mPixelShaderOutputLayoutCache.push_back(binding); - } - else - { - mPixelShaderOutputLayoutCache.push_back(GL_NONE); - } - } - - updateCachedPixelExecutableIndex(); -} - -void ProgramD3D::gatherTransformFeedbackVaryings(const gl::VaryingPacking &varyingPacking, - const BuiltinInfo &builtins) -{ - const std::string &varyingSemantic = - GetVaryingSemantic(mRenderer->getMajorShaderModel(), usesPointSize()); - - // Gather the linked varyings that are used for transform feedback, they should all exist. - mStreamOutVaryings.clear(); - - const auto &tfVaryingNames = mState.getTransformFeedbackVaryingNames(); - for (unsigned int outputSlot = 0; outputSlot < static_cast<unsigned int>(tfVaryingNames.size()); - ++outputSlot) - { - const auto &tfVaryingName = tfVaryingNames[outputSlot]; - if (tfVaryingName == "gl_Position") - { - if (builtins.glPosition.enabled) - { - mStreamOutVaryings.push_back(D3DVarying(builtins.glPosition.semantic, - builtins.glPosition.index, 4, outputSlot)); - } - } - else if (tfVaryingName == "gl_FragCoord") - { - if (builtins.glFragCoord.enabled) - { - mStreamOutVaryings.push_back(D3DVarying(builtins.glFragCoord.semantic, - builtins.glFragCoord.index, 4, outputSlot)); - } - } - else if (tfVaryingName == "gl_PointSize") - { - if (builtins.glPointSize.enabled) - { - mStreamOutVaryings.push_back(D3DVarying("PSIZE", 0, 1, outputSlot)); - } - } - else - { - std::vector<unsigned int> subscripts; - std::string baseName = gl::ParseResourceName(tfVaryingName, &subscripts); - size_t subscript = GL_INVALID_INDEX; - if (!subscripts.empty()) - { - subscript = subscripts.back(); - } - for (const auto ®isterInfo : varyingPacking.getRegisterList()) - { - const auto &varying = *registerInfo.packedVarying->varying; - GLenum transposedType = gl::TransposeMatrixType(varying.type); - int componentCount = gl::VariableColumnCount(transposedType); - ASSERT(!varying.isBuiltIn()); - - // Transform feedback for varying structs is underspecified. - // See Khronos bug 9856. - // TODO(jmadill): Figure out how to be spec-compliant here. - if (registerInfo.packedVarying->isStructField() || varying.isStruct()) - continue; - - // There can be more than one register assigned to a particular varying, and each - // register needs its own stream out entry. - if (baseName == registerInfo.packedVarying->varying->name && - (subscript == GL_INVALID_INDEX || subscript == registerInfo.varyingArrayIndex)) - { - mStreamOutVaryings.push_back(D3DVarying( - varyingSemantic, registerInfo.semanticIndex, componentCount, outputSlot)); - } - } - } - } -} - -D3DUniform *ProgramD3D::getD3DUniformFromLocation(GLint location) -{ - return mD3DUniforms[mState.getUniformLocations()[location].index]; -} - -const D3DUniform *ProgramD3D::getD3DUniformFromLocation(GLint location) const -{ - return mD3DUniforms[mState.getUniformLocations()[location].index]; -} - -void ProgramD3D::setPathFragmentInputGen(const std::string &inputName, - GLenum genMode, - GLint components, - const GLfloat *coeffs) -{ - UNREACHABLE(); -} - -bool ProgramD3D::hasVertexExecutableForCachedInputLayout() -{ - return mCachedVertexExecutableIndex.valid(); -} - -bool ProgramD3D::hasGeometryExecutableForPrimitiveType(GLenum drawMode) -{ - if (!usesGeometryShader(drawMode)) - { - // No shader necessary mean we have the required (null) executable. - return true; - } - - gl::PrimitiveType geometryShaderType = GetGeometryShaderTypeFromDrawMode(drawMode); - return mGeometryExecutables[geometryShaderType].get() != nullptr; -} - -bool ProgramD3D::hasPixelExecutableForCachedOutputLayout() -{ - return mCachedPixelExecutableIndex.valid(); -} - -template <typename DestT> -void ProgramD3D::getUniformInternal(GLint location, DestT *dataOut) const -{ - const gl::VariableLocation &locationInfo = mState.getUniformLocations()[location]; - const gl::LinkedUniform &uniform = mState.getUniforms()[locationInfo.index]; - - const D3DUniform *targetUniform = getD3DUniformFromLocation(location); - const uint8_t *srcPointer = targetUniform->getDataPtrToElement(locationInfo.arrayIndex); - - if (gl::IsMatrixType(uniform.type)) - { - GetMatrixUniform(gl::VariableColumnCount(uniform.type), gl::VariableRowCount(uniform.type), - dataOut, reinterpret_cast<const DestT *>(srcPointer)); - } - else - { - memcpy(dataOut, srcPointer, uniform.getElementSize()); - } -} - -void ProgramD3D::getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const -{ - getUniformInternal(location, params); -} - -void ProgramD3D::getUniformiv(const gl::Context *context, GLint location, GLint *params) const -{ - getUniformInternal(location, params); -} - -void ProgramD3D::getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const -{ - getUniformInternal(location, params); -} - -void ProgramD3D::updateCachedVertexExecutableIndex() -{ - mCachedVertexExecutableIndex.reset(); - for (size_t executableIndex = 0; executableIndex < mVertexExecutables.size(); executableIndex++) - { - if (mVertexExecutables[executableIndex]->matchesSignature(mCachedVertexSignature)) - { - mCachedVertexExecutableIndex = executableIndex; - break; - } - } -} - -void ProgramD3D::updateCachedPixelExecutableIndex() -{ - mCachedPixelExecutableIndex.reset(); - for (size_t executableIndex = 0; executableIndex < mPixelExecutables.size(); executableIndex++) - { - if (mPixelExecutables[executableIndex]->matchesSignature(mPixelShaderOutputLayoutCache)) - { - mCachedPixelExecutableIndex = executableIndex; - break; - } - } -} - -void ProgramD3D::linkResources(const gl::Context *context, - const gl::ProgramLinkedResources &resources) -{ - UniformBlockInfo uniformBlockInfo; - - if (mState.getAttachedVertexShader()) - { - uniformBlockInfo.getShaderBlockInfo(context, mState.getAttachedVertexShader()); - } - - if (mState.getAttachedFragmentShader()) - { - uniformBlockInfo.getShaderBlockInfo(context, mState.getAttachedFragmentShader()); - } - - if (mState.getAttachedComputeShader()) - { - uniformBlockInfo.getShaderBlockInfo(context, mState.getAttachedComputeShader()); - } - - // Gather interface block info. - auto getUniformBlockSize = [&uniformBlockInfo](const std::string &name, - const std::string &mappedName, size_t *sizeOut) { - return uniformBlockInfo.getBlockSize(name, mappedName, sizeOut); - }; - - auto getUniformBlockMemberInfo = [&uniformBlockInfo](const std::string &name, - const std::string &mappedName, - sh::BlockMemberInfo *infoOut) { - return uniformBlockInfo.getBlockMemberInfo(name, mappedName, infoOut); - }; - - resources.uniformBlockLinker.linkBlocks(getUniformBlockSize, getUniformBlockMemberInfo); - initializeUniformBlocks(); - - // TODO(jiajia.qin@intel.com): Determine correct shader storage block info. - auto getShaderStorageBlockSize = [](const std::string &name, const std::string &mappedName, - size_t *sizeOut) { - *sizeOut = 0; - return true; - }; - - auto getShaderStorageBlockMemberInfo = - [](const std::string &name, const std::string &mappedName, sh::BlockMemberInfo *infoOut) { - *infoOut = sh::BlockMemberInfo::getDefaultBlockInfo(); - return true; - }; - - resources.shaderStorageBlockLinker.linkBlocks(getShaderStorageBlockSize, - getShaderStorageBlockMemberInfo); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.h deleted file mode 100644 index 829757a73e..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.h +++ /dev/null @@ -1,523 +0,0 @@ -// -// Copyright (c) 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. -// - -// ProgramD3D.h: Defines the rx::ProgramD3D class which implements rx::ProgramImpl. - -#ifndef LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_ -#define LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_ - -#include <string> -#include <vector> - -#include "compiler/translator/blocklayoutHLSL.h" -#include "libANGLE/Constants.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/ProgramImpl.h" -#include "libANGLE/renderer/d3d/DynamicHLSL.h" -#include "platform/WorkaroundsD3D.h" - -namespace rx -{ -class RendererD3D; -class UniformStorageD3D; -class ShaderExecutableD3D; - -#if !defined(ANGLE_COMPILE_OPTIMIZATION_LEVEL) -// WARNING: D3DCOMPILE_OPTIMIZATION_LEVEL3 may lead to a DX9 shader compiler hang. -// It should only be used selectively to work around specific bugs. -#define ANGLE_COMPILE_OPTIMIZATION_LEVEL D3DCOMPILE_OPTIMIZATION_LEVEL1 -#endif - -// Helper struct representing a single shader uniform -// TODO(jmadill): Make uniform blocks shared between all programs, so we don't need separate -// register indices. -struct D3DUniform : private angle::NonCopyable -{ - D3DUniform(GLenum type, - const std::string &nameIn, - const std::vector<unsigned int> &arraySizesIn, - bool defaultBlock); - ~D3DUniform(); - - bool isSampler() const; - - bool isArray() const { return !arraySizes.empty(); } - unsigned int getArraySizeProduct() const; - - bool isReferencedByVertexShader() const; - bool isReferencedByFragmentShader() const; - bool isReferencedByComputeShader() const; - - const uint8_t *firstNonNullData() const; - const uint8_t *getDataPtrToElement(size_t elementIndex) const; - - // Duplicated from the GL layer - const gl::UniformTypeInfo &typeInfo; - std::string name; // Names of arrays don't include [0], unlike at the GL layer. - std::vector<unsigned int> arraySizes; - - // Pointer to a system copies of the data. Separate pointers for each uniform storage type. - uint8_t *vsData; - uint8_t *psData; - uint8_t *csData; - - // Register information. - unsigned int vsRegisterIndex; - unsigned int psRegisterIndex; - unsigned int csRegisterIndex; - unsigned int registerCount; - - // Register "elements" are used for uniform structs in ES3, to appropriately identify single - // uniforms - // inside aggregate types, which are packed according C-like structure rules. - unsigned int registerElement; - - // Special buffer for sampler values. - std::vector<GLint> mSamplerData; -}; - -struct D3DUniformBlock -{ - D3DUniformBlock() - : vsRegisterIndex(GL_INVALID_INDEX), - psRegisterIndex(GL_INVALID_INDEX), - csRegisterIndex(GL_INVALID_INDEX) - { - } - - bool vertexStaticUse() const { return vsRegisterIndex != GL_INVALID_INDEX; } - - bool fragmentStaticUse() const { return psRegisterIndex != GL_INVALID_INDEX; } - - bool computeStaticUse() const { return csRegisterIndex != GL_INVALID_INDEX; } - - unsigned int vsRegisterIndex; - unsigned int psRegisterIndex; - unsigned int csRegisterIndex; -}; - -struct D3DVarying final -{ - D3DVarying(); - D3DVarying(const std::string &semanticNameIn, - unsigned int semanticIndexIn, - unsigned int componentCountIn, - unsigned int outputSlotIn); - - D3DVarying(const D3DVarying &) = default; - D3DVarying &operator=(const D3DVarying &) = default; - - std::string semanticName; - unsigned int semanticIndex; - unsigned int componentCount; - unsigned int outputSlot; -}; - -class ProgramD3DMetadata final : angle::NonCopyable -{ - public: - ProgramD3DMetadata(RendererD3D *renderer, - const ShaderD3D *vertexShader, - const ShaderD3D *fragmentShader); - - int getRendererMajorShaderModel() const; - bool usesBroadcast(const gl::ContextState &data) const; - bool usesFragDepth() const; - bool usesPointCoord() const; - bool usesFragCoord() const; - bool usesPointSize() const; - bool usesInsertedPointCoordValue() const; - bool usesViewScale() const; - bool hasANGLEMultiviewEnabled() const; - bool usesViewID() const; - bool canSelectViewInVertexShader() const; - bool addsPointCoordToVertexShader() const; - bool usesTransformFeedbackGLPosition() const; - bool usesSystemValuePointSize() const; - bool usesMultipleFragmentOuts() const; - GLint getMajorShaderVersion() const; - const ShaderD3D *getFragmentShader() const; - - private: - const int mRendererMajorShaderModel; - const std::string mShaderModelSuffix; - const bool mUsesInstancedPointSpriteEmulation; - const bool mUsesViewScale; - const bool mHasANGLEMultiviewEnabled; - const bool mUsesViewID; - const bool mCanSelectViewInVertexShader; - const ShaderD3D *mVertexShader; - const ShaderD3D *mFragmentShader; -}; - -class ProgramD3D : public ProgramImpl -{ - public: - ProgramD3D(const gl::ProgramState &data, RendererD3D *renderer); - ~ProgramD3D() override; - - const std::vector<PixelShaderOutputVariable> &getPixelShaderKey() { return mPixelShaderKey; } - - GLint getSamplerMapping(gl::SamplerType type, - unsigned int samplerIndex, - const gl::Caps &caps) const; - GLenum getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const; - GLuint getUsedSamplerRange(gl::SamplerType type) const; - - enum SamplerMapping - { - WasDirty, - WasClean, - }; - - SamplerMapping updateSamplerMapping(); - - bool usesPointSize() const { return mUsesPointSize; } - bool usesPointSpriteEmulation() const; - bool usesGeometryShader(GLenum drawMode) const; - bool usesGeometryShaderForPointSpriteEmulation() const; - bool usesInstancedPointSpriteEmulation() const; - - gl::LinkResult load(const gl::Context *context, - gl::InfoLog &infoLog, - gl::BinaryInputStream *stream) override; - void save(const gl::Context *context, gl::BinaryOutputStream *stream) override; - void setBinaryRetrievableHint(bool retrievable) override; - void setSeparable(bool separable) override; - - gl::Error getVertexExecutableForCachedInputLayout(ShaderExecutableD3D **outExectuable, - gl::InfoLog *infoLog); - gl::Error getGeometryExecutableForPrimitiveType(const gl::Context *context, - GLenum drawMode, - ShaderExecutableD3D **outExecutable, - gl::InfoLog *infoLog); - gl::Error getPixelExecutableForCachedOutputLayout(ShaderExecutableD3D **outExectuable, - gl::InfoLog *infoLog); - gl::Error getComputeExecutable(ShaderExecutableD3D **outExecutable); - gl::LinkResult link(const gl::Context *context, - const gl::ProgramLinkedResources &resources, - gl::InfoLog &infoLog) override; - GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override; - - void setPathFragmentInputGen(const std::string &inputName, - GLenum genMode, - GLint components, - const GLfloat *coeffs) override; - - void initializeUniformStorage(); - void updateUniformBufferCache(const gl::Caps &caps, - unsigned int reservedVertex, - unsigned int reservedFragment); - const std::vector<GLint> &getVertexUniformBufferCache() const; - const std::vector<GLint> &getFragmentUniformBufferCache() const; - - void dirtyAllUniforms(); - - void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override; - void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override; - void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override; - void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override; - void setUniform1iv(GLint location, GLsizei count, const GLint *v) override; - void setUniform2iv(GLint location, GLsizei count, const GLint *v) override; - void setUniform3iv(GLint location, GLsizei count, const GLint *v) override; - void setUniform4iv(GLint location, GLsizei count, const GLint *v) override; - void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override; - void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override; - void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override; - void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override; - void setUniformMatrix2fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) override; - void setUniformMatrix3fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) override; - void setUniformMatrix4fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) override; - void setUniformMatrix2x3fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) override; - void setUniformMatrix3x2fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) override; - void setUniformMatrix2x4fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) override; - void setUniformMatrix4x2fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) override; - void setUniformMatrix3x4fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) override; - void setUniformMatrix4x3fv(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value) override; - - void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override; - void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override; - void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override; - - void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) override; - - UniformStorageD3D &getVertexUniformStorage() const { return *mVertexUniformStorage.get(); } - UniformStorageD3D &getFragmentUniformStorage() const { return *mFragmentUniformStorage.get(); } - UniformStorageD3D &getComputeUniformStorage() const { return *mComputeUniformStorage.get(); } - - unsigned int getSerial() const; - - const AttribIndexArray &getAttribLocationToD3DSemantics() const - { - return mAttribLocationToD3DSemantic; - } - - void updateCachedInputLayout(Serial associatedSerial, const gl::State &state); - void updateCachedOutputLayout(const gl::Context *context, const gl::Framebuffer *framebuffer); - - bool isSamplerMappingDirty() { return mDirtySamplerMapping; } - - // Checks if we need to recompile certain shaders. - bool hasVertexExecutableForCachedInputLayout(); - bool hasGeometryExecutableForPrimitiveType(GLenum drawMode); - bool hasPixelExecutableForCachedOutputLayout(); - - bool areVertexUniformsDirty() const { return mVertexUniformsDirty; } - bool areFragmentUniformsDirty() const { return mFragmentUniformsDirty; } - bool areComputeUniformsDirty() const { return mComputeUniformsDirty; } - const std::vector<D3DUniform *> &getD3DUniforms() const { return mD3DUniforms; } - void markUniformsClean(); - - private: - // These forward-declared tasks are used for multi-thread shader compiles. - class GetExecutableTask; - class GetVertexExecutableTask; - class GetPixelExecutableTask; - class GetGeometryExecutableTask; - - class VertexExecutable - { - public: - enum HLSLAttribType - { - FLOAT, - UNSIGNED_INT, - SIGNED_INT, - }; - - typedef std::vector<HLSLAttribType> Signature; - - VertexExecutable(const gl::InputLayout &inputLayout, - const Signature &signature, - ShaderExecutableD3D *shaderExecutable); - ~VertexExecutable(); - - bool matchesSignature(const Signature &signature) const; - static void getSignature(RendererD3D *renderer, - const gl::InputLayout &inputLayout, - Signature *signatureOut); - - const gl::InputLayout &inputs() const { return mInputs; } - const Signature &signature() const { return mSignature; } - ShaderExecutableD3D *shaderExecutable() const { return mShaderExecutable; } - - private: - static HLSLAttribType GetAttribType(GLenum type); - - gl::InputLayout mInputs; - Signature mSignature; - ShaderExecutableD3D *mShaderExecutable; - }; - - class PixelExecutable - { - public: - PixelExecutable(const std::vector<GLenum> &outputSignature, - ShaderExecutableD3D *shaderExecutable); - ~PixelExecutable(); - - bool matchesSignature(const std::vector<GLenum> &signature) const - { - return mOutputSignature == signature; - } - - const std::vector<GLenum> &outputSignature() const { return mOutputSignature; } - ShaderExecutableD3D *shaderExecutable() const { return mShaderExecutable; } - - private: - std::vector<GLenum> mOutputSignature; - ShaderExecutableD3D *mShaderExecutable; - }; - - struct Sampler - { - Sampler(); - - bool active; - GLint logicalTextureUnit; - GLenum textureType; - }; - - typedef std::map<std::string, D3DUniform *> D3DUniformMap; - - void defineUniformsAndAssignRegisters(const gl::Context *context); - void defineUniformBase(const gl::Shader *shader, - const sh::Uniform &uniform, - D3DUniformMap *uniformMap); - void defineStructUniformFields(GLenum shaderType, - const std::vector<sh::ShaderVariable> &fields, - const std::string &namePrefix, - sh::HLSLBlockEncoder *encoder, - D3DUniformMap *uniformMap); - void defineArrayOfStructsUniformFields(GLenum shaderType, - const sh::ShaderVariable &uniform, - unsigned int arrayNestingIndex, - const std::string &prefix, - sh::HLSLBlockEncoder *encoder, - D3DUniformMap *uniformMap); - void defineArrayUniformElements(GLenum shaderType, - const sh::ShaderVariable &uniform, - const std::string &fullName, - sh::HLSLBlockEncoder *encoder, - D3DUniformMap *uniformMap); - void defineUniform(GLenum shaderType, - const sh::ShaderVariable &uniform, - const std::string &fullName, - sh::HLSLBlockEncoder *encoder, - D3DUniformMap *uniformMap); - void assignAllSamplerRegisters(); - void assignSamplerRegisters(size_t uniformIndex); - - static void AssignSamplers(unsigned int startSamplerIndex, - const gl::UniformTypeInfo &typeInfo, - unsigned int samplerCount, - std::vector<Sampler> &outSamplers, - GLuint *outUsedRange); - - template <typename DestT> - void getUniformInternal(GLint location, DestT *dataOut) const; - - template <typename T> - void setUniformImpl(const gl::VariableLocation &locationInfo, - GLsizei count, - const T *v, - uint8_t *targetData, - GLenum uniformType); - - template <typename T> - void setUniformInternal(GLint location, GLsizei count, const T *v, GLenum uniformType); - - template <int cols, int rows> - bool setUniformMatrixfvImpl(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value, - uint8_t *targetData, - GLenum targetUniformType); - - template <int cols, int rows> - void setUniformMatrixfvInternal(GLint location, - GLsizei count, - GLboolean transpose, - const GLfloat *value, - GLenum targetUniformType); - - gl::LinkResult compileProgramExecutables(const gl::Context *context, gl::InfoLog &infoLog); - gl::LinkResult compileComputeExecutable(const gl::Context *context, gl::InfoLog &infoLog); - - void gatherTransformFeedbackVaryings(const gl::VaryingPacking &varyings, - const BuiltinInfo &builtins); - D3DUniform *getD3DUniformByName(const std::string &name); - D3DUniform *getD3DUniformFromLocation(GLint location); - const D3DUniform *getD3DUniformFromLocation(GLint location) const; - - void initAttribLocationsToD3DSemantic(const gl::Context *context); - - void reset(); - void initializeUniformBlocks(); - - void updateCachedInputLayoutFromShader(const gl::Context *context); - void updateCachedOutputLayoutFromShader(); - void updateCachedVertexExecutableIndex(); - void updateCachedPixelExecutableIndex(); - - void linkResources(const gl::Context *context, const gl::ProgramLinkedResources &resources); - - RendererD3D *mRenderer; - DynamicHLSL *mDynamicHLSL; - - std::vector<std::unique_ptr<VertexExecutable>> mVertexExecutables; - std::vector<std::unique_ptr<PixelExecutable>> mPixelExecutables; - std::vector<std::unique_ptr<ShaderExecutableD3D>> mGeometryExecutables; - std::unique_ptr<ShaderExecutableD3D> mComputeExecutable; - - std::string mVertexHLSL; - angle::CompilerWorkaroundsD3D mVertexWorkarounds; - - std::string mPixelHLSL; - angle::CompilerWorkaroundsD3D mPixelWorkarounds; - bool mUsesFragDepth; - bool mHasANGLEMultiviewEnabled; - bool mUsesViewID; - std::vector<PixelShaderOutputVariable> mPixelShaderKey; - - // Common code for all dynamic geometry shaders. Consists mainly of the GS input and output - // structures, built from the linked varying info. We store the string itself instead of the - // packed varyings for simplicity. - std::string mGeometryShaderPreamble; - - bool mUsesPointSize; - bool mUsesFlatInterpolation; - - std::unique_ptr<UniformStorageD3D> mVertexUniformStorage; - std::unique_ptr<UniformStorageD3D> mFragmentUniformStorage; - std::unique_ptr<UniformStorageD3D> mComputeUniformStorage; - - std::vector<Sampler> mSamplersPS; - std::vector<Sampler> mSamplersVS; - std::vector<Sampler> mSamplersCS; - GLuint mUsedVertexSamplerRange; - GLuint mUsedPixelSamplerRange; - GLuint mUsedComputeSamplerRange; - bool mDirtySamplerMapping; - - // Cache for pixel shader output layout to save reallocations. - std::vector<GLenum> mPixelShaderOutputLayoutCache; - Optional<size_t> mCachedPixelExecutableIndex; - - AttribIndexArray mAttribLocationToD3DSemantic; - - unsigned int mSerial; - - std::vector<GLint> mVertexUBOCache; - std::vector<GLint> mFragmentUBOCache; - VertexExecutable::Signature mCachedVertexSignature; - gl::InputLayout mCachedInputLayout; - Optional<size_t> mCachedVertexExecutableIndex; - - std::vector<D3DVarying> mStreamOutVaryings; - std::vector<D3DUniform *> mD3DUniforms; - std::vector<D3DUniformBlock> mD3DUniformBlocks; - - bool mVertexUniformsDirty; - bool mFragmentUniformsDirty; - bool mComputeUniformsDirty; - - static unsigned int issueSerial(); - static unsigned int mCurrentSerial; - - Serial mCurrentVertexArrayStateSerial; -}; -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.cpp deleted file mode 100644 index 84b30aa106..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// -// Copyright (c) 2012-2015 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. -// - -// RenderTargetD3D.cpp: Implements serial handling for rx::RenderTargetD3D - -#include "libANGLE/renderer/d3d/RenderTargetD3D.h" - -namespace rx -{ -unsigned int RenderTargetD3D::mCurrentSerial = 1; - -RenderTargetD3D::RenderTargetD3D() - : mSerial(issueSerials(1)) -{ -} - -RenderTargetD3D::~RenderTargetD3D() -{ -} - -unsigned int RenderTargetD3D::getSerial() const -{ - return mSerial; -} - -unsigned int RenderTargetD3D::issueSerials(unsigned int count) -{ - unsigned int firstSerial = mCurrentSerial; - mCurrentSerial += count; - return firstSerial; -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.h deleted file mode 100644 index fde96133b0..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.h +++ /dev/null @@ -1,47 +0,0 @@ -// -// Copyright (c) 2012-2015 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. -// - -// RenderTargetD3D.h: Defines an abstract wrapper class to manage IDirect3DSurface9 -// and ID3D11View objects belonging to renderbuffers and renderable textures. - -#ifndef LIBANGLE_RENDERER_D3D_RENDERTARGETD3D_H_ -#define LIBANGLE_RENDERER_D3D_RENDERTARGETD3D_H_ - -#include "common/angleutils.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/FramebufferAttachment.h" - -namespace rx -{ - -class RenderTargetD3D : public FramebufferAttachmentRenderTarget -{ - public: - RenderTargetD3D(); - ~RenderTargetD3D() override; - - virtual GLsizei getWidth() const = 0; - virtual GLsizei getHeight() const = 0; - virtual GLsizei getDepth() const = 0; - virtual GLenum getInternalFormat() const = 0; - virtual GLsizei getSamples() const = 0; - gl::Extents getExtents() const { return gl::Extents(getWidth(), getHeight(), getDepth()); } - bool isMultisampled() const { return getSamples() > 0; } - - virtual unsigned int getSerial() const; - static unsigned int issueSerials(unsigned int count); - - // Only currently applies to D3D11. - virtual void signalDirty(const gl::Context *context) {} - - private: - const unsigned int mSerial; - static unsigned int mCurrentSerial; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_RENDERTARGETD3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp deleted file mode 100644 index d799e0b992..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp +++ /dev/null @@ -1,130 +0,0 @@ -// -// Copyright (c) 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. -// - -// RenderbufferD3d.cpp: Implements the RenderbufferD3D class, a specialization of RenderbufferImpl - - -#include "libANGLE/renderer/d3d/RenderbufferD3D.h" - -#include "libANGLE/Image.h" -#include "libANGLE/renderer/d3d/EGLImageD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/RenderTargetD3D.h" - -namespace rx -{ -RenderbufferD3D::RenderbufferD3D(RendererD3D *renderer) - : mRenderer(renderer), mRenderTarget(nullptr), mImage(nullptr) -{ -} - -RenderbufferD3D::~RenderbufferD3D() -{ - SafeDelete(mRenderTarget); - mImage = nullptr; -} - -gl::Error RenderbufferD3D::onDestroy(const gl::Context *context) -{ - deleteRenderTarget(context); - return gl::NoError(); -} - -gl::Error RenderbufferD3D::setStorage(const gl::Context *context, - GLenum internalformat, - size_t width, - size_t height) -{ - return setStorageMultisample(context, 0, internalformat, width, height); -} - -gl::Error RenderbufferD3D::setStorageMultisample(const gl::Context *context, - size_t samples, - GLenum internalformat, - size_t width, - size_t height) -{ - // If the renderbuffer parameters are queried, the calling function - // will expect one of the valid renderbuffer formats for use in - // glRenderbufferStorage, but we should create depth and stencil buffers - // as DEPTH24_STENCIL8 - GLenum creationFormat = internalformat; - if (internalformat == GL_DEPTH_COMPONENT16 || internalformat == GL_STENCIL_INDEX8) - { - creationFormat = GL_DEPTH24_STENCIL8_OES; - } - - // ANGLE_framebuffer_multisample states GL_OUT_OF_MEMORY is generated on a failure to create - // the specified storage. - // Because ES 3.0 already knows the exact number of supported samples, it would already have been - // validated and generated GL_INVALID_VALUE. - const gl::TextureCaps &formatCaps = mRenderer->getNativeTextureCaps().get(creationFormat); - if (samples > formatCaps.getMaxSamples()) - { - return gl::OutOfMemory() << "Renderbuffer format does not support " << samples - << " samples, " << formatCaps.getMaxSamples() - << " is the maximum."; - } - - RenderTargetD3D *newRT = nullptr; - ANGLE_TRY(mRenderer->createRenderTarget(static_cast<int>(width), static_cast<int>(height), - creationFormat, static_cast<GLsizei>(samples), &newRT)); - - deleteRenderTarget(context); - mImage = nullptr; - mRenderTarget = newRT; - - return gl::NoError(); -} - -gl::Error RenderbufferD3D::setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) -{ - mImage = GetImplAs<EGLImageD3D>(image); - deleteRenderTarget(context); - - return gl::NoError(); -} - -gl::Error RenderbufferD3D::getRenderTarget(const gl::Context *context, - RenderTargetD3D **outRenderTarget) -{ - if (mImage) - { - return mImage->getRenderTarget(context, outRenderTarget); - } - else - { - *outRenderTarget = mRenderTarget; - return gl::NoError(); - } -} - -gl::Error RenderbufferD3D::getAttachmentRenderTarget(const gl::Context *context, - GLenum /*binding*/, - const gl::ImageIndex & /*imageIndex*/, - FramebufferAttachmentRenderTarget **rtOut) -{ - return getRenderTarget(context, reinterpret_cast<RenderTargetD3D **>(rtOut)); -} - -void RenderbufferD3D::deleteRenderTarget(const gl::Context *context) -{ - if (mRenderTarget) - { - mRenderTarget->signalDirty(context); - SafeDelete(mRenderTarget); - } -} - -gl::Error RenderbufferD3D::initializeContents(const gl::Context *context, - const gl::ImageIndex &imageIndex) -{ - RenderTargetD3D *renderTarget = nullptr; - ANGLE_TRY(getRenderTarget(context, &renderTarget)); - return mRenderer->initRenderTarget(renderTarget); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h deleted file mode 100644 index b50eff7db7..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// Copyright (c) 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. -// - -// RenderbufferD3d.h: Defines the RenderbufferD3D class which implements RenderbufferImpl. - -#ifndef LIBANGLE_RENDERER_D3D_RENDERBUFFERD3D_H_ -#define LIBANGLE_RENDERER_D3D_RENDERBUFFERD3D_H_ - -#include "angle_gl.h" - -#include "common/angleutils.h" -#include "libANGLE/renderer/RenderbufferImpl.h" - -namespace rx -{ -class EGLImageD3D; -class RendererD3D; -class RenderTargetD3D; -class SwapChainD3D; - -class RenderbufferD3D : public RenderbufferImpl -{ - public: - RenderbufferD3D(RendererD3D *renderer); - ~RenderbufferD3D() override; - - gl::Error onDestroy(const gl::Context *context) override; - - gl::Error setStorage(const gl::Context *context, - GLenum internalformat, - size_t width, - size_t height) override; - gl::Error setStorageMultisample(const gl::Context *context, - size_t samples, - GLenum internalformat, - size_t width, - size_t height) override; - gl::Error setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override; - - gl::Error getRenderTarget(const gl::Context *context, RenderTargetD3D **outRenderTarget); - gl::Error getAttachmentRenderTarget(const gl::Context *context, - GLenum binding, - const gl::ImageIndex &imageIndex, - FramebufferAttachmentRenderTarget **rtOut) override; - - gl::Error initializeContents(const gl::Context *context, - const gl::ImageIndex &imageIndex) override; - - private: - void deleteRenderTarget(const gl::Context *context); - - RendererD3D *mRenderer; - RenderTargetD3D *mRenderTarget; - EGLImageD3D *mImage; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_RENDERBUFFERD3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp deleted file mode 100644 index 2167200a91..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp +++ /dev/null @@ -1,260 +0,0 @@ -// -// Copyright (c) 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. -// - -// RendererD3D.cpp: Implementation of the base D3D Renderer. - -#include "libANGLE/renderer/d3d/RendererD3D.h" - -#include "common/MemoryBuffer.h" -#include "common/debug.h" -#include "common/utilities.h" -#include "libANGLE/Context.h" -#include "libANGLE/Display.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/ImageIndex.h" -#include "libANGLE/ResourceManager.h" -#include "libANGLE/State.h" -#include "libANGLE/VertexArray.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/ContextImpl.h" -#include "libANGLE/renderer/TextureImpl.h" -#include "libANGLE/renderer/d3d/BufferD3D.h" -#include "libANGLE/renderer/d3d/DeviceD3D.h" -#include "libANGLE/renderer/d3d/DisplayD3D.h" -#include "libANGLE/renderer/d3d/IndexDataManager.h" -#include "libANGLE/renderer/d3d/ProgramD3D.h" -#include "libANGLE/renderer/d3d/SamplerD3D.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" - -namespace rx -{ - -RendererD3D::RendererD3D(egl::Display *display) - : mDisplay(display), - mPresentPathFastEnabled(false), - mCapsInitialized(false), - mWorkaroundsInitialized(false), - mDisjoint(false), - mDeviceLost(false), - mWorkerThreadPool(4) -{ -} - -RendererD3D::~RendererD3D() -{ - cleanup(); -} - -void RendererD3D::cleanup() -{ - mIncompleteTextures.onDestroy(mDisplay->getProxyContext()); -} - -bool RendererD3D::skipDraw(const gl::State &glState, GLenum drawMode) -{ - if (drawMode == GL_POINTS) - { - bool usesPointSize = GetImplAs<ProgramD3D>(glState.getProgram())->usesPointSize(); - - // ProgramBinary assumes non-point rendering if gl_PointSize isn't written, - // which affects varying interpolation. Since the value of gl_PointSize is - // undefined when not written, just skip drawing to avoid unexpected results. - if (!usesPointSize && !glState.isTransformFeedbackActiveUnpaused()) - { - // Notify developers of risking undefined behavior. - WARN() << "Point rendering without writing to gl_PointSize."; - return true; - } - } - else if (gl::IsTriangleMode(drawMode)) - { - if (glState.getRasterizerState().cullFace && - glState.getRasterizerState().cullMode == gl::CullFaceMode::FrontAndBack) - { - return true; - } - } - - return false; -} - -gl::Error RendererD3D::getIncompleteTexture(const gl::Context *context, - GLenum type, - gl::Texture **textureOut) -{ - return mIncompleteTextures.getIncompleteTexture(context, type, this, textureOut); -} - -GLenum RendererD3D::getResetStatus() -{ - if (!mDeviceLost) - { - if (testDeviceLost()) - { - mDeviceLost = true; - notifyDeviceLost(); - return GL_UNKNOWN_CONTEXT_RESET_EXT; - } - return GL_NO_ERROR; - } - - if (testDeviceResettable()) - { - return GL_NO_ERROR; - } - - return GL_UNKNOWN_CONTEXT_RESET_EXT; -} - -void RendererD3D::notifyDeviceLost() -{ - mDisplay->notifyDeviceLost(); -} - -std::string RendererD3D::getVendorString() const -{ - LUID adapterLuid = {0}; - - if (getLUID(&adapterLuid)) - { - char adapterLuidString[64]; - sprintf_s(adapterLuidString, sizeof(adapterLuidString), "(adapter LUID: %08x%08x)", - adapterLuid.HighPart, adapterLuid.LowPart); - return std::string(adapterLuidString); - } - - return std::string(""); -} - -void RendererD3D::setGPUDisjoint() -{ - mDisjoint = true; -} - -GLint RendererD3D::getGPUDisjoint() -{ - bool disjoint = mDisjoint; - - // Disjoint flag is cleared when read - mDisjoint = false; - - return disjoint; -} - -GLint64 RendererD3D::getTimestamp() -{ - // D3D has no way to get an actual timestamp reliably so 0 is returned - return 0; -} - -void RendererD3D::ensureCapsInitialized() const -{ - if (!mCapsInitialized) - { - generateCaps(&mNativeCaps, &mNativeTextureCaps, &mNativeExtensions, &mNativeLimitations); - mCapsInitialized = true; - } -} - -const gl::Caps &RendererD3D::getNativeCaps() const -{ - ensureCapsInitialized(); - return mNativeCaps; -} - -const gl::TextureCapsMap &RendererD3D::getNativeTextureCaps() const -{ - ensureCapsInitialized(); - return mNativeTextureCaps; -} - -const gl::Extensions &RendererD3D::getNativeExtensions() const -{ - ensureCapsInitialized(); - return mNativeExtensions; -} - -const gl::Limitations &RendererD3D::getNativeLimitations() const -{ - ensureCapsInitialized(); - return mNativeLimitations; -} - -angle::WorkerThreadPool *RendererD3D::getWorkerThreadPool() -{ - return &mWorkerThreadPool; -} - -Serial RendererD3D::generateSerial() -{ - return mSerialFactory.generate(); -} - -bool InstancedPointSpritesActive(ProgramD3D *programD3D, GLenum mode) -{ - return programD3D->usesPointSize() && programD3D->usesInstancedPointSpriteEmulation() && - mode == GL_POINTS; -} - -gl::Error RendererD3D::initRenderTarget(RenderTargetD3D *renderTarget) -{ - return clearRenderTarget(renderTarget, gl::ColorF(0, 0, 0, 0), 1, 0); -} - -gl::Error RendererD3D::initializeMultisampleTextureToBlack(const gl::Context *context, - gl::Texture *glTexture) -{ - ASSERT(glTexture->getTarget() == GL_TEXTURE_2D_MULTISAMPLE); - TextureD3D *textureD3D = GetImplAs<TextureD3D>(glTexture); - gl::ImageIndex index = gl::ImageIndex::Make2DMultisample(); - RenderTargetD3D *renderTarget = nullptr; - ANGLE_TRY(textureD3D->getRenderTarget(context, index, &renderTarget)); - return clearRenderTarget(renderTarget, gl::ColorF(0.0f, 0.0f, 0.0f, 1.0f), 1.0f, 0); -} - -unsigned int GetBlendSampleMask(const gl::State &glState, int samples) -{ - unsigned int mask = 0; - if (glState.isSampleCoverageEnabled()) - { - GLfloat coverageValue = glState.getSampleCoverageValue(); - if (coverageValue != 0) - { - float threshold = 0.5f; - - for (int i = 0; i < samples; ++i) - { - mask <<= 1; - - if ((i + 1) * coverageValue >= threshold) - { - threshold += 1.0f; - mask |= 1; - } - } - } - - bool coverageInvert = glState.getSampleCoverageInvert(); - if (coverageInvert) - { - mask = ~mask; - } - } - else - { - mask = 0xFFFFFFFF; - } - - if (glState.isSampleMaskEnabled()) - { - mask &= glState.getSampleMaskWord(0); - } - - return mask; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.h deleted file mode 100644 index dcc98f2ec6..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.h +++ /dev/null @@ -1,359 +0,0 @@ - -// Copyright (c) 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. -// - -// RendererD3D.h: Defines a back-end specific class for the DirectX renderer. - -#ifndef LIBANGLE_RENDERER_D3D_RENDERERD3D_H_ -#define LIBANGLE_RENDERER_D3D_RENDERERD3D_H_ - -#include <array> - -#include "common/Color.h" -#include "common/MemoryBuffer.h" -#include "common/debug.h" -#include "libANGLE/ContextState.h" -#include "libANGLE/Device.h" -#include "libANGLE/Version.h" -#include "libANGLE/WorkerThread.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/VertexDataManager.h" -#include "libANGLE/renderer/d3d/formatutilsD3D.h" -#include "libANGLE/renderer/renderer_utils.h" -#include "platform/WorkaroundsD3D.h" - -namespace egl -{ -class ConfigSet; -} - -namespace gl -{ -class FramebufferState; -class InfoLog; -class Texture; -struct LinkedVarying; -} - -namespace rx -{ -class ContextImpl; -struct D3DUniform; -struct D3DVarying; -class DeviceD3D; -class EGLImageD3D; -class FramebufferImpl; -class ImageD3D; -class IndexBuffer; -class NativeWindowD3D; -class ProgramD3D; -class RenderTargetD3D; -class ShaderExecutableD3D; -class SwapChainD3D; -class TextureStorage; -struct TranslatedIndexData; -class UniformStorageD3D; -class VertexBuffer; - -struct DeviceIdentifier -{ - UINT VendorId; - UINT DeviceId; - UINT SubSysId; - UINT Revision; - UINT FeatureLevel; -}; - -enum RendererClass -{ - RENDERER_D3D11, - RENDERER_D3D9 -}; - -// Useful for unit testing -class BufferFactoryD3D : angle::NonCopyable -{ - public: - BufferFactoryD3D() {} - virtual ~BufferFactoryD3D() {} - - virtual VertexBuffer *createVertexBuffer() = 0; - virtual IndexBuffer *createIndexBuffer() = 0; - - // TODO(jmadill): add VertexFormatCaps - virtual VertexConversionType getVertexConversionType(gl::VertexFormatType vertexFormatType) const = 0; - virtual GLenum getVertexComponentType(gl::VertexFormatType vertexFormatType) const = 0; - - // Warning: you should ensure binding really matches attrib.bindingIndex before using this - // function. - virtual gl::ErrorOrResult<unsigned int> getVertexSpaceRequired( - const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLsizei count, - GLsizei instances) const = 0; -}; - -using AttribIndexArray = std::array<int, gl::MAX_VERTEX_ATTRIBS>; - -class RendererD3D : public BufferFactoryD3D, public MultisampleTextureInitializer -{ - public: - explicit RendererD3D(egl::Display *display); - ~RendererD3D() override; - - virtual egl::Error initialize() = 0; - - virtual egl::ConfigSet generateConfigs() = 0; - virtual void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const = 0; - - virtual ContextImpl *createContext(const gl::ContextState &state) = 0; - - std::string getVendorString() const; - - virtual int getMinorShaderModel() const = 0; - virtual std::string getShaderModelSuffix() const = 0; - - // Direct3D Specific methods - virtual DeviceIdentifier getAdapterIdentifier() const = 0; - - virtual bool isValidNativeWindow(EGLNativeWindowType window) const = 0; - virtual NativeWindowD3D *createNativeWindow(EGLNativeWindowType window, - const egl::Config *config, - const egl::AttributeMap &attribs) const = 0; - - virtual SwapChainD3D *createSwapChain(NativeWindowD3D *nativeWindow, - HANDLE shareHandle, - IUnknown *d3dTexture, - GLenum backBufferFormat, - GLenum depthBufferFormat, - EGLint orientation, - EGLint samples) = 0; - virtual egl::Error getD3DTextureInfo(const egl::Config *configuration, - IUnknown *d3dTexture, - EGLint *width, - EGLint *height, - GLenum *fboFormat) const = 0; - virtual egl::Error validateShareHandle(const egl::Config *config, - HANDLE shareHandle, - const egl::AttributeMap &attribs) const = 0; - - virtual int getMajorShaderModel() const = 0; - - const angle::WorkaroundsD3D &getWorkarounds() const; - - // Pixel operations - virtual gl::Error copyImage2D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) = 0; - virtual gl::Error copyImageCube(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum target, - GLint level) = 0; - virtual gl::Error copyImage3D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) = 0; - virtual gl::Error copyImage2DArray(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) = 0; - - virtual gl::Error copyTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum destTarget, - GLint destLevel, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) = 0; - virtual gl::Error copyCompressedTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - TextureStorage *storage, - GLint destLevel) = 0; - - // RenderTarget creation - virtual gl::Error createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTargetD3D **outRT) = 0; - virtual gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) = 0; - - // Shader operations - virtual gl::Error loadExecutable(const uint8_t *function, - size_t length, - gl::ShaderType type, - const std::vector<D3DVarying> &streamOutVaryings, - bool separatedOutputBuffers, - ShaderExecutableD3D **outExecutable) = 0; - virtual gl::Error compileToExecutable(gl::InfoLog &infoLog, - const std::string &shaderHLSL, - gl::ShaderType type, - const std::vector<D3DVarying> &streamOutVaryings, - bool separatedOutputBuffers, - const angle::CompilerWorkaroundsD3D &workarounds, - ShaderExecutableD3D **outExectuable) = 0; - virtual gl::Error ensureHLSLCompilerInitialized() = 0; - - virtual UniformStorageD3D *createUniformStorage(size_t storageSize) = 0; - - // Image operations - virtual ImageD3D *createImage() = 0; - virtual gl::Error generateMipmap(const gl::Context *context, - ImageD3D *dest, - ImageD3D *source) = 0; - virtual gl::Error generateMipmapUsingD3D(const gl::Context *context, - TextureStorage *storage, - const gl::TextureState &textureState) = 0; - virtual gl::Error copyImage(const gl::Context *context, - ImageD3D *dest, - ImageD3D *source, - const gl::Rectangle &sourceRect, - const gl::Offset &destOffset, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) = 0; - virtual TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain) = 0; - virtual TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage, - RenderTargetD3D *renderTargetD3D) = 0; - virtual TextureStorage *createTextureStorageExternal( - egl::Stream *stream, - const egl::Stream::GLTextureDescription &desc) = 0; - virtual TextureStorage *createTextureStorage2D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly) = 0; - virtual TextureStorage *createTextureStorageCube(GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly) = 0; - virtual TextureStorage *createTextureStorage3D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels) = 0; - virtual TextureStorage *createTextureStorage2DArray(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels) = 0; - virtual TextureStorage *createTextureStorage2DMultisample(GLenum internalformat, - GLsizei width, - GLsizei height, - int levels, - int samples, - bool fixedSampleLocations) = 0; - - // Buffer-to-texture and Texture-to-buffer copies - virtual bool supportsFastCopyBufferToTexture(GLenum internalFormat) const = 0; - virtual gl::Error fastCopyBufferToTexture(const gl::Context *context, - const gl::PixelUnpackState &unpack, - unsigned int offset, - RenderTargetD3D *destRenderTarget, - GLenum destinationFormat, - GLenum sourcePixelsType, - const gl::Box &destArea) = 0; - - // Device lost - GLenum getResetStatus(); - void notifyDeviceLost(); - virtual bool resetDevice() = 0; - virtual bool testDeviceLost() = 0; - virtual bool testDeviceResettable() = 0; - - virtual RendererClass getRendererClass() const = 0; - virtual void *getD3DDevice() = 0; - - void setGPUDisjoint(); - - GLint getGPUDisjoint(); - GLint64 getTimestamp(); - - virtual gl::Error clearRenderTarget(RenderTargetD3D *renderTarget, - const gl::ColorF &clearColorValue, - const float clearDepthValue, - const unsigned int clearStencilValue) = 0; - - virtual egl::Error getEGLDevice(DeviceImpl **device) = 0; - - bool presentPathFastEnabled() const { return mPresentPathFastEnabled; } - - // Stream creation - virtual StreamProducerImpl *createStreamProducerD3DTextureNV12( - egl::Stream::ConsumerType consumerType, - const egl::AttributeMap &attribs) = 0; - - const gl::Caps &getNativeCaps() const; - const gl::TextureCapsMap &getNativeTextureCaps() const; - const gl::Extensions &getNativeExtensions() const; - const gl::Limitations &getNativeLimitations() const; - - // Necessary hack for default framebuffers in D3D. - virtual FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) = 0; - - virtual gl::Version getMaxSupportedESVersion() const = 0; - - gl::Error initRenderTarget(RenderTargetD3D *renderTarget); - - angle::WorkerThreadPool *getWorkerThreadPool(); - - gl::Error getIncompleteTexture(const gl::Context *context, - GLenum type, - gl::Texture **textureOut); - - Serial generateSerial(); - - virtual bool canSelectViewInVertexShader() const = 0; - - gl::Error initializeMultisampleTextureToBlack(const gl::Context *context, - gl::Texture *glTexture) override; - - protected: - virtual bool getLUID(LUID *adapterLuid) const = 0; - virtual void generateCaps(gl::Caps *outCaps, - gl::TextureCapsMap *outTextureCaps, - gl::Extensions *outExtensions, - gl::Limitations *outLimitations) const = 0; - - void cleanup(); - - bool skipDraw(const gl::State &glState, GLenum drawMode); - - egl::Display *mDisplay; - - bool mPresentPathFastEnabled; - - private: - void ensureCapsInitialized() const; - - virtual angle::WorkaroundsD3D generateWorkarounds() const = 0; - - mutable bool mCapsInitialized; - mutable gl::Caps mNativeCaps; - mutable gl::TextureCapsMap mNativeTextureCaps; - mutable gl::Extensions mNativeExtensions; - mutable gl::Limitations mNativeLimitations; - - IncompleteTextureSet mIncompleteTextures; - - mutable bool mWorkaroundsInitialized; - mutable angle::WorkaroundsD3D mWorkarounds; - - bool mDisjoint; - bool mDeviceLost; - - angle::WorkerThreadPool mWorkerThreadPool; - - SerialFactory mSerialFactory; -}; - -unsigned int GetBlendSampleMask(const gl::State &glState, int samples); -bool InstancedPointSpritesActive(ProgramD3D *programD3D, GLenum mode); - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_RENDERERD3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SamplerD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SamplerD3D.h deleted file mode 100644 index 3f8f5b9d8d..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SamplerD3D.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// 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. -// - -// SamplerD3D.h: Defines the rx::SamplerD3D class, an implementation of SamplerImpl. - -#ifndef LIBANGLE_RENDERER_D3D_SAMPLERD3D_H_ -#define LIBANGLE_RENDERER_D3D_SAMPLERD3D_H_ - -#include "libANGLE/renderer/SamplerImpl.h" - -namespace rx -{ - -class SamplerD3D : public SamplerImpl -{ - public: - SamplerD3D(const gl::SamplerState &state) : SamplerImpl(state) {} - ~SamplerD3D() override {} -}; -} - -#endif // LIBANGLE_RENDERER_D3D_SAMPLERD3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp deleted file mode 100644 index 2a8f1fb11c..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp +++ /dev/null @@ -1,247 +0,0 @@ -// -// Copyright (c) 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. -// - -// ShaderD3D.cpp: Defines the rx::ShaderD3D class which implements rx::ShaderImpl. - -#include "libANGLE/renderer/d3d/ShaderD3D.h" - -#include "common/utilities.h" -#include "libANGLE/Caps.h" -#include "libANGLE/Compiler.h" -#include "libANGLE/Shader.h" -#include "libANGLE/features.h" -#include "libANGLE/renderer/d3d/ProgramD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" - -// Definitions local to the translation unit -namespace -{ - -const char *GetShaderTypeString(GLenum type) -{ - switch (type) - { - case GL_VERTEX_SHADER: - return "VERTEX"; - - case GL_FRAGMENT_SHADER: - return "FRAGMENT"; - - case GL_COMPUTE_SHADER: - return "COMPUTE"; - - default: - UNREACHABLE(); - return ""; - } -} - -} // anonymous namespace - -namespace rx -{ - -ShaderD3D::ShaderD3D(const gl::ShaderState &data, - const angle::WorkaroundsD3D &workarounds, - const gl::Extensions &extensions) - : ShaderImpl(data), mAdditionalOptions(0) -{ - uncompile(); - - if (workarounds.expandIntegerPowExpressions) - { - mAdditionalOptions |= SH_EXPAND_SELECT_HLSL_INTEGER_POW_EXPRESSIONS; - } - - if (workarounds.getDimensionsIgnoresBaseLevel) - { - mAdditionalOptions |= SH_HLSL_GET_DIMENSIONS_IGNORES_BASE_LEVEL; - } - - if (workarounds.preAddTexelFetchOffsets) - { - mAdditionalOptions |= SH_REWRITE_TEXELFETCHOFFSET_TO_TEXELFETCH; - } - if (workarounds.rewriteUnaryMinusOperator) - { - mAdditionalOptions |= SH_REWRITE_INTEGER_UNARY_MINUS_OPERATOR; - } - if (workarounds.emulateIsnanFloat) - { - mAdditionalOptions |= SH_EMULATE_ISNAN_FLOAT_FUNCTION; - } - if (extensions.multiview) - { - mAdditionalOptions |= SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW; - } -} - -ShaderD3D::~ShaderD3D() -{ -} - -std::string ShaderD3D::getDebugInfo() const -{ - if (mDebugInfo.empty()) - { - return ""; - } - - return mDebugInfo + std::string("\n// ") + GetShaderTypeString(mData.getShaderType()) + - " SHADER END\n"; -} - -// initialize/clean up previous state -void ShaderD3D::uncompile() -{ - // set by compileToHLSL - mCompilerOutputType = SH_ESSL_OUTPUT; - - mUsesMultipleRenderTargets = false; - mUsesFragColor = false; - mUsesFragData = false; - mUsesFragCoord = false; - mUsesFrontFacing = false; - mUsesPointSize = false; - mUsesPointCoord = false; - mUsesDepthRange = false; - mUsesFragDepth = false; - mHasANGLEMultiviewEnabled = false; - mUsesViewID = false; - mUsesDiscardRewriting = false; - mUsesNestedBreak = false; - mRequiresIEEEStrictCompiling = false; - - mDebugInfo.clear(); -} - -void ShaderD3D::generateWorkarounds(angle::CompilerWorkaroundsD3D *workarounds) const -{ - if (mUsesDiscardRewriting) - { - // ANGLE issue 486: - // Work-around a D3D9 compiler bug that presents itself when using conditional discard, by disabling optimization - workarounds->skipOptimization = true; - } - else if (mUsesNestedBreak) - { - // ANGLE issue 603: - // Work-around a D3D9 compiler bug that presents itself when using break in a nested loop, by maximizing optimization - // We want to keep the use of ANGLE_D3D_WORKAROUND_MAX_OPTIMIZATION minimal to prevent hangs, so usesDiscard takes precedence - workarounds->useMaxOptimization = true; - } - - if (mRequiresIEEEStrictCompiling) - { - // IEEE Strictness for D3D compiler needs to be enabled for NaNs to work. - workarounds->enableIEEEStrictness = true; - } -} - -unsigned int ShaderD3D::getUniformRegister(const std::string &uniformName) const -{ - ASSERT(mUniformRegisterMap.count(uniformName) > 0); - return mUniformRegisterMap.find(uniformName)->second; -} - -unsigned int ShaderD3D::getUniformBlockRegister(const std::string &blockName) const -{ - ASSERT(mUniformBlockRegisterMap.count(blockName) > 0); - return mUniformBlockRegisterMap.find(blockName)->second; -} - -ShShaderOutput ShaderD3D::getCompilerOutputType() const -{ - return mCompilerOutputType; -} - -ShCompileOptions ShaderD3D::prepareSourceAndReturnOptions(std::stringstream *shaderSourceStream, - std::string *sourcePath) -{ - uncompile(); - - ShCompileOptions additionalOptions = 0; - - const std::string &source = mData.getSource(); - -#if !defined(ANGLE_ENABLE_WINDOWS_STORE) - if (gl::DebugAnnotationsActive()) - { - *sourcePath = getTempPath(); - writeFile(sourcePath->c_str(), source.c_str(), source.length()); - additionalOptions |= SH_LINE_DIRECTIVES | SH_SOURCE_PATH; - } -#endif - - additionalOptions |= mAdditionalOptions; - - *shaderSourceStream << source; - return additionalOptions; -} - -bool ShaderD3D::hasUniform(const std::string &name) const -{ - return mUniformRegisterMap.find(name) != mUniformRegisterMap.end(); -} - -const std::map<std::string, unsigned int> &GetUniformRegisterMap( - const std::map<std::string, unsigned int> *uniformRegisterMap) -{ - ASSERT(uniformRegisterMap); - return *uniformRegisterMap; -} - -bool ShaderD3D::postTranslateCompile(gl::Compiler *compiler, std::string *infoLog) -{ - // TODO(jmadill): We shouldn't need to cache this. - mCompilerOutputType = compiler->getShaderOutputType(); - - const std::string &translatedSource = mData.getTranslatedSource(); - - mUsesMultipleRenderTargets = translatedSource.find("GL_USES_MRT") != std::string::npos; - mUsesFragColor = translatedSource.find("GL_USES_FRAG_COLOR") != std::string::npos; - mUsesFragData = translatedSource.find("GL_USES_FRAG_DATA") != std::string::npos; - mUsesFragCoord = translatedSource.find("GL_USES_FRAG_COORD") != std::string::npos; - mUsesFrontFacing = translatedSource.find("GL_USES_FRONT_FACING") != std::string::npos; - mUsesPointSize = translatedSource.find("GL_USES_POINT_SIZE") != std::string::npos; - mUsesPointCoord = translatedSource.find("GL_USES_POINT_COORD") != std::string::npos; - mUsesDepthRange = translatedSource.find("GL_USES_DEPTH_RANGE") != std::string::npos; - mUsesFragDepth = translatedSource.find("GL_USES_FRAG_DEPTH") != std::string::npos; - mHasANGLEMultiviewEnabled = - translatedSource.find("GL_ANGLE_MULTIVIEW_ENABLED") != std::string::npos; - mUsesViewID = translatedSource.find("GL_USES_VIEW_ID") != std::string::npos; - mUsesDiscardRewriting = - translatedSource.find("ANGLE_USES_DISCARD_REWRITING") != std::string::npos; - mUsesNestedBreak = translatedSource.find("ANGLE_USES_NESTED_BREAK") != std::string::npos; - mRequiresIEEEStrictCompiling = - translatedSource.find("ANGLE_REQUIRES_IEEE_STRICT_COMPILING") != std::string::npos; - - ShHandle compilerHandle = compiler->getCompilerHandle(mData.getShaderType()); - - mUniformRegisterMap = GetUniformRegisterMap(sh::GetUniformRegisterMap(compilerHandle)); - - for (const sh::InterfaceBlock &interfaceBlock : mData.getUniformBlocks()) - { - if (interfaceBlock.staticUse) - { - unsigned int index = static_cast<unsigned int>(-1); - bool blockRegisterResult = - sh::GetUniformBlockRegister(compilerHandle, interfaceBlock.name, &index); - ASSERT(blockRegisterResult); - - mUniformBlockRegisterMap[interfaceBlock.name] = index; - } - } - - mDebugInfo += - std::string("// ") + GetShaderTypeString(mData.getShaderType()) + " SHADER BEGIN\n"; - mDebugInfo += "\n// GLSL BEGIN\n\n" + mData.getSource() + "\n\n// GLSL END\n\n\n"; - mDebugInfo += "// INITIAL HLSL BEGIN\n\n" + translatedSource + "\n// INITIAL HLSL END\n\n\n"; - // Successive steps will append more info - return true; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.h deleted file mode 100644 index f7b0b20db4..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.h +++ /dev/null @@ -1,99 +0,0 @@ -// -// Copyright (c) 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. -// - -// ShaderD3D.h: Defines the rx::ShaderD3D class which implements rx::ShaderImpl. - -#ifndef LIBANGLE_RENDERER_D3D_SHADERD3D_H_ -#define LIBANGLE_RENDERER_D3D_SHADERD3D_H_ - -#include "libANGLE/renderer/ShaderImpl.h" - -#include <map> - -namespace angle -{ -struct CompilerWorkaroundsD3D; -struct WorkaroundsD3D; -} - -namespace gl -{ -struct Extensions; -} - -namespace rx -{ -class DynamicHLSL; -class RendererD3D; -struct D3DUniform; - -class ShaderD3D : public ShaderImpl -{ - public: - ShaderD3D(const gl::ShaderState &data, - const angle::WorkaroundsD3D &workarounds, - const gl::Extensions &extensions); - ~ShaderD3D() override; - - // ShaderImpl implementation - ShCompileOptions prepareSourceAndReturnOptions(std::stringstream *sourceStream, - std::string *sourcePath) override; - bool postTranslateCompile(gl::Compiler *compiler, std::string *infoLog) override; - std::string getDebugInfo() const override; - - // D3D-specific methods - void uncompile(); - - bool hasUniform(const std::string &name) const; - - // Query regular uniforms with their name. Query sampler fields of structs with field selection - // using dot (.) operator. - unsigned int getUniformRegister(const std::string &uniformName) const; - - unsigned int getUniformBlockRegister(const std::string &blockName) const; - void appendDebugInfo(const std::string &info) const { mDebugInfo += info; } - - void generateWorkarounds(angle::CompilerWorkaroundsD3D *workarounds) const; - - bool usesMultipleRenderTargets() const { return mUsesMultipleRenderTargets; } - bool usesFragColor() const { return mUsesFragColor; } - bool usesFragData() const { return mUsesFragData; } - bool usesFragCoord() const { return mUsesFragCoord; } - bool usesFrontFacing() const { return mUsesFrontFacing; } - bool usesPointSize() const { return mUsesPointSize; } - bool usesPointCoord() const { return mUsesPointCoord; } - bool usesDepthRange() const { return mUsesDepthRange; } - bool usesFragDepth() const { return mUsesFragDepth; } - bool usesViewID() const { return mUsesViewID; } - bool hasANGLEMultiviewEnabled() const { return mHasANGLEMultiviewEnabled; } - - ShShaderOutput getCompilerOutputType() const; - - private: - bool mUsesMultipleRenderTargets; - bool mUsesFragColor; - bool mUsesFragData; - bool mUsesFragCoord; - bool mUsesFrontFacing; - bool mUsesPointSize; - bool mUsesPointCoord; - bool mUsesDepthRange; - bool mUsesFragDepth; - bool mHasANGLEMultiviewEnabled; - bool mUsesViewID; - bool mUsesDiscardRewriting; - bool mUsesNestedBreak; - bool mRequiresIEEEStrictCompiling; - - ShShaderOutput mCompilerOutputType; - mutable std::string mDebugInfo; - std::map<std::string, unsigned int> mUniformRegisterMap; - std::map<std::string, unsigned int> mUniformBlockRegisterMap; - ShCompileOptions mAdditionalOptions; -}; -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_SHADERD3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.cpp deleted file mode 100644 index 83a66bd1a5..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// -// Copyright (c) 2012-2015 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. -// - -// ShaderExecutable.cpp: Implements a class to contain D3D shader executable -// implementation details. - -#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h" - -#include "common/angleutils.h" - -namespace rx -{ - -ShaderExecutableD3D::ShaderExecutableD3D(const void *function, size_t length) - : mFunctionBuffer(length) -{ - memcpy(mFunctionBuffer.data(), function, length); -} - -ShaderExecutableD3D::~ShaderExecutableD3D() -{ -} - -const uint8_t *ShaderExecutableD3D::getFunction() const -{ - return mFunctionBuffer.data(); -} - -size_t ShaderExecutableD3D::getLength() const -{ - return mFunctionBuffer.size(); -} - -const std::string &ShaderExecutableD3D::getDebugInfo() const -{ - return mDebugInfo; -} - -void ShaderExecutableD3D::appendDebugInfo(const std::string &info) -{ - mDebugInfo += info; -} - -UniformStorageD3D::UniformStorageD3D(size_t initialSize) : mUniformData() -{ - bool result = mUniformData.resize(initialSize); - ASSERT(result); - - // Uniform data is zero-initialized by default. - mUniformData.fill(0); -} - -UniformStorageD3D::~UniformStorageD3D() -{ -} - -size_t UniformStorageD3D::size() const -{ - return mUniformData.size(); -} - -uint8_t *UniformStorageD3D::getDataPointer(unsigned int registerIndex, unsigned int registerElement) -{ - size_t offset = ((registerIndex * 4 + registerElement) * sizeof(float)); - return mUniformData.data() + offset; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.h deleted file mode 100644 index b8097710e2..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.h +++ /dev/null @@ -1,57 +0,0 @@ -// -// Copyright (c) 2012-2015 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. -// - -// ShaderExecutable.h: Defines a class to contain D3D shader executable -// implementation details. - -#ifndef LIBANGLE_RENDERER_D3D_SHADEREXECUTABLED3D_H_ -#define LIBANGLE_RENDERER_D3D_SHADEREXECUTABLED3D_H_ - -#include "common/MemoryBuffer.h" -#include "common/debug.h" - -#include <vector> -#include <cstdint> - -namespace rx -{ - -class ShaderExecutableD3D : angle::NonCopyable -{ - public: - ShaderExecutableD3D(const void *function, size_t length); - virtual ~ShaderExecutableD3D(); - - const uint8_t *getFunction() const; - - size_t getLength() const; - - const std::string &getDebugInfo() const; - - void appendDebugInfo(const std::string &info); - - private: - std::vector<uint8_t> mFunctionBuffer; - std::string mDebugInfo; -}; - -class UniformStorageD3D : angle::NonCopyable -{ - public: - UniformStorageD3D(size_t initialSize); - virtual ~UniformStorageD3D(); - - size_t size() const; - - uint8_t *getDataPointer(unsigned int registerIndex, unsigned int registerElement); - - private: - angle::MemoryBuffer mUniformData; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_SHADEREXECUTABLED3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp deleted file mode 100644 index 7657aef79e..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp +++ /dev/null @@ -1,509 +0,0 @@ -// -// Copyright (c) 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. -// - -// SurfaceD3D.cpp: D3D implementation of an EGL surface - -#include "libANGLE/renderer/d3d/SurfaceD3D.h" - -#include "libANGLE/Context.h" -#include "libANGLE/Display.h" -#include "libANGLE/Surface.h" -#include "libANGLE/renderer/d3d/RenderTargetD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/SwapChainD3D.h" - -#include <tchar.h> -#include <EGL/eglext.h> -#include <algorithm> - -namespace rx -{ - -SurfaceD3D::SurfaceD3D(const egl::SurfaceState &state, - RendererD3D *renderer, - egl::Display *display, - EGLNativeWindowType window, - EGLenum buftype, - EGLClientBuffer clientBuffer, - const egl::AttributeMap &attribs) - : SurfaceImpl(state), - mRenderer(renderer), - mDisplay(display), - mFixedSize(window == nullptr || attribs.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE), - mOrientation(static_cast<EGLint>(attribs.get(EGL_SURFACE_ORIENTATION_ANGLE, 0))), - mRenderTargetFormat(state.config->renderTargetFormat), - mDepthStencilFormat(state.config->depthStencilFormat), - mSwapChain(nullptr), - mSwapIntervalDirty(true), - mWindowSubclassed(false), - mNativeWindow(renderer->createNativeWindow(window, state.config, attribs)), - mWidth(static_cast<EGLint>(attribs.get(EGL_WIDTH, 0))), - mHeight(static_cast<EGLint>(attribs.get(EGL_HEIGHT, 0))), - mSwapInterval(1), - mShareHandle(0), - mD3DTexture(nullptr) -{ - subclassWindow(); - if (window != nullptr && !mFixedSize) - { - mWidth = -1; - mHeight = -1; - } - - switch (buftype) - { - case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE: - mShareHandle = static_cast<HANDLE>(clientBuffer); - break; - - case EGL_D3D_TEXTURE_ANGLE: - mD3DTexture = static_cast<IUnknown *>(clientBuffer); - ASSERT(mD3DTexture != nullptr); - mD3DTexture->AddRef(); - ANGLE_SWALLOW_ERR(mRenderer->getD3DTextureInfo(state.config, mD3DTexture, &mWidth, - &mHeight, &mRenderTargetFormat)); - break; - - default: - break; - } -} - -SurfaceD3D::~SurfaceD3D() -{ - unsubclassWindow(); - releaseSwapChain(); - SafeDelete(mNativeWindow); - SafeRelease(mD3DTexture); -} - -void SurfaceD3D::releaseSwapChain() -{ - SafeDelete(mSwapChain); -} - -egl::Error SurfaceD3D::initialize(const egl::Display *display) -{ - if (mNativeWindow->getNativeWindow()) - { - if (!mNativeWindow->initialize()) - { - return egl::EglBadSurface(); - } - } - - ANGLE_TRY(resetSwapChain(display)); - return egl::NoError(); -} - -FramebufferImpl *SurfaceD3D::createDefaultFramebuffer(const gl::FramebufferState &data) -{ - return mRenderer->createDefaultFramebuffer(data); -} - -egl::Error SurfaceD3D::bindTexImage(gl::Texture *, EGLint) -{ - return egl::NoError(); -} - -egl::Error SurfaceD3D::releaseTexImage(EGLint) -{ - return egl::NoError(); -} - -egl::Error SurfaceD3D::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) -{ - return mSwapChain->getSyncValues(ust, msc, sbc); -} - -egl::Error SurfaceD3D::resetSwapChain(const egl::Display *display) -{ - ASSERT(!mSwapChain); - - int width; - int height; - - if (!mFixedSize) - { - RECT windowRect; - if (!mNativeWindow->getClientRect(&windowRect)) - { - ASSERT(false); - - return egl::EglBadSurface() << "Could not retrieve the window dimensions"; - } - - width = windowRect.right - windowRect.left; - height = windowRect.bottom - windowRect.top; - } - else - { - // non-window surface - size is determined at creation - width = mWidth; - height = mHeight; - } - - mSwapChain = - mRenderer->createSwapChain(mNativeWindow, mShareHandle, mD3DTexture, mRenderTargetFormat, - mDepthStencilFormat, mOrientation, mState.config->samples); - if (!mSwapChain) - { - return egl::EglBadAlloc(); - } - - // This is a bit risky to pass the proxy context here, but it can happen at almost any time. - egl::Error error = resetSwapChain(display->getProxyContext(), width, height); - if (error.isError()) - { - SafeDelete(mSwapChain); - return error; - } - - return egl::NoError(); -} - -egl::Error SurfaceD3D::resizeSwapChain(const gl::Context *context, - int backbufferWidth, - int backbufferHeight) -{ - ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0); - ASSERT(mSwapChain); - - EGLint status = - mSwapChain->resize(context, std::max(1, backbufferWidth), std::max(1, backbufferHeight)); - - if (status == EGL_CONTEXT_LOST) - { - mDisplay->notifyDeviceLost(); - return egl::Error(status); - } - else if (status != EGL_SUCCESS) - { - return egl::Error(status); - } - - mWidth = backbufferWidth; - mHeight = backbufferHeight; - - return egl::NoError(); -} - -egl::Error SurfaceD3D::resetSwapChain(const gl::Context *context, - int backbufferWidth, - int backbufferHeight) -{ - ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0); - ASSERT(mSwapChain); - - EGLint status = mSwapChain->reset(context, std::max(1, backbufferWidth), - std::max(1, backbufferHeight), mSwapInterval); - - if (status == EGL_CONTEXT_LOST) - { - mRenderer->notifyDeviceLost(); - return egl::Error(status); - } - else if (status != EGL_SUCCESS) - { - return egl::Error(status); - } - - mWidth = backbufferWidth; - mHeight = backbufferHeight; - mSwapIntervalDirty = false; - - return egl::NoError(); -} - -egl::Error SurfaceD3D::swapRect(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height) -{ - if (!mSwapChain) - { - return egl::NoError(); - } - - if (x + width > mWidth) - { - width = mWidth - x; - } - - if (y + height > mHeight) - { - height = mHeight - y; - } - - if (width != 0 && height != 0) - { - EGLint status = mSwapChain->swapRect(context, x, y, width, height); - - if (status == EGL_CONTEXT_LOST) - { - mRenderer->notifyDeviceLost(); - return egl::Error(status); - } - else if (status != EGL_SUCCESS) - { - return egl::Error(status); - } - } - - ANGLE_TRY(checkForOutOfDateSwapChain(context)); - - return egl::NoError(); -} - -#if !defined(ANGLE_ENABLE_WINDOWS_STORE) -#define kSurfaceProperty _TEXT("Egl::SurfaceOwner") -#define kParentWndProc _TEXT("Egl::SurfaceParentWndProc") -#define kDisplayProperty _TEXT("Egl::Display") - -static LRESULT CALLBACK SurfaceWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) -{ - if (message == WM_SIZE) - { - SurfaceD3D* surf = reinterpret_cast<SurfaceD3D*>(GetProp(hwnd, kSurfaceProperty)); - if(surf) - { - egl::Display *display = reinterpret_cast<egl::Display *>(GetProp(hwnd, kDisplayProperty)); - surf->checkForOutOfDateSwapChain(display->getProxyContext()); - } - } - WNDPROC prevWndFunc = reinterpret_cast<WNDPROC >(GetProp(hwnd, kParentWndProc)); - return CallWindowProc(prevWndFunc, hwnd, message, wparam, lparam); -} -#endif - -void SurfaceD3D::subclassWindow() -{ -#if !defined(ANGLE_ENABLE_WINDOWS_STORE) - HWND window = mNativeWindow->getNativeWindow(); - if (!window) - { - return; - } - - DWORD processId; - DWORD threadId = GetWindowThreadProcessId(window, &processId); - if (processId != GetCurrentProcessId() || threadId != GetCurrentThreadId()) - { - return; - } - - SetLastError(0); - LONG_PTR oldWndProc = SetWindowLongPtr(window, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(SurfaceWindowProc)); - if(oldWndProc == 0 && GetLastError() != ERROR_SUCCESS) - { - mWindowSubclassed = false; - return; - } - - SetProp(window, kSurfaceProperty, reinterpret_cast<HANDLE>(this)); - SetProp(window, kParentWndProc, reinterpret_cast<HANDLE>(oldWndProc)); - SetProp(window, kDisplayProperty, reinterpret_cast<HANDLE>(mDisplay)); - mWindowSubclassed = true; -#endif -} - -void SurfaceD3D::unsubclassWindow() -{ - if (!mWindowSubclassed) - { - return; - } - -#if !defined(ANGLE_ENABLE_WINDOWS_STORE) - HWND window = mNativeWindow->getNativeWindow(); - if (!window) - { - return; - } - - // un-subclass - LONG_PTR parentWndFunc = reinterpret_cast<LONG_PTR>(GetProp(window, kParentWndProc)); - - // Check the windowproc is still SurfaceWindowProc. - // If this assert fails, then it is likely the application has subclassed the - // hwnd as well and did not unsubclass before destroying its EGL context. The - // application should be modified to either subclass before initializing the - // EGL context, or to unsubclass before destroying the EGL context. - if(parentWndFunc) - { - LONG_PTR prevWndFunc = SetWindowLongPtr(window, GWLP_WNDPROC, parentWndFunc); - ASSERT(prevWndFunc == reinterpret_cast<LONG_PTR>(SurfaceWindowProc)); - } - - RemoveProp(window, kSurfaceProperty); - RemoveProp(window, kParentWndProc); - RemoveProp(window, kDisplayProperty); -#endif - mWindowSubclassed = false; -} - - -egl::Error SurfaceD3D::checkForOutOfDateSwapChain(const gl::Context *context) -{ - RECT client; - int clientWidth = getWidth(); - int clientHeight = getHeight(); - bool sizeDirty = false; - if (!mFixedSize && !mNativeWindow->isIconic()) - { - // The window is automatically resized to 150x22 when it's minimized, but the swapchain shouldn't be resized - // because that's not a useful size to render to. - if (!mNativeWindow->getClientRect(&client)) - { - UNREACHABLE(); - return egl::NoError(); - } - - // Grow the buffer now, if the window has grown. We need to grow now to avoid losing information. - clientWidth = client.right - client.left; - clientHeight = client.bottom - client.top; - sizeDirty = clientWidth != getWidth() || clientHeight != getHeight(); - } - - if (mSwapIntervalDirty) - { - ANGLE_TRY(resetSwapChain(context, clientWidth, clientHeight)); - } - else if (sizeDirty) - { - ANGLE_TRY(resizeSwapChain(context, clientWidth, clientHeight)); - } - - return egl::NoError(); -} - -egl::Error SurfaceD3D::swap(const gl::Context *context) -{ - return swapRect(context, 0, 0, mWidth, mHeight); -} - -egl::Error SurfaceD3D::postSubBuffer(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height) -{ - return swapRect(context, x, y, width, height); -} - -rx::SwapChainD3D *SurfaceD3D::getSwapChain() const -{ - return mSwapChain; -} - -void SurfaceD3D::setSwapInterval(EGLint interval) -{ - if (mSwapInterval == interval) - { - return; - } - - mSwapInterval = interval; - mSwapIntervalDirty = true; -} - -EGLint SurfaceD3D::getWidth() const -{ - return mWidth; -} - -EGLint SurfaceD3D::getHeight() const -{ - return mHeight; -} - -EGLint SurfaceD3D::isPostSubBufferSupported() const -{ - // post sub buffer is always possible on D3D surfaces - return EGL_TRUE; -} - -EGLint SurfaceD3D::getSwapBehavior() const -{ - return EGL_BUFFER_PRESERVED; -} - -egl::Error SurfaceD3D::querySurfacePointerANGLE(EGLint attribute, void **value) -{ - if (attribute == EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE) - { - *value = mSwapChain->getShareHandle(); - } - else if (attribute == EGL_DXGI_KEYED_MUTEX_ANGLE) - { - *value = mSwapChain->getKeyedMutex(); - } - else if (attribute == EGL_DEVICE_EXT) - { - *value = mSwapChain->getDevice(); - } - else UNREACHABLE(); - - return egl::NoError(); -} - -gl::Error SurfaceD3D::getAttachmentRenderTarget(const gl::Context *context, - GLenum binding, - const gl::ImageIndex &imageIndex, - FramebufferAttachmentRenderTarget **rtOut) -{ - if (binding == GL_BACK) - { - *rtOut = mSwapChain->getColorRenderTarget(); - } - else - { - *rtOut = mSwapChain->getDepthStencilRenderTarget(); - } - return gl::NoError(); -} - -WindowSurfaceD3D::WindowSurfaceD3D(const egl::SurfaceState &state, - RendererD3D *renderer, - egl::Display *display, - EGLNativeWindowType window, - const egl::AttributeMap &attribs) - : SurfaceD3D(state, - renderer, - display, - window, - 0, - static_cast<EGLClientBuffer>(0), - attribs) -{ -} - -WindowSurfaceD3D::~WindowSurfaceD3D() -{ -} - -PbufferSurfaceD3D::PbufferSurfaceD3D(const egl::SurfaceState &state, - RendererD3D *renderer, - egl::Display *display, - EGLenum buftype, - EGLClientBuffer clientBuffer, - const egl::AttributeMap &attribs) - : SurfaceD3D(state, - renderer, - display, - static_cast<EGLNativeWindowType>(0), - buftype, - clientBuffer, - attribs) -{ -} - -PbufferSurfaceD3D::~PbufferSurfaceD3D() -{ -} - -} // namespace rc diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h deleted file mode 100644 index 01d2573244..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h +++ /dev/null @@ -1,136 +0,0 @@ -// -// Copyright (c) 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. -// - -// SurfaceD3D.h: D3D implementation of an EGL surface - -#ifndef LIBANGLE_RENDERER_D3D_SURFACED3D_H_ -#define LIBANGLE_RENDERER_D3D_SURFACED3D_H_ - -#include "libANGLE/renderer/SurfaceImpl.h" -#include "libANGLE/renderer/d3d/NativeWindowD3D.h" - -namespace egl -{ -class Surface; -} - -namespace rx -{ -class SwapChainD3D; -class RendererD3D; - -class SurfaceD3D : public SurfaceImpl -{ - public: - ~SurfaceD3D() override; - void releaseSwapChain(); - - egl::Error initialize(const egl::Display *display) override; - FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override; - - egl::Error swap(const gl::Context *context) override; - egl::Error postSubBuffer(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height) override; - egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override; - egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override; - egl::Error releaseTexImage(EGLint buffer) override; - egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) override; - void setSwapInterval(EGLint interval) override; - - EGLint getWidth() const override; - EGLint getHeight() const override; - - EGLint isPostSubBufferSupported() const override; - EGLint getSwapBehavior() const override; - - // D3D implementations - SwapChainD3D *getSwapChain() const; - - egl::Error resetSwapChain(const egl::Display *display); - - egl::Error checkForOutOfDateSwapChain(const gl::Context *context); - - gl::Error getAttachmentRenderTarget(const gl::Context *context, - GLenum binding, - const gl::ImageIndex &imageIndex, - FramebufferAttachmentRenderTarget **rtOut) override; - - protected: - SurfaceD3D(const egl::SurfaceState &state, - RendererD3D *renderer, - egl::Display *display, - EGLNativeWindowType window, - EGLenum buftype, - EGLClientBuffer clientBuffer, - const egl::AttributeMap &attribs); - - egl::Error swapRect(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height); - egl::Error resetSwapChain(const gl::Context *context, - int backbufferWidth, - int backbufferHeight); - egl::Error resizeSwapChain(const gl::Context *context, - int backbufferWidth, - int backbufferHeight); - - void subclassWindow(); - void unsubclassWindow(); - - RendererD3D *mRenderer; - egl::Display *mDisplay; - - bool mFixedSize; - GLint mOrientation; - - GLenum mRenderTargetFormat; - GLenum mDepthStencilFormat; - - SwapChainD3D *mSwapChain; - bool mSwapIntervalDirty; - bool mWindowSubclassed; // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking - - NativeWindowD3D *mNativeWindow; // Handler for the Window that the surface is created for. - EGLint mWidth; - EGLint mHeight; - - EGLint mSwapInterval; - - HANDLE mShareHandle; - IUnknown *mD3DTexture; -}; - -class WindowSurfaceD3D : public SurfaceD3D -{ - public: - WindowSurfaceD3D(const egl::SurfaceState &state, - RendererD3D *renderer, - egl::Display *display, - EGLNativeWindowType window, - const egl::AttributeMap &attribs); - ~WindowSurfaceD3D() override; -}; - -class PbufferSurfaceD3D : public SurfaceD3D -{ - public: - PbufferSurfaceD3D(const egl::SurfaceState &state, - RendererD3D *renderer, - egl::Display *display, - EGLenum buftype, - EGLClientBuffer clientBuffer, - const egl::AttributeMap &attribs); - ~PbufferSurfaceD3D() override; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_SURFACED3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.cpp deleted file mode 100644 index de8534c3da..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// SwapChainD3D.cpp: Defines a back-end specific class that hides the details of the -// implementation-specific swapchain. - -#include "libANGLE/renderer/d3d/SwapChainD3D.h" - -namespace rx -{ - -SwapChainD3D::SwapChainD3D(HANDLE shareHandle, - IUnknown *d3dTexture, - GLenum backBufferFormat, - GLenum depthBufferFormat) - : mOffscreenRenderTargetFormat(backBufferFormat), - mDepthBufferFormat(depthBufferFormat), - mShareHandle(shareHandle), - mD3DTexture(d3dTexture) -{ - if (mD3DTexture) - { - mD3DTexture->AddRef(); - } -} - -SwapChainD3D::~SwapChainD3D() -{ - SafeRelease(mD3DTexture); -} -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h deleted file mode 100644 index 017737b878..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h +++ /dev/null @@ -1,83 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// SwapChainD3D.h: Defines a back-end specific class that hides the details of the -// implementation-specific swapchain. - -#ifndef LIBANGLE_RENDERER_D3D_SWAPCHAIND3D_H_ -#define LIBANGLE_RENDERER_D3D_SWAPCHAIND3D_H_ - -#include <GLES2/gl2.h> -#include <EGL/egl.h> -#include <EGL/eglext.h> - -#include "common/angleutils.h" -#include "common/platform.h" -#include "libANGLE/Error.h" - -#if !defined(ANGLE_FORCE_VSYNC_OFF) -#define ANGLE_FORCE_VSYNC_OFF 0 -#endif - -namespace gl -{ -class Context; -} // namespace gl - -namespace egl -{ -class Display; -} // namespace egl - -namespace rx -{ -class RenderTargetD3D; - -class SwapChainD3D : angle::NonCopyable -{ - public: - SwapChainD3D(HANDLE shareHandle, - IUnknown *d3dTexture, - GLenum backBufferFormat, - GLenum depthBufferFormat); - virtual ~SwapChainD3D(); - - virtual EGLint resize(const gl::Context *context, - EGLint backbufferWidth, - EGLint backbufferSize) = 0; - virtual EGLint reset(const gl::Context *context, - EGLint backbufferWidth, - EGLint backbufferHeight, - EGLint swapInterval) = 0; - virtual EGLint swapRect(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height) = 0; - virtual void recreate() = 0; - virtual void *getDevice() { return nullptr; } - - virtual RenderTargetD3D *getColorRenderTarget() = 0; - virtual RenderTargetD3D *getDepthStencilRenderTarget() = 0; - - GLenum getRenderTargetInternalFormat() const { return mOffscreenRenderTargetFormat; } - GLenum getDepthBufferInternalFormat() const { return mDepthBufferFormat; } - - HANDLE getShareHandle() { return mShareHandle; } - virtual void *getKeyedMutex() = 0; - - virtual egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) = 0; - - protected: - const GLenum mOffscreenRenderTargetFormat; - const GLenum mDepthBufferFormat; - - HANDLE mShareHandle; - IUnknown *mD3DTexture; -}; - -} // namespace rx -#endif // LIBANGLE_RENDERER_D3D_SWAPCHAIND3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp deleted file mode 100644 index bf44cbb5d2..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp +++ /dev/null @@ -1,3974 +0,0 @@ -// -// 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.cpp: Implementations of the Texture interfaces shared betweeen the D3D backends. - -#include "libANGLE/renderer/d3d/TextureD3D.h" - -#include "common/mathutil.h" -#include "common/utilities.h" -#include "libANGLE/Buffer.h" -#include "libANGLE/Config.h" -#include "libANGLE/Context.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/Image.h" -#include "libANGLE/Surface.h" -#include "libANGLE/Texture.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/BufferImpl.h" -#include "libANGLE/renderer/d3d/BufferD3D.h" -#include "libANGLE/renderer/d3d/EGLImageD3D.h" -#include "libANGLE/renderer/d3d/ImageD3D.h" -#include "libANGLE/renderer/d3d/RenderTargetD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/SurfaceD3D.h" -#include "libANGLE/renderer/d3d/TextureStorage.h" - -namespace rx -{ - -namespace -{ - -gl::Error GetUnpackPointer(const gl::Context *context, - const gl::PixelUnpackState &unpack, - gl::Buffer *unpackBuffer, - const uint8_t *pixels, - ptrdiff_t layerOffset, - const uint8_t **pointerOut) -{ - if (unpackBuffer) - { - // Do a CPU readback here, if we have an unpack buffer bound and the fast GPU path is not supported - ptrdiff_t offset = reinterpret_cast<ptrdiff_t>(pixels); - - // TODO: this is the only place outside of renderer that asks for a buffers raw data. - // This functionality should be moved into renderer and the getData method of BufferImpl removed. - BufferD3D *bufferD3D = GetImplAs<BufferD3D>(unpackBuffer); - ASSERT(bufferD3D); - const uint8_t *bufferData = nullptr; - ANGLE_TRY(bufferD3D->getData(context, &bufferData)); - *pointerOut = bufferData + offset; - } - else - { - *pointerOut = pixels; - } - - // Offset the pointer for 2D array layer (if it's valid) - if (*pointerOut != nullptr) - { - *pointerOut += layerOffset; - } - - return gl::NoError(); -} - -bool IsRenderTargetUsage(GLenum usage) -{ - return (usage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE); -} - -} - -TextureD3D::TextureD3D(const gl::TextureState &state, RendererD3D *renderer) - : TextureImpl(state), - mRenderer(renderer), - mDirtyImages(true), - mImmutable(false), - mTexStorage(nullptr), - mBaseLevel(0) -{ -} - -TextureD3D::~TextureD3D() -{ - ASSERT(!mTexStorage); -} - -gl::Error TextureD3D::getNativeTexture(const gl::Context *context, TextureStorage **outStorage) -{ - // ensure the underlying texture is created - ANGLE_TRY(initializeStorage(context, false)); - - if (mTexStorage) - { - ANGLE_TRY(updateStorage(context)); - } - - ASSERT(outStorage); - - *outStorage = mTexStorage; - return gl::NoError(); -} - -gl::Error TextureD3D::getImageAndSyncFromStorage(const gl::Context *context, - const gl::ImageIndex &index, - ImageD3D **outImage) -{ - ImageD3D *image = getImage(index); - if (mTexStorage && mTexStorage->isRenderTarget()) - { - ANGLE_TRY(image->copyFromTexStorage(context, index, mTexStorage)); - mDirtyImages = true; - } - *outImage = image; - return gl::NoError(); -} - -GLint TextureD3D::getLevelZeroWidth() const -{ - ASSERT(gl::CountLeadingZeros(static_cast<uint32_t>(getBaseLevelWidth())) > getBaseLevel()); - return getBaseLevelWidth() << mBaseLevel; -} - -GLint TextureD3D::getLevelZeroHeight() const -{ - ASSERT(gl::CountLeadingZeros(static_cast<uint32_t>(getBaseLevelHeight())) > getBaseLevel()); - return getBaseLevelHeight() << mBaseLevel; -} - -GLint TextureD3D::getLevelZeroDepth() const -{ - return getBaseLevelDepth(); -} - -GLint TextureD3D::getBaseLevelWidth() const -{ - const ImageD3D *baseImage = getBaseLevelImage(); - return (baseImage ? baseImage->getWidth() : 0); -} - -GLint TextureD3D::getBaseLevelHeight() const -{ - const ImageD3D *baseImage = getBaseLevelImage(); - return (baseImage ? baseImage->getHeight() : 0); -} - -GLint TextureD3D::getBaseLevelDepth() const -{ - const ImageD3D *baseImage = getBaseLevelImage(); - return (baseImage ? baseImage->getDepth() : 0); -} - -// Note: "base level image" is loosely defined to be any image from the base level, -// where in the base of 2D array textures and cube maps there are several. Don't use -// the base level image for anything except querying texture format and size. -GLenum TextureD3D::getBaseLevelInternalFormat() const -{ - const ImageD3D *baseImage = getBaseLevelImage(); - return (baseImage ? baseImage->getInternalFormat() : GL_NONE); -} - -gl::Error TextureD3D::setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D::setStorageMultisample(const gl::Context *context, - GLenum target, - GLsizei samples, - GLint internalFormat, - const gl::Extents &size, - bool fixedSampleLocations) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -bool TextureD3D::shouldUseSetData(const ImageD3D *image) const -{ - if (!mRenderer->getWorkarounds().setDataFasterThanImageUpload) - { - return false; - } - - if (image->isDirty()) - { - return false; - } - - gl::InternalFormat internalFormat = gl::GetSizedInternalFormatInfo(image->getInternalFormat()); - - // We can only handle full updates for depth-stencil textures, so to avoid complications - // disable them entirely. - if (internalFormat.depthBits > 0 || internalFormat.stencilBits > 0) - { - return false; - } - - // TODO(jmadill): Handle compressed internal formats - return (mTexStorage && !internalFormat.compressed); -} - -gl::Error TextureD3D::setImageImpl(const gl::Context *context, - const gl::ImageIndex &index, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels, - ptrdiff_t layerOffset) -{ - ImageD3D *image = getImage(index); - gl::Buffer *unpackBuffer = - context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack); - ASSERT(image); - - // No-op - if (image->getWidth() == 0 || image->getHeight() == 0 || image->getDepth() == 0) - { - return gl::NoError(); - } - - // We no longer need the "GLenum format" parameter to TexImage to determine what data format "pixels" contains. - // From our image internal format we know how many channels to expect, and "type" gives the format of pixel's components. - const uint8_t *pixelData = nullptr; - ANGLE_TRY(GetUnpackPointer(context, unpack, unpackBuffer, pixels, layerOffset, &pixelData)); - - if (pixelData != nullptr) - { - if (shouldUseSetData(image)) - { - ANGLE_TRY( - mTexStorage->setData(context, index, image, nullptr, type, unpack, pixelData)); - } - else - { - gl::Box fullImageArea(0, 0, 0, image->getWidth(), image->getHeight(), image->getDepth()); - ANGLE_TRY( - image->loadData(context, fullImageArea, unpack, type, pixelData, index.is3D())); - } - - mDirtyImages = true; - } - - return gl::NoError(); -} - -gl::Error TextureD3D::subImage(const gl::Context *context, - const gl::ImageIndex &index, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels, - ptrdiff_t layerOffset) -{ - // CPU readback & copy where direct GPU copy is not supported - const uint8_t *pixelData = nullptr; - gl::Buffer *unpackBuffer = - context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack); - ANGLE_TRY(GetUnpackPointer(context, unpack, unpackBuffer, pixels, layerOffset, &pixelData)); - - if (pixelData != nullptr) - { - ImageD3D *image = getImage(index); - ASSERT(image); - - if (shouldUseSetData(image)) - { - return mTexStorage->setData(context, index, image, &area, type, unpack, pixelData); - } - - ANGLE_TRY(image->loadData(context, area, unpack, type, pixelData, index.is3D())); - ANGLE_TRY(commitRegion(context, index, area)); - mDirtyImages = true; - } - - return gl::NoError(); -} - -gl::Error TextureD3D::setCompressedImageImpl(const gl::Context *context, - const gl::ImageIndex &index, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels, - ptrdiff_t layerOffset) -{ - ImageD3D *image = getImage(index); - ASSERT(image); - - if (image->getWidth() == 0 || image->getHeight() == 0 || image->getDepth() == 0) - { - return gl::NoError(); - } - - // We no longer need the "GLenum format" parameter to TexImage to determine what data format "pixels" contains. - // From our image internal format we know how many channels to expect, and "type" gives the format of pixel's components. - const uint8_t *pixelData = nullptr; - gl::Buffer *unpackBuffer = - context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack); - ANGLE_TRY(GetUnpackPointer(context, unpack, unpackBuffer, pixels, layerOffset, &pixelData)); - - if (pixelData != nullptr) - { - gl::Box fullImageArea(0, 0, 0, image->getWidth(), image->getHeight(), image->getDepth()); - ANGLE_TRY(image->loadCompressedData(context, fullImageArea, pixelData)); - - mDirtyImages = true; - } - - return gl::NoError(); -} - -gl::Error TextureD3D::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) -{ - const uint8_t *pixelData = nullptr; - gl::Buffer *unpackBuffer = - context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack); - ANGLE_TRY(GetUnpackPointer(context, unpack, unpackBuffer, pixels, layerOffset, &pixelData)); - - if (pixelData != nullptr) - { - ImageD3D *image = getImage(index); - ASSERT(image); - - ANGLE_TRY(image->loadCompressedData(context, area, pixelData)); - - mDirtyImages = true; - } - - return gl::NoError(); -} - -bool TextureD3D::isFastUnpackable(const gl::Buffer *unpackBuffer, GLenum sizedInternalFormat) -{ - return unpackBuffer != nullptr && - mRenderer->supportsFastCopyBufferToTexture(sizedInternalFormat); -} - -gl::Error TextureD3D::fastUnpackPixels(const gl::Context *context, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels, - const gl::Box &destArea, - GLenum sizedInternalFormat, - GLenum type, - RenderTargetD3D *destRenderTarget) -{ - if (unpack.skipRows != 0 || unpack.skipPixels != 0 || unpack.imageHeight != 0 || - unpack.skipImages != 0) - { - // TODO(jmadill): additional unpack parameters - UNIMPLEMENTED(); - return gl::InternalError() << "Unimplemented pixel store parameters in fastUnpackPixels"; - } - - // No-op - if (destArea.width <= 0 && destArea.height <= 0 && destArea.depth <= 0) - { - return gl::NoError(); - } - - // In order to perform the fast copy through the shader, we must have the right format, and be able - // to create a render target. - ASSERT(mRenderer->supportsFastCopyBufferToTexture(sizedInternalFormat)); - - uintptr_t offset = reinterpret_cast<uintptr_t>(pixels); - - ANGLE_TRY(mRenderer->fastCopyBufferToTexture(context, unpack, static_cast<unsigned int>(offset), - destRenderTarget, sizedInternalFormat, type, - destArea)); - - return gl::NoError(); -} - -GLint TextureD3D::creationLevels(GLsizei width, GLsizei height, GLsizei depth) const -{ - if ((gl::isPow2(width) && gl::isPow2(height) && gl::isPow2(depth)) || - mRenderer->getNativeExtensions().textureNPOT) - { - // Maximum number of levels - return gl::log2(std::max(std::max(width, height), depth)) + 1; - } - else - { - // OpenGL ES 2.0 without GL_OES_texture_npot does not permit NPOT mipmaps. - return 1; - } -} - -TextureStorage *TextureD3D::getStorage() -{ - ASSERT(mTexStorage); - return mTexStorage; -} - -ImageD3D *TextureD3D::getBaseLevelImage() const -{ - if (mBaseLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - { - return nullptr; - } - return getImage(getImageIndex(mBaseLevel, 0)); -} - -gl::Error TextureD3D::setImageExternal(const gl::Context *context, - GLenum target, - egl::Stream *stream, - const egl::Stream::GLTextureDescription &desc) -{ - // Only external images can accept external textures - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D::generateMipmap(const gl::Context *context) -{ - const GLuint baseLevel = mState.getEffectiveBaseLevel(); - const GLuint maxLevel = mState.getMipmapMaxLevel(); - ASSERT(maxLevel > baseLevel); // Should be checked before calling this. - - if (mTexStorage && mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - // Switch to using the mipmapped texture. - TextureStorage *textureStorage = nullptr; - ANGLE_TRY(getNativeTexture(context, &textureStorage)); - ANGLE_TRY(textureStorage->useLevelZeroWorkaroundTexture(context, false)); - } - - // Set up proper mipmap chain in our Image array. - ANGLE_TRY(initMipmapImages(context)); - - if (mTexStorage && mTexStorage->supportsNativeMipmapFunction()) - { - ANGLE_TRY(updateStorage(context)); - - // Generate the mipmap chain using the ad-hoc DirectX function. - ANGLE_TRY(mRenderer->generateMipmapUsingD3D(context, mTexStorage, mState)); - } - else - { - // Generate the mipmap chain, one level at a time. - ANGLE_TRY(generateMipmapUsingImages(context, maxLevel)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D::generateMipmapUsingImages(const gl::Context *context, const GLuint maxLevel) -{ - // We know that all layers have the same dimension, for the texture to be complete - GLint layerCount = static_cast<GLint>(getLayerCount(mBaseLevel)); - - // When making mipmaps with the setData workaround enabled, the texture storage has - // the image data already. For non-render-target storage, we have to pull it out into - // an image layer. - if (mRenderer->getWorkarounds().setDataFasterThanImageUpload && mTexStorage) - { - if (!mTexStorage->isRenderTarget()) - { - // Copy from the storage mip 0 to Image mip 0 - for (GLint layer = 0; layer < layerCount; ++layer) - { - gl::ImageIndex srcIndex = getImageIndex(mBaseLevel, layer); - - ImageD3D *image = getImage(srcIndex); - ANGLE_TRY(image->copyFromTexStorage(context, srcIndex, mTexStorage)); - } - } - else - { - ANGLE_TRY(updateStorage(context)); - } - } - - // TODO: Decouple this from zeroMaxLodWorkaround. This is a 9_3 restriction, unrelated to zeroMaxLodWorkaround. - // The restriction is because Feature Level 9_3 can't create SRVs on individual levels of the texture. - // As a result, even if the storage is a rendertarget, we can't use the GPU to generate the mipmaps without further work. - // The D3D9 renderer works around this by copying each level of the texture into its own single-layer GPU texture (in Blit9::boxFilter). - // Feature Level 9_3 could do something similar, or it could continue to use CPU-side mipmap generation, or something else. - bool renderableStorage = (mTexStorage && mTexStorage->isRenderTarget() && !(mRenderer->getWorkarounds().zeroMaxLodWorkaround)); - - for (GLint layer = 0; layer < layerCount; ++layer) - { - for (GLuint mip = mBaseLevel + 1; mip <= maxLevel; ++mip) - { - ASSERT(getLayerCount(mip) == layerCount); - - gl::ImageIndex sourceIndex = getImageIndex(mip - 1, layer); - gl::ImageIndex destIndex = getImageIndex(mip, layer); - - if (renderableStorage) - { - // GPU-side mipmapping - ANGLE_TRY(mTexStorage->generateMipmap(context, sourceIndex, destIndex)); - } - else - { - // CPU-side mipmapping - ANGLE_TRY( - mRenderer->generateMipmap(context, getImage(destIndex), getImage(sourceIndex))); - } - } - } - - mDirtyImages = true; - - if (mTexStorage) - { - ANGLE_TRY(updateStorage(context)); - } - - return gl::NoError(); -} - -bool TextureD3D::isBaseImageZeroSize() const -{ - ImageD3D *baseImage = getBaseLevelImage(); - - if (!baseImage || baseImage->getWidth() <= 0) - { - return true; - } - - if (!gl::IsCubeMapTextureTarget(baseImage->getTarget()) && baseImage->getHeight() <= 0) - { - return true; - } - - if (baseImage->getTarget() == GL_TEXTURE_3D && baseImage->getDepth() <= 0) - { - return true; - } - - if (baseImage->getTarget() == GL_TEXTURE_2D_ARRAY && getLayerCount(getBaseLevel()) <= 0) - { - return true; - } - - return false; -} - -gl::Error TextureD3D::ensureRenderTarget(const gl::Context *context) -{ - ANGLE_TRY(initializeStorage(context, true)); - - // initializeStorage can fail with NoError if the texture is not complete. This is not - // an error for incomplete sampling, but it is a big problem for rendering. - if (!mTexStorage) - { - UNREACHABLE(); - return gl::InternalError() << "Cannot render to incomplete texture."; - } - - if (!isBaseImageZeroSize()) - { - ASSERT(mTexStorage); - if (!mTexStorage->isRenderTarget()) - { - TexStoragePointer newRenderTargetStorage(context); - ANGLE_TRY(createCompleteStorage(true, &newRenderTargetStorage)); - - ANGLE_TRY(mTexStorage->copyToStorage(context, newRenderTargetStorage.get())); - ANGLE_TRY(setCompleteTexStorage(context, newRenderTargetStorage.get())); - newRenderTargetStorage.release(); - } - } - - return gl::NoError(); -} - -bool TextureD3D::canCreateRenderTargetForImage(const gl::ImageIndex &index) const -{ - if (index.type == GL_TEXTURE_2D_MULTISAMPLE) - return true; - - ImageD3D *image = getImage(index); - ASSERT(image); - bool levelsComplete = (isImageComplete(index) && isImageComplete(getImageIndex(0, 0))); - return (image->isRenderableFormat() && levelsComplete); -} - -gl::Error TextureD3D::commitRegion(const gl::Context *context, - const gl::ImageIndex &index, - const gl::Box ®ion) -{ - if (mTexStorage) - { - ASSERT(isValidIndex(index)); - ImageD3D *image = getImage(index); - ANGLE_TRY(image->copyToStorage(context, mTexStorage, index, region)); - image->markClean(); - } - - return gl::NoError(); -} - -gl::Error TextureD3D::getAttachmentRenderTarget(const gl::Context *context, - GLenum /*binding*/, - const gl::ImageIndex &imageIndex, - FramebufferAttachmentRenderTarget **rtOut) -{ - RenderTargetD3D *rtD3D = nullptr; - gl::Error error = getRenderTarget(context, imageIndex, &rtD3D); - *rtOut = static_cast<FramebufferAttachmentRenderTarget *>(rtD3D); - return error; -} - -gl::Error TextureD3D::setBaseLevel(const gl::Context *context, GLuint baseLevel) -{ - const int oldStorageWidth = std::max(1, getLevelZeroWidth()); - const int oldStorageHeight = std::max(1, getLevelZeroHeight()); - const int oldStorageDepth = std::max(1, getLevelZeroDepth()); - const int oldStorageFormat = getBaseLevelInternalFormat(); - mBaseLevel = baseLevel; - - // When the base level changes, the texture storage might not be valid anymore, since it could - // have been created based on the dimensions of the previous specified level range. - const int newStorageWidth = std::max(1, getLevelZeroWidth()); - const int newStorageHeight = std::max(1, getLevelZeroHeight()); - const int newStorageDepth = std::max(1, getLevelZeroDepth()); - const int newStorageFormat = getBaseLevelInternalFormat(); - if (mTexStorage && - (newStorageWidth != oldStorageWidth || newStorageHeight != oldStorageHeight || - newStorageDepth != oldStorageDepth || newStorageFormat != oldStorageFormat)) - { - markAllImagesDirty(); - ANGLE_TRY(releaseTexStorage(context)); - } - - return gl::NoError(); -} - -void TextureD3D::syncState(const gl::Texture::DirtyBits &dirtyBits) -{ - // TODO(geofflang): Use dirty bits -} - -gl::Error TextureD3D::releaseTexStorage(const gl::Context *context) -{ - if (!mTexStorage) - { - return gl::NoError(); - } - auto err = mTexStorage->onDestroy(context); - SafeDelete(mTexStorage); - return err; -} - -gl::Error TextureD3D::onDestroy(const gl::Context *context) -{ - return releaseTexStorage(context); -} - -gl::Error TextureD3D::initializeContents(const gl::Context *context, - const gl::ImageIndex &imageIndexIn) -{ - gl::ImageIndex imageIndex = imageIndexIn; - - // Special case for D3D11 3D textures. We can't create render targets for individual layers of a - // 3D texture, so force the clear to the entire mip. There shouldn't ever be a case where we - // would lose existing data. - if (imageIndex.type == GL_TEXTURE_3D) - { - imageIndex.layerIndex = gl::ImageIndex::ENTIRE_LEVEL; - } - else if (imageIndex.type == GL_TEXTURE_2D_ARRAY && - imageIndex.layerIndex == gl::ImageIndex::ENTIRE_LEVEL) - { - GLsizei layerCount = getLayerCount(imageIndex.mipIndex); - for (imageIndex.layerIndex = 0; imageIndex.layerIndex < layerCount; ++imageIndex.layerIndex) - { - ANGLE_TRY(initializeContents(context, imageIndex)); - } - return gl::NoError(); - } - - // Force image clean. - ImageD3D *image = getImage(imageIndex); - if (image) - { - image->markClean(); - } - - // Fast path: can use a render target clear. - if (canCreateRenderTargetForImage(imageIndex)) - { - ANGLE_TRY(ensureRenderTarget(context)); - ASSERT(mTexStorage); - RenderTargetD3D *renderTarget = nullptr; - ANGLE_TRY(mTexStorage->getRenderTarget(context, imageIndex, &renderTarget)); - ANGLE_TRY(mRenderer->initRenderTarget(renderTarget)); - return gl::NoError(); - } - - // Slow path: non-renderable texture or the texture levels aren't set up. - const auto &formatInfo = gl::GetSizedInternalFormatInfo(image->getInternalFormat()); - - size_t imageBytes = 0; - ANGLE_TRY_RESULT(formatInfo.computeRowPitch(formatInfo.type, image->getWidth(), 1, 0), - imageBytes); - imageBytes *= image->getHeight() * image->getDepth(); - - gl::PixelUnpackState defaultUnpackState; - - angle::MemoryBuffer *zeroBuffer = nullptr; - ANGLE_TRY(context->getZeroFilledBuffer(imageBytes, &zeroBuffer)); - if (shouldUseSetData(image)) - { - ANGLE_TRY(mTexStorage->setData(context, imageIndex, image, nullptr, formatInfo.type, - defaultUnpackState, zeroBuffer->data())); - } - else - { - gl::Box fullImageArea(0, 0, 0, image->getWidth(), image->getHeight(), image->getDepth()); - ANGLE_TRY(image->loadData(context, fullImageArea, defaultUnpackState, formatInfo.type, - zeroBuffer->data(), false)); - - // Force an update to the tex storage so we avoid problems with subImage and dirty regions. - if (mTexStorage) - { - ANGLE_TRY(commitRegion(context, imageIndex, fullImageArea)); - image->markClean(); - } - else - { - mDirtyImages = true; - } - } - return gl::NoError(); -} - -TextureD3D_2D::TextureD3D_2D(const gl::TextureState &state, RendererD3D *renderer) - : TextureD3D(state, renderer) -{ - mEGLImageTarget = false; - for (auto &image : mImageArray) - { - image.reset(renderer->createImage()); - } -} - -gl::Error TextureD3D_2D::onDestroy(const gl::Context *context) -{ - // Delete the Images before the TextureStorage. Images might be relying on the TextureStorage - // for some of their data. If TextureStorage is deleted before the Images, then their data will - // be wastefully copied back from the GPU before we delete the Images. - for (auto &image : mImageArray) - { - image.reset(); - } - return TextureD3D::onDestroy(context); -} - -TextureD3D_2D::~TextureD3D_2D() -{ -} - -ImageD3D *TextureD3D_2D::getImage(int level, int layer) const -{ - ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(layer == 0); - return mImageArray[level].get(); -} - -ImageD3D *TextureD3D_2D::getImage(const gl::ImageIndex &index) const -{ - ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(!index.hasLayer()); - ASSERT(index.type == GL_TEXTURE_2D); - return mImageArray[index.mipIndex].get(); -} - -GLsizei TextureD3D_2D::getLayerCount(int level) const -{ - ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - return 1; -} - -GLsizei TextureD3D_2D::getWidth(GLint level) const -{ - if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mImageArray[level]->getWidth(); - else - return 0; -} - -GLsizei TextureD3D_2D::getHeight(GLint level) const -{ - if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mImageArray[level]->getHeight(); - else - return 0; -} - -GLenum TextureD3D_2D::getInternalFormat(GLint level) const -{ - if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mImageArray[level]->getInternalFormat(); - else - return GL_NONE; -} - -bool TextureD3D_2D::isDepth(GLint level) const -{ - return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).depthBits > 0; -} - -bool TextureD3D_2D::isSRGB(GLint level) const -{ - return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).colorEncoding == GL_SRGB; -} - -gl::Error TextureD3D_2D::setImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_2D && size.depth == 1); - - const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type); - - bool fastUnpacked = false; - GLint level = static_cast<GLint>(imageLevel); - - ANGLE_TRY(redefineImage(context, level, internalFormatInfo.sizedInternalFormat, size, false)); - - gl::ImageIndex index = gl::ImageIndex::Make2D(level); - - // Attempt a fast gpu copy of the pixel data to the surface - gl::Buffer *unpackBuffer = - context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack); - if (isFastUnpackable(unpackBuffer, internalFormatInfo.sizedInternalFormat) && - isLevelComplete(level)) - { - // Will try to create RT storage if it does not exist - RenderTargetD3D *destRenderTarget = nullptr; - ANGLE_TRY(getRenderTarget(context, index, &destRenderTarget)); - - gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), 1); - - ANGLE_TRY(fastUnpackPixels(context, unpack, pixels, destArea, - internalFormatInfo.sizedInternalFormat, type, destRenderTarget)); - - // Ensure we don't overwrite our newly initialized data - mImageArray[level]->markClean(); - - fastUnpacked = true; - } - - if (!fastUnpacked) - { - ANGLE_TRY(setImageImpl(context, index, type, unpack, pixels, 0)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::setSubImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_2D && area.depth == 1 && area.z == 0); - - GLint level = static_cast<GLint>(imageLevel); - gl::ImageIndex index = gl::ImageIndex::Make2D(level); - - gl::Buffer *unpackBuffer = - context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack); - if (isFastUnpackable(unpackBuffer, getInternalFormat(level)) && isLevelComplete(level)) - { - RenderTargetD3D *renderTarget = nullptr; - ANGLE_TRY(getRenderTarget(context, index, &renderTarget)); - ASSERT(!mImageArray[level]->isDirty()); - - return fastUnpackPixels(context, unpack, pixels, area, getInternalFormat(level), type, - renderTarget); - } - else - { - return TextureD3D::subImage(context, index, area, format, type, unpack, pixels, 0); - } -} - -gl::Error TextureD3D_2D::setCompressedImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_2D && size.depth == 1); - GLint level = static_cast<GLint>(imageLevel); - - // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly - ANGLE_TRY(redefineImage(context, level, internalFormat, size, false)); - - return setCompressedImageImpl(context, gl::ImageIndex::Make2D(level), unpack, pixels, 0); -} - -gl::Error TextureD3D_2D::setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_2D && area.depth == 1 && area.z == 0); - - gl::ImageIndex index = gl::ImageIndex::Make2D(static_cast<GLint>(level)); - ANGLE_TRY(TextureD3D::subImageCompressed(context, index, area, format, unpack, pixels, 0)); - - return commitRegion(context, index, area); -} - -gl::Error TextureD3D_2D::copyImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Rectangle &origSourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) -{ - ASSERT(target == GL_TEXTURE_2D); - - GLint level = static_cast<GLint>(imageLevel); - const gl::InternalFormat &internalFormatInfo = - gl::GetInternalFormatInfo(internalFormat, GL_UNSIGNED_BYTE); - gl::Extents sourceExtents(origSourceArea.width, origSourceArea.height, 1); - ANGLE_TRY(redefineImage(context, level, internalFormatInfo.sizedInternalFormat, sourceExtents, - false)); - - gl::Extents fbSize = source->getReadColorbuffer()->getSize(); - - // Does the read area extend beyond the framebuffer? - bool outside = origSourceArea.x < 0 || origSourceArea.y < 0 || - origSourceArea.x + origSourceArea.width > fbSize.width || - origSourceArea.y + origSourceArea.height > fbSize.height; - - // In WebGL mode we need to zero the texture outside the framebuffer. - // If we have robust resource init, it was already zeroed by redefineImage() above, otherwise - // zero it explicitly. - // TODO(fjhenigman): When robust resource is fully implemented look into making it a - // prerequisite for WebGL and deleting this code. - if (outside && - (context->getExtensions().webglCompatibility || context->isRobustResourceInitEnabled())) - { - angle::MemoryBuffer *zero; - ANGLE_TRY(context->getZeroFilledBuffer( - origSourceArea.width * origSourceArea.height * internalFormatInfo.pixelBytes, &zero)); - gl::PixelUnpackState unpack; - unpack.alignment = 1; - ANGLE_TRY(setImage(context, target, imageLevel, internalFormat, sourceExtents, - internalFormatInfo.format, internalFormatInfo.type, unpack, - zero->data())); - } - - gl::Rectangle sourceArea; - if (!ClipRectangle(origSourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height), - &sourceArea)) - { - // Empty source area, nothing to do. - return gl::NoError(); - } - - gl::ImageIndex index = gl::ImageIndex::Make2D(level); - gl::Offset destOffset(sourceArea.x - origSourceArea.x, sourceArea.y - origSourceArea.y, 0); - - // If the zero max LOD workaround is active, then we can't sample from individual layers of the framebuffer in shaders, - // so we should use the non-rendering copy path. - if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(context, destOffset, sourceArea, source)); - mDirtyImages = true; - } - else - { - ANGLE_TRY(ensureRenderTarget(context)); - - if (sourceArea.width != 0 && sourceArea.height != 0 && isValidLevel(level)) - { - ANGLE_TRY(updateStorageLevel(context, level)); - ANGLE_TRY(mRenderer->copyImage2D(context, source, sourceArea, internalFormat, - destOffset, mTexStorage, level)); - } - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::copySubImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Offset &origDestOffset, - const gl::Rectangle &origSourceArea, - const gl::Framebuffer *source) -{ - ASSERT(target == GL_TEXTURE_2D && origDestOffset.z == 0); - - gl::Extents fbSize = source->getReadColorbuffer()->getSize(); - gl::Rectangle sourceArea; - if (!ClipRectangle(origSourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height), - &sourceArea)) - { - return gl::NoError(); - } - const gl::Offset destOffset(origDestOffset.x + sourceArea.x - origSourceArea.x, - origDestOffset.y + sourceArea.y - origSourceArea.y, 0); - - // can only make our texture storage to a render target if level 0 is defined (with a width & height) and - // the current level we're copying to is defined (with appropriate format, width & height) - - GLint level = static_cast<GLint>(imageLevel); - gl::ImageIndex index = gl::ImageIndex::Make2D(level); - - // If the zero max LOD workaround is active, then we can't sample from individual layers of the framebuffer in shaders, - // so we should use the non-rendering copy path. - if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(context, destOffset, sourceArea, source)); - mDirtyImages = true; - } - else - { - ANGLE_TRY(ensureRenderTarget(context)); - - if (isValidLevel(level)) - { - ANGLE_TRY(updateStorageLevel(context, level)); - ANGLE_TRY(mRenderer->copyImage2D(context, source, sourceArea, - gl::GetUnsizedFormat(getBaseLevelInternalFormat()), - destOffset, mTexStorage, level)); - } - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::copyTexture(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - GLenum type, - size_t sourceLevel, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - const gl::Texture *source) -{ - ASSERT(target == GL_TEXTURE_2D); - - GLenum sourceTarget = source->getTarget(); - - GLint destLevel = static_cast<GLint>(level); - - const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type); - gl::Extents size(static_cast<int>(source->getWidth(sourceTarget, sourceLevel)), - static_cast<int>(source->getHeight(sourceTarget, sourceLevel)), 1); - ANGLE_TRY( - redefineImage(context, destLevel, internalFormatInfo.sizedInternalFormat, size, false)); - - gl::Rectangle sourceRect(0, 0, size.width, size.height); - gl::Offset destOffset(0, 0, 0); - - if (!isSRGB(destLevel) && canCreateRenderTargetForImage(gl::ImageIndex::Make2D(destLevel))) - { - ANGLE_TRY(ensureRenderTarget(context)); - ASSERT(isValidLevel(destLevel)); - ANGLE_TRY(updateStorageLevel(context, destLevel)); - - ANGLE_TRY(mRenderer->copyTexture(context, source, static_cast<GLint>(sourceLevel), - sourceRect, internalFormatInfo.format, destOffset, - mTexStorage, target, destLevel, unpackFlipY, - unpackPremultiplyAlpha, unpackUnmultiplyAlpha)); - } - else - { - gl::ImageIndex sourceImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(sourceLevel)); - TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source); - ImageD3D *sourceImage = nullptr; - ANGLE_TRY(sourceD3D->getImageAndSyncFromStorage(context, sourceImageIndex, &sourceImage)); - - gl::ImageIndex destImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(destLevel)); - ImageD3D *destImage = nullptr; - ANGLE_TRY(getImageAndSyncFromStorage(context, destImageIndex, &destImage)); - - ANGLE_TRY(mRenderer->copyImage(context, destImage, sourceImage, sourceRect, destOffset, - unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha)); - - mDirtyImages = true; - - gl::Box destRegion(destOffset, size); - ANGLE_TRY(commitRegion(context, destImageIndex, destRegion)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::copySubTexture(const gl::Context *context, - GLenum target, - size_t level, - const gl::Offset &destOffset, - size_t sourceLevel, - const gl::Rectangle &sourceArea, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - const gl::Texture *source) -{ - ASSERT(target == GL_TEXTURE_2D); - - GLint destLevel = static_cast<GLint>(level); - - if (!isSRGB(destLevel) && canCreateRenderTargetForImage(gl::ImageIndex::Make2D(destLevel))) - { - ANGLE_TRY(ensureRenderTarget(context)); - ASSERT(isValidLevel(destLevel)); - ANGLE_TRY(updateStorageLevel(context, destLevel)); - - ANGLE_TRY(mRenderer->copyTexture( - context, source, static_cast<GLint>(sourceLevel), sourceArea, - gl::GetUnsizedFormat(getInternalFormat(destLevel)), destOffset, mTexStorage, target, - destLevel, unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha)); - } - else - { - gl::ImageIndex sourceImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(sourceLevel)); - TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source); - ImageD3D *sourceImage = nullptr; - ANGLE_TRY(sourceD3D->getImageAndSyncFromStorage(context, sourceImageIndex, &sourceImage)); - - gl::ImageIndex destImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(destLevel)); - ImageD3D *destImage = nullptr; - ANGLE_TRY(getImageAndSyncFromStorage(context, destImageIndex, &destImage)); - - ANGLE_TRY(mRenderer->copyImage(context, destImage, sourceImage, sourceArea, destOffset, - unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha)); - - mDirtyImages = true; - - gl::Box destRegion(destOffset.x, destOffset.y, 0, sourceArea.width, sourceArea.height, 1); - ANGLE_TRY(commitRegion(context, destImageIndex, destRegion)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::copyCompressedTexture(const gl::Context *context, - const gl::Texture *source) -{ - GLenum sourceTarget = source->getTarget(); - GLint sourceLevel = 0; - - GLint destLevel = 0; - - GLenum sizedInternalFormat = - source->getFormat(sourceTarget, sourceLevel).info->sizedInternalFormat; - gl::Extents size(static_cast<int>(source->getWidth(sourceTarget, sourceLevel)), - static_cast<int>(source->getHeight(sourceTarget, sourceLevel)), 1); - ANGLE_TRY(redefineImage(context, destLevel, sizedInternalFormat, size, false)); - - ANGLE_TRY(initializeStorage(context, false)); - ASSERT(mTexStorage); - - ANGLE_TRY( - mRenderer->copyCompressedTexture(context, source, sourceLevel, mTexStorage, destLevel)); - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) -{ - ASSERT(GL_TEXTURE_2D && size.depth == 1); - - for (size_t level = 0; level < levels; level++) - { - gl::Extents levelSize(std::max(1, size.width >> level), - std::max(1, size.height >> level), - 1); - ANGLE_TRY(redefineImage(context, level, internalFormat, levelSize, true)); - } - - for (size_t level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) - { - ANGLE_TRY(redefineImage(context, level, GL_NONE, gl::Extents(0, 0, 1), true)); - } - - // TODO(geofflang): Verify storage creation had no errors - bool renderTarget = IsRenderTargetUsage(mState.getUsage()); - TexStoragePointer storage(context); - storage.reset(mRenderer->createTextureStorage2D(internalFormat, renderTarget, size.width, - size.height, static_cast<int>(levels), false)); - - ANGLE_TRY(setCompleteTexStorage(context, storage.get())); - storage.release(); - - ANGLE_TRY(updateStorage(context)); - - mImmutable = true; - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::bindTexImage(const gl::Context *context, egl::Surface *surface) -{ - GLenum internalformat = surface->getConfig()->renderTargetFormat; - - gl::Extents size(surface->getWidth(), surface->getHeight(), 1); - ANGLE_TRY(redefineImage(context, 0, internalformat, size, true)); - - ANGLE_TRY(releaseTexStorage(context)); - - SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface); - ASSERT(surfaceD3D); - - mTexStorage = mRenderer->createTextureStorage2D(surfaceD3D->getSwapChain()); - mEGLImageTarget = false; - - mDirtyImages = false; - mImageArray[0]->markClean(); - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::releaseTexImage(const gl::Context *context) -{ - if (mTexStorage) - { - ANGLE_TRY(releaseTexStorage(context)); - } - - for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) - { - ANGLE_TRY(redefineImage(context, i, GL_NONE, gl::Extents(0, 0, 1), true)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) -{ - EGLImageD3D *eglImaged3d = GetImplAs<EGLImageD3D>(image); - - // Set the properties of the base mip level from the EGL image - const auto &format = image->getFormat(); - gl::Extents size(static_cast<int>(image->getWidth()), static_cast<int>(image->getHeight()), 1); - ANGLE_TRY(redefineImage(context, 0, format.info->sizedInternalFormat, size, true)); - - // Clear all other images. - for (size_t level = 1; level < mImageArray.size(); level++) - { - ANGLE_TRY(redefineImage(context, level, GL_NONE, gl::Extents(0, 0, 1), true)); - } - - ANGLE_TRY(releaseTexStorage(context)); - mImageArray[0]->markClean(); - - // Pass in the RenderTargetD3D here: createTextureStorage can't generate an error. - RenderTargetD3D *renderTargetD3D = nullptr; - ANGLE_TRY(eglImaged3d->getRenderTarget(context, &renderTargetD3D)); - - mTexStorage = mRenderer->createTextureStorageEGLImage(eglImaged3d, renderTargetD3D); - mEGLImageTarget = true; - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::initMipmapImages(const gl::Context *context) -{ - const GLuint baseLevel = mState.getEffectiveBaseLevel(); - const GLuint maxLevel = mState.getMipmapMaxLevel(); - // Purge array levels baseLevel + 1 through q and reset them to represent the generated mipmap - // levels. - for (GLuint level = baseLevel + 1; level <= maxLevel; level++) - { - gl::Extents levelSize(std::max(getLevelZeroWidth() >> level, 1), - std::max(getLevelZeroHeight() >> level, 1), 1); - - ANGLE_TRY(redefineImage(context, level, getBaseLevelInternalFormat(), levelSize, false)); - } - return gl::NoError(); -} - -gl::Error TextureD3D_2D::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - ASSERT(!index.hasLayer()); - - // ensure the underlying texture is created - ANGLE_TRY(ensureRenderTarget(context)); - ANGLE_TRY(updateStorageLevel(context, index.mipIndex)); - - return mTexStorage->getRenderTarget(context, index, outRT); -} - -bool TextureD3D_2D::isValidLevel(int level) const -{ - return (mTexStorage ? (level >= 0 && level < mTexStorage->getLevelCount()) : false); -} - -bool TextureD3D_2D::isLevelComplete(int level) const -{ - if (isImmutable()) - { - return true; - } - - GLsizei width = getLevelZeroWidth(); - GLsizei height = getLevelZeroHeight(); - - if (width <= 0 || height <= 0) - { - return false; - } - - // The base image level is complete if the width and height are positive - if (level == static_cast<int>(getBaseLevel())) - { - return true; - } - - ASSERT(level >= 0 && level <= static_cast<int>(mImageArray.size()) && - mImageArray[level] != nullptr); - ImageD3D *image = mImageArray[level].get(); - - if (image->getInternalFormat() != getBaseLevelInternalFormat()) - { - return false; - } - - if (image->getWidth() != std::max(1, width >> level)) - { - return false; - } - - if (image->getHeight() != std::max(1, height >> level)) - { - return false; - } - - return true; -} - -bool TextureD3D_2D::isImageComplete(const gl::ImageIndex &index) const -{ - return isLevelComplete(index.mipIndex); -} - -// Constructs a native texture resource from the texture images -gl::Error TextureD3D_2D::initializeStorage(const gl::Context *context, bool renderTarget) -{ - // Only initialize the first time this texture is used as a render target or shader resource - if (mTexStorage) - { - return gl::NoError(); - } - - // do not attempt to create storage for nonexistant data - if (!isLevelComplete(getBaseLevel())) - { - return gl::NoError(); - } - - bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage())); - - TexStoragePointer storage(context); - ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage)); - - ANGLE_TRY(setCompleteTexStorage(context, storage.get())); - storage.release(); - - ASSERT(mTexStorage); - - // flush image data to the storage - ANGLE_TRY(updateStorage(context)); - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::createCompleteStorage(bool renderTarget, - TexStoragePointer *outStorage) const -{ - GLsizei width = getLevelZeroWidth(); - GLsizei height = getLevelZeroHeight(); - GLenum internalFormat = getBaseLevelInternalFormat(); - - ASSERT(width > 0 && height > 0); - - // use existing storage level count, when previously specified by TexStorage*D - GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(width, height, 1)); - - bool hintLevelZeroOnly = false; - if (mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - // If any of the CPU images (levels >= 1) are dirty, then the textureStorage2D should use the mipped texture to begin with. - // Otherwise, it should use the level-zero-only texture. - hintLevelZeroOnly = true; - for (int level = 1; level < levels && hintLevelZeroOnly; level++) - { - hintLevelZeroOnly = !(mImageArray[level]->isDirty() && isLevelComplete(level)); - } - } - - // TODO(geofflang): Determine if the texture creation succeeded - outStorage->reset(mRenderer->createTextureStorage2D(internalFormat, renderTarget, width, height, - levels, hintLevelZeroOnly)); - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) -{ - if (newCompleteTexStorage && newCompleteTexStorage->isManaged()) - { - for (int level = 0; level < newCompleteTexStorage->getLevelCount(); level++) - { - ANGLE_TRY( - mImageArray[level]->setManagedSurface2D(context, newCompleteTexStorage, level)); - } - } - - ANGLE_TRY(releaseTexStorage(context)); - mTexStorage = newCompleteTexStorage; - - mDirtyImages = true; - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::updateStorage(const gl::Context *context) -{ - if (!mDirtyImages) - { - return gl::NoError(); - } - - ASSERT(mTexStorage != nullptr); - GLint storageLevels = mTexStorage->getLevelCount(); - for (int level = 0; level < storageLevels; level++) - { - if (mImageArray[level]->isDirty() && isLevelComplete(level)) - { - ANGLE_TRY(updateStorageLevel(context, level)); - } - } - - mDirtyImages = false; - return gl::NoError(); -} - -gl::Error TextureD3D_2D::updateStorageLevel(const gl::Context *context, int level) -{ - ASSERT(level <= static_cast<int>(mImageArray.size()) && mImageArray[level] != nullptr); - ASSERT(isLevelComplete(level)); - - if (mImageArray[level]->isDirty()) - { - gl::ImageIndex index = gl::ImageIndex::Make2D(level); - gl::Box region(0, 0, 0, getWidth(level), getHeight(level), 1); - ANGLE_TRY(commitRegion(context, index, region)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2D::redefineImage(const gl::Context *context, - size_t level, - GLenum internalformat, - const gl::Extents &size, - bool forceRelease) -{ - ASSERT(size.depth == 1); - - // If there currently is a corresponding storage texture image, it has these parameters - const int storageWidth = std::max(1, getLevelZeroWidth() >> level); - const int storageHeight = std::max(1, getLevelZeroHeight() >> level); - const GLenum storageFormat = getBaseLevelInternalFormat(); - - mImageArray[level]->redefine(GL_TEXTURE_2D, internalformat, size, forceRelease); - mDirtyImages = mDirtyImages || mImageArray[level]->isDirty(); - - if (mTexStorage) - { - const size_t storageLevels = mTexStorage->getLevelCount(); - - // If the storage was from an EGL image, copy it back into local images to preserve it - // while orphaning - if (level != 0 && mEGLImageTarget) - { - ANGLE_TRY(mImageArray[0]->copyFromTexStorage(context, gl::ImageIndex::Make2D(0), - mTexStorage)); - } - - if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth || - size.height != storageHeight || - internalformat != storageFormat) // Discard mismatched storage - { - ANGLE_TRY(releaseTexStorage(context)); - markAllImagesDirty(); - } - } - - // Can't be an EGL image target after being redefined - mEGLImageTarget = false; - - return gl::NoError(); -} - -gl::ImageIndexIterator TextureD3D_2D::imageIterator() const -{ - return gl::ImageIndexIterator::Make2D(0, mTexStorage->getLevelCount()); -} - -gl::ImageIndex TextureD3D_2D::getImageIndex(GLint mip, GLint /*layer*/) const -{ - // "layer" does not apply to 2D Textures. - return gl::ImageIndex::Make2D(mip); -} - -bool TextureD3D_2D::isValidIndex(const gl::ImageIndex &index) const -{ - return (mTexStorage && index.type == GL_TEXTURE_2D && - index.mipIndex >= 0 && index.mipIndex < mTexStorage->getLevelCount()); -} - -void TextureD3D_2D::markAllImagesDirty() -{ - for (size_t i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) - { - mImageArray[i]->markDirty(); - } - mDirtyImages = true; -} - -TextureD3D_Cube::TextureD3D_Cube(const gl::TextureState &state, RendererD3D *renderer) - : TextureD3D(state, renderer) -{ - for (auto &face : mImageArray) - { - for (auto &image : face) - { - image.reset(renderer->createImage()); - } - } -} - -gl::Error TextureD3D_Cube::onDestroy(const gl::Context *context) -{ - // Delete the Images before the TextureStorage. Images might be relying on the TextureStorage - // for some of their data. If TextureStorage is deleted before the Images, then their data will - // be wastefully copied back from the GPU before we delete the Images. - for (auto &face : mImageArray) - { - for (auto &image : face) - { - image.reset(); - } - } - return TextureD3D::onDestroy(context); -} - -TextureD3D_Cube::~TextureD3D_Cube() -{ -} - -ImageD3D *TextureD3D_Cube::getImage(int level, int layer) const -{ - ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(layer >= 0 && layer < 6); - return mImageArray[layer][level].get(); -} - -ImageD3D *TextureD3D_Cube::getImage(const gl::ImageIndex &index) const -{ - ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(index.layerIndex >= 0 && index.layerIndex < 6); - return mImageArray[index.layerIndex][index.mipIndex].get(); -} - -GLsizei TextureD3D_Cube::getLayerCount(int level) const -{ - ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - return 6; -} - -GLenum TextureD3D_Cube::getInternalFormat(GLint level, GLint layer) const -{ - if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mImageArray[layer][level]->getInternalFormat(); - else - return GL_NONE; -} - -bool TextureD3D_Cube::isDepth(GLint level, GLint layer) const -{ - return gl::GetSizedInternalFormatInfo(getInternalFormat(level, layer)).depthBits > 0; -} - -bool TextureD3D_Cube::isSRGB(GLint level, GLint layer) const -{ - return gl::GetSizedInternalFormatInfo(getInternalFormat(level, layer)).colorEncoding == GL_SRGB; -} - -gl::Error TextureD3D_Cube::setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_Cube::setImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - ASSERT(size.depth == 1); - - const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type); - gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level)); - - ANGLE_TRY(redefineImage(context, index.layerIndex, static_cast<GLint>(level), - internalFormatInfo.sizedInternalFormat, size, false)); - - return setImageImpl(context, index, type, unpack, pixels, 0); -} - -gl::Error TextureD3D_Cube::setSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - ASSERT(area.depth == 1 && area.z == 0); - - gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level)); - return TextureD3D::subImage(context, index, area, format, type, unpack, pixels, 0); -} - -gl::Error TextureD3D_Cube::setCompressedImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - ASSERT(size.depth == 1); - - // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly - size_t faceIndex = gl::CubeMapTextureTargetToLayerIndex(target); - - ANGLE_TRY(redefineImage(context, static_cast<int>(faceIndex), static_cast<GLint>(level), - internalFormat, size, false)); - - gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level)); - return setCompressedImageImpl(context, index, unpack, pixels, 0); -} - -gl::Error TextureD3D_Cube::setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - ASSERT(area.depth == 1 && area.z == 0); - - gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level)); - - ANGLE_TRY(TextureD3D::subImageCompressed(context, index, area, format, unpack, pixels, 0)); - return commitRegion(context, index, area); -} - -gl::Error TextureD3D_Cube::copyImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Rectangle &origSourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) -{ - int faceIndex = static_cast<int>(gl::CubeMapTextureTargetToLayerIndex(target)); - const gl::InternalFormat &internalFormatInfo = - gl::GetInternalFormatInfo(internalFormat, GL_UNSIGNED_BYTE); - - GLint level = static_cast<GLint>(imageLevel); - - gl::Extents size(origSourceArea.width, origSourceArea.height, 1); - ANGLE_TRY(redefineImage(context, static_cast<int>(faceIndex), level, - internalFormatInfo.sizedInternalFormat, size, false)); - - gl::Extents fbSize = source->getReadColorbuffer()->getSize(); - - // Does the read area extend beyond the framebuffer? - bool outside = origSourceArea.x < 0 || origSourceArea.y < 0 || - origSourceArea.x + origSourceArea.width > fbSize.width || - origSourceArea.y + origSourceArea.height > fbSize.height; - - // In WebGL mode we need to zero the texture outside the framebuffer. - // If we have robust resource init, it was already zeroed by redefineImage() above, otherwise - // zero it explicitly. - // TODO(fjhenigman): When robust resource is fully implemented look into making it a - // prerequisite for WebGL and deleting this code. - if (outside && context->getExtensions().webglCompatibility && - !context->isRobustResourceInitEnabled()) - { - angle::MemoryBuffer *zero; - ANGLE_TRY(context->getZeroFilledBuffer( - origSourceArea.width * origSourceArea.height * internalFormatInfo.pixelBytes, &zero)); - gl::PixelUnpackState unpack; - unpack.alignment = 1; - ANGLE_TRY(setImage(context, target, imageLevel, internalFormat, size, - internalFormatInfo.format, internalFormatInfo.type, unpack, - zero->data())); - } - - gl::Rectangle sourceArea; - if (!ClipRectangle(origSourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height), - &sourceArea)) - { - // Empty source area, nothing to do. - return gl::NoError(); - } - - gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level); - gl::Offset destOffset(sourceArea.x - origSourceArea.x, sourceArea.y - origSourceArea.y, 0); - - // If the zero max LOD workaround is active, then we can't sample from individual layers of the framebuffer in shaders, - // so we should use the non-rendering copy path. - if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - ANGLE_TRY(mImageArray[faceIndex][level]->copyFromFramebuffer(context, destOffset, - sourceArea, source)); - mDirtyImages = true; - } - else - { - ANGLE_TRY(ensureRenderTarget(context)); - - ASSERT(size.width == size.height); - - if (size.width > 0 && isValidFaceLevel(faceIndex, level)) - { - ANGLE_TRY(updateStorageFaceLevel(context, faceIndex, level)); - ANGLE_TRY(mRenderer->copyImageCube(context, source, sourceArea, internalFormat, - destOffset, mTexStorage, target, level)); - } - } - - return gl::NoError(); -} - -gl::Error TextureD3D_Cube::copySubImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Offset &origDestOffset, - const gl::Rectangle &origSourceArea, - const gl::Framebuffer *source) -{ - gl::Extents fbSize = source->getReadColorbuffer()->getSize(); - gl::Rectangle sourceArea; - if (!ClipRectangle(origSourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height), - &sourceArea)) - { - return gl::NoError(); - } - const gl::Offset destOffset(origDestOffset.x + sourceArea.x - origSourceArea.x, - origDestOffset.y + sourceArea.y - origSourceArea.y, 0); - - int faceIndex = static_cast<int>(gl::CubeMapTextureTargetToLayerIndex(target)); - - GLint level = static_cast<GLint>(imageLevel); - gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level); - - // If the zero max LOD workaround is active, then we can't sample from individual layers of the framebuffer in shaders, - // so we should use the non-rendering copy path. - if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - ANGLE_TRY(mImageArray[faceIndex][level]->copyFromFramebuffer(context, destOffset, - sourceArea, source)); - mDirtyImages = true; - } - else - { - ANGLE_TRY(ensureRenderTarget(context)); - if (isValidFaceLevel(faceIndex, level)) - { - ANGLE_TRY(updateStorageFaceLevel(context, faceIndex, level)); - ANGLE_TRY(mRenderer->copyImageCube(context, source, sourceArea, - gl::GetUnsizedFormat(getBaseLevelInternalFormat()), - destOffset, mTexStorage, target, level)); - } - } - - return gl::NoError(); -} - -gl::Error TextureD3D_Cube::copyTexture(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - GLenum type, - size_t sourceLevel, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - const gl::Texture *source) -{ - ASSERT(gl::IsCubeMapTextureTarget(target)); - - GLenum sourceTarget = source->getTarget(); - - GLint destLevel = static_cast<GLint>(level); - int faceIndex = static_cast<int>(gl::CubeMapTextureTargetToLayerIndex(target)); - - const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type); - gl::Extents size(static_cast<int>(source->getWidth(sourceTarget, sourceLevel)), - static_cast<int>(source->getHeight(sourceTarget, sourceLevel)), 1); - ANGLE_TRY(redefineImage(context, faceIndex, destLevel, internalFormatInfo.sizedInternalFormat, - size, false)); - - gl::Rectangle sourceRect(0, 0, size.width, size.height); - gl::Offset destOffset(0, 0, 0); - - if (!isSRGB(destLevel, faceIndex) && - canCreateRenderTargetForImage(gl::ImageIndex::MakeCube(target, destLevel))) - { - ANGLE_TRY(ensureRenderTarget(context)); - ASSERT(isValidFaceLevel(faceIndex, destLevel)); - ANGLE_TRY(updateStorageFaceLevel(context, faceIndex, destLevel)); - - ANGLE_TRY(mRenderer->copyTexture(context, source, static_cast<GLint>(sourceLevel), - sourceRect, internalFormatInfo.format, destOffset, - mTexStorage, target, destLevel, unpackFlipY, - unpackPremultiplyAlpha, unpackUnmultiplyAlpha)); - } - else - { - gl::ImageIndex sourceImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(sourceLevel)); - TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source); - ImageD3D *sourceImage = nullptr; - ANGLE_TRY(sourceD3D->getImageAndSyncFromStorage(context, sourceImageIndex, &sourceImage)); - - gl::ImageIndex destImageIndex = - gl::ImageIndex::MakeCube(target, static_cast<GLint>(destLevel)); - ImageD3D *destImage = nullptr; - ANGLE_TRY(getImageAndSyncFromStorage(context, destImageIndex, &destImage)); - - ANGLE_TRY(mRenderer->copyImage(context, destImage, sourceImage, sourceRect, destOffset, - unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha)); - - mDirtyImages = true; - - gl::Box destRegion(destOffset, size); - ANGLE_TRY(commitRegion(context, destImageIndex, destRegion)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_Cube::copySubTexture(const gl::Context *context, - GLenum target, - size_t level, - const gl::Offset &destOffset, - size_t sourceLevel, - const gl::Rectangle &sourceArea, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - const gl::Texture *source) -{ - ASSERT(gl::IsCubeMapTextureTarget(target)); - - GLint destLevel = static_cast<GLint>(level); - int faceIndex = static_cast<int>(gl::CubeMapTextureTargetToLayerIndex(target)); - - if (!isSRGB(destLevel, faceIndex) && - canCreateRenderTargetForImage(gl::ImageIndex::MakeCube(target, destLevel))) - { - ANGLE_TRY(ensureRenderTarget(context)); - ASSERT(isValidFaceLevel(faceIndex, destLevel)); - ANGLE_TRY(updateStorageFaceLevel(context, faceIndex, destLevel)); - - ANGLE_TRY(mRenderer->copyTexture( - context, source, static_cast<GLint>(sourceLevel), sourceArea, - gl::GetUnsizedFormat(getInternalFormat(destLevel, faceIndex)), destOffset, mTexStorage, - target, destLevel, unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha)); - } - else - { - gl::ImageIndex sourceImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(sourceLevel)); - TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source); - ImageD3D *sourceImage = nullptr; - ANGLE_TRY(sourceD3D->getImageAndSyncFromStorage(context, sourceImageIndex, &sourceImage)); - - gl::ImageIndex destImageIndex = - gl::ImageIndex::MakeCube(target, static_cast<GLint>(destLevel)); - ImageD3D *destImage = nullptr; - ANGLE_TRY(getImageAndSyncFromStorage(context, destImageIndex, &destImage)); - - ANGLE_TRY(mRenderer->copyImage(context, destImage, sourceImage, sourceArea, destOffset, - unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha)); - - mDirtyImages = true; - - gl::Box destRegion(destOffset.x, destOffset.y, 0, sourceArea.width, sourceArea.height, 1); - ANGLE_TRY(commitRegion(context, destImageIndex, destRegion)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_Cube::setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) -{ - ASSERT(size.width == size.height); - ASSERT(size.depth == 1); - - for (size_t level = 0; level < levels; level++) - { - GLsizei mipSize = std::max(1, size.width >> level); - for (int faceIndex = 0; faceIndex < 6; faceIndex++) - { - mImageArray[faceIndex][level]->redefine(GL_TEXTURE_CUBE_MAP, internalFormat, gl::Extents(mipSize, mipSize, 1), true); - } - } - - for (size_t level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) - { - for (int faceIndex = 0; faceIndex < 6; faceIndex++) - { - mImageArray[faceIndex][level]->redefine(GL_TEXTURE_CUBE_MAP, GL_NONE, gl::Extents(0, 0, 0), true); - } - } - - // TODO(geofflang): Verify storage creation had no errors - bool renderTarget = IsRenderTargetUsage(mState.getUsage()); - - TexStoragePointer storage(context); - storage.reset(mRenderer->createTextureStorageCube(internalFormat, renderTarget, size.width, - static_cast<int>(levels), false)); - - ANGLE_TRY(setCompleteTexStorage(context, storage.get())); - storage.release(); - - ANGLE_TRY(updateStorage(context)); - - mImmutable = true; - - return gl::NoError(); -} - -// Tests for cube texture completeness. [OpenGL ES 2.0.24] section 3.7.10 page 81. -bool TextureD3D_Cube::isCubeComplete() const -{ - int baseWidth = getBaseLevelWidth(); - int baseHeight = getBaseLevelHeight(); - GLenum baseFormat = getBaseLevelInternalFormat(); - - if (baseWidth <= 0 || baseWidth != baseHeight) - { - return false; - } - - for (int faceIndex = 1; faceIndex < 6; faceIndex++) - { - const ImageD3D &faceBaseImage = *mImageArray[faceIndex][getBaseLevel()]; - - if (faceBaseImage.getWidth() != baseWidth || - faceBaseImage.getHeight() != baseHeight || - faceBaseImage.getInternalFormat() != baseFormat ) - { - return false; - } - } - - return true; -} - -gl::Error TextureD3D_Cube::bindTexImage(const gl::Context *context, egl::Surface *surface) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_Cube::releaseTexImage(const gl::Context *context) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_Cube::initMipmapImages(const gl::Context *context) -{ - const GLuint baseLevel = mState.getEffectiveBaseLevel(); - const GLuint maxLevel = mState.getMipmapMaxLevel(); - // Purge array levels baseLevel + 1 through q and reset them to represent the generated mipmap - // levels. - for (int faceIndex = 0; faceIndex < 6; faceIndex++) - { - for (GLuint level = baseLevel + 1; level <= maxLevel; level++) - { - int faceLevelSize = - (std::max(mImageArray[faceIndex][baseLevel]->getWidth() >> (level - baseLevel), 1)); - ANGLE_TRY(redefineImage(context, faceIndex, level, - mImageArray[faceIndex][baseLevel]->getInternalFormat(), - gl::Extents(faceLevelSize, faceLevelSize, 1), false)); - } - } - return gl::NoError(); -} - -gl::Error TextureD3D_Cube::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - ASSERT(gl::IsCubeMapTextureTarget(index.type)); - - // ensure the underlying texture is created - ANGLE_TRY(ensureRenderTarget(context)); - ANGLE_TRY(updateStorageFaceLevel(context, index.layerIndex, index.mipIndex)); - - return mTexStorage->getRenderTarget(context, index, outRT); -} - -gl::Error TextureD3D_Cube::initializeStorage(const gl::Context *context, bool renderTarget) -{ - // Only initialize the first time this texture is used as a render target or shader resource - if (mTexStorage) - { - return gl::NoError(); - } - - // do not attempt to create storage for nonexistant data - if (!isFaceLevelComplete(0, getBaseLevel())) - { - return gl::NoError(); - } - - bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage())); - - TexStoragePointer storage(context); - ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage)); - - ANGLE_TRY(setCompleteTexStorage(context, storage.get())); - storage.release(); - - ASSERT(mTexStorage); - - // flush image data to the storage - ANGLE_TRY(updateStorage(context)); - - return gl::NoError(); -} - -gl::Error TextureD3D_Cube::createCompleteStorage(bool renderTarget, - TexStoragePointer *outStorage) const -{ - GLsizei size = getLevelZeroWidth(); - - ASSERT(size > 0); - - // use existing storage level count, when previously specified by TexStorage*D - GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(size, size, 1)); - - bool hintLevelZeroOnly = false; - if (mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - // If any of the CPU images (levels >= 1) are dirty, then the textureStorage should use the mipped texture to begin with. - // Otherwise, it should use the level-zero-only texture. - hintLevelZeroOnly = true; - for (int faceIndex = 0; faceIndex < 6 && hintLevelZeroOnly; faceIndex++) - { - for (int level = 1; level < levels && hintLevelZeroOnly; level++) - { - hintLevelZeroOnly = !(mImageArray[faceIndex][level]->isDirty() && isFaceLevelComplete(faceIndex, level)); - } - } - } - - // TODO (geofflang): detect if storage creation succeeded - outStorage->reset(mRenderer->createTextureStorageCube( - getBaseLevelInternalFormat(), renderTarget, size, levels, hintLevelZeroOnly)); - - return gl::NoError(); -} - -gl::Error TextureD3D_Cube::setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) -{ - if (newCompleteTexStorage && newCompleteTexStorage->isManaged()) - { - for (int faceIndex = 0; faceIndex < 6; faceIndex++) - { - for (int level = 0; level < newCompleteTexStorage->getLevelCount(); level++) - { - ANGLE_TRY(mImageArray[faceIndex][level]->setManagedSurfaceCube( - context, newCompleteTexStorage, faceIndex, level)); - } - } - } - - ANGLE_TRY(releaseTexStorage(context)); - mTexStorage = newCompleteTexStorage; - - mDirtyImages = true; - return gl::NoError(); -} - -gl::Error TextureD3D_Cube::updateStorage(const gl::Context *context) -{ - if (!mDirtyImages) - { - return gl::NoError(); - } - - ASSERT(mTexStorage != nullptr); - GLint storageLevels = mTexStorage->getLevelCount(); - for (int face = 0; face < 6; face++) - { - for (int level = 0; level < storageLevels; level++) - { - if (mImageArray[face][level]->isDirty() && isFaceLevelComplete(face, level)) - { - ANGLE_TRY(updateStorageFaceLevel(context, face, level)); - } - } - } - - mDirtyImages = false; - return gl::NoError(); -} - -bool TextureD3D_Cube::isValidFaceLevel(int faceIndex, int level) const -{ - return (mTexStorage ? (level >= 0 && level < mTexStorage->getLevelCount()) : 0); -} - -bool TextureD3D_Cube::isFaceLevelComplete(int faceIndex, int level) const -{ - if (getBaseLevel() >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - { - return false; - } - ASSERT(level >= 0 && faceIndex < 6 && level < static_cast<int>(mImageArray[faceIndex].size()) && - mImageArray[faceIndex][level] != nullptr); - - if (isImmutable()) - { - return true; - } - - int levelZeroSize = getLevelZeroWidth(); - - if (levelZeroSize <= 0) - { - return false; - } - - // "isCubeComplete" checks for base level completeness and we must call that - // to determine if any face at level 0 is complete. We omit that check here - // to avoid re-checking cube-completeness for every face at level 0. - if (level == 0) - { - return true; - } - - // Check that non-zero levels are consistent with the base level. - const ImageD3D *faceLevelImage = mImageArray[faceIndex][level].get(); - - if (faceLevelImage->getInternalFormat() != getBaseLevelInternalFormat()) - { - return false; - } - - if (faceLevelImage->getWidth() != std::max(1, levelZeroSize >> level)) - { - return false; - } - - return true; -} - -bool TextureD3D_Cube::isImageComplete(const gl::ImageIndex &index) const -{ - return isFaceLevelComplete(index.layerIndex, index.mipIndex); -} - -gl::Error TextureD3D_Cube::updateStorageFaceLevel(const gl::Context *context, - int faceIndex, - int level) -{ - ASSERT(level >= 0 && faceIndex < 6 && level < static_cast<int>(mImageArray[faceIndex].size()) && - mImageArray[faceIndex][level] != nullptr); - ImageD3D *image = mImageArray[faceIndex][level].get(); - - if (image->isDirty()) - { - GLenum faceTarget = gl::LayerIndexToCubeMapTextureTarget(faceIndex); - gl::ImageIndex index = gl::ImageIndex::MakeCube(faceTarget, level); - gl::Box region(0, 0, 0, image->getWidth(), image->getHeight(), 1); - ANGLE_TRY(commitRegion(context, index, region)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_Cube::redefineImage(const gl::Context *context, - int faceIndex, - GLint level, - GLenum internalformat, - const gl::Extents &size, - bool forceRelease) -{ - // If there currently is a corresponding storage texture image, it has these parameters - const int storageWidth = std::max(1, getLevelZeroWidth() >> level); - const int storageHeight = std::max(1, getLevelZeroHeight() >> level); - const GLenum storageFormat = getBaseLevelInternalFormat(); - - mImageArray[faceIndex][level]->redefine(GL_TEXTURE_CUBE_MAP, internalformat, size, - forceRelease); - mDirtyImages = mDirtyImages || mImageArray[faceIndex][level]->isDirty(); - - if (mTexStorage) - { - const int storageLevels = mTexStorage->getLevelCount(); - - if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth || - size.height != storageHeight || - internalformat != storageFormat) // Discard mismatched storage - { - markAllImagesDirty(); - ANGLE_TRY(releaseTexStorage(context)); - } - } - - return gl::NoError(); -} - -gl::ImageIndexIterator TextureD3D_Cube::imageIterator() const -{ - return gl::ImageIndexIterator::MakeCube(0, mTexStorage->getLevelCount()); -} - -gl::ImageIndex TextureD3D_Cube::getImageIndex(GLint mip, GLint layer) const -{ - // The "layer" of the image index corresponds to the cube face - return gl::ImageIndex::MakeCube(gl::LayerIndexToCubeMapTextureTarget(layer), mip); -} - -bool TextureD3D_Cube::isValidIndex(const gl::ImageIndex &index) const -{ - return (mTexStorage && gl::IsCubeMapTextureTarget(index.type) && - index.mipIndex >= 0 && index.mipIndex < mTexStorage->getLevelCount()); -} - -void TextureD3D_Cube::markAllImagesDirty() -{ - for (int dirtyLevel = 0; dirtyLevel < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; dirtyLevel++) - { - for (int dirtyFace = 0; dirtyFace < 6; dirtyFace++) - { - mImageArray[dirtyFace][dirtyLevel]->markDirty(); - } - } - mDirtyImages = true; -} - -TextureD3D_3D::TextureD3D_3D(const gl::TextureState &state, RendererD3D *renderer) - : TextureD3D(state, renderer) -{ - for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++i) - { - mImageArray[i].reset(renderer->createImage()); - } -} - -gl::Error TextureD3D_3D::onDestroy(const gl::Context *context) -{ - // Delete the Images before the TextureStorage. Images might be relying on the TextureStorage - // for some of their data. If TextureStorage is deleted before the Images, then their data will - // be wastefully copied back from the GPU before we delete the Images. - for (auto &image : mImageArray) - { - image.reset(); - } - return TextureD3D::onDestroy(context); -} - -TextureD3D_3D::~TextureD3D_3D() -{ -} - -ImageD3D *TextureD3D_3D::getImage(int level, int layer) const -{ - ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(layer == 0); - return mImageArray[level].get(); -} - -ImageD3D *TextureD3D_3D::getImage(const gl::ImageIndex &index) const -{ - ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(!index.hasLayer()); - ASSERT(index.type == GL_TEXTURE_3D); - return mImageArray[index.mipIndex].get(); -} - -GLsizei TextureD3D_3D::getLayerCount(int level) const -{ - ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - return 1; -} - -GLsizei TextureD3D_3D::getWidth(GLint level) const -{ - if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mImageArray[level]->getWidth(); - else - return 0; -} - -GLsizei TextureD3D_3D::getHeight(GLint level) const -{ - if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mImageArray[level]->getHeight(); - else - return 0; -} - -GLsizei TextureD3D_3D::getDepth(GLint level) const -{ - if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mImageArray[level]->getDepth(); - else - return 0; -} - -GLenum TextureD3D_3D::getInternalFormat(GLint level) const -{ - if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mImageArray[level]->getInternalFormat(); - else - return GL_NONE; -} - -bool TextureD3D_3D::isDepth(GLint level) const -{ - return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).depthBits > 0; -} - -gl::Error TextureD3D_3D::setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_3D::setImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_3D); - const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type); - - GLint level = static_cast<GLint>(imageLevel); - ANGLE_TRY(redefineImage(context, level, internalFormatInfo.sizedInternalFormat, size, false)); - - bool fastUnpacked = false; - - gl::ImageIndex index = gl::ImageIndex::Make3D(level); - - // Attempt a fast gpu copy of the pixel data to the surface if the app bound an unpack buffer - gl::Buffer *unpackBuffer = - context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack); - if (isFastUnpackable(unpackBuffer, internalFormatInfo.sizedInternalFormat) && !size.empty() && - isLevelComplete(level)) - { - // Will try to create RT storage if it does not exist - RenderTargetD3D *destRenderTarget = nullptr; - ANGLE_TRY(getRenderTarget(context, index, &destRenderTarget)); - - gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), getDepth(level)); - - ANGLE_TRY(fastUnpackPixels(context, unpack, pixels, destArea, - internalFormatInfo.sizedInternalFormat, type, destRenderTarget)); - - // Ensure we don't overwrite our newly initialized data - mImageArray[level]->markClean(); - - fastUnpacked = true; - } - - if (!fastUnpacked) - { - ANGLE_TRY(setImageImpl(context, index, type, unpack, pixels, 0)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_3D::setSubImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_3D); - - GLint level = static_cast<GLint>(imageLevel); - gl::ImageIndex index = gl::ImageIndex::Make3D(level); - - // Attempt a fast gpu copy of the pixel data to the surface if the app bound an unpack buffer - gl::Buffer *unpackBuffer = - context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack); - if (isFastUnpackable(unpackBuffer, getInternalFormat(level)) && isLevelComplete(level)) - { - RenderTargetD3D *destRenderTarget = nullptr; - ANGLE_TRY(getRenderTarget(context, index, &destRenderTarget)); - ASSERT(!mImageArray[level]->isDirty()); - - return fastUnpackPixels(context, unpack, pixels, area, getInternalFormat(level), type, - destRenderTarget); - } - else - { - return TextureD3D::subImage(context, index, area, format, type, unpack, pixels, 0); - } -} - -gl::Error TextureD3D_3D::setCompressedImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_3D); - - GLint level = static_cast<GLint>(imageLevel); - // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly - ANGLE_TRY(redefineImage(context, level, internalFormat, size, false)); - - gl::ImageIndex index = gl::ImageIndex::Make3D(level); - return setCompressedImageImpl(context, index, unpack, pixels, 0); -} - -gl::Error TextureD3D_3D::setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_3D); - - gl::ImageIndex index = gl::ImageIndex::Make3D(static_cast<GLint>(level)); - ANGLE_TRY(TextureD3D::subImageCompressed(context, index, area, format, unpack, pixels, 0)); - return commitRegion(context, index, area); -} - -gl::Error TextureD3D_3D::copyImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Rectangle &sourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) -{ - UNIMPLEMENTED(); - return gl::InternalError() << "Copying 3D textures is unimplemented."; -} - -gl::Error TextureD3D_3D::copySubImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) -{ - ASSERT(target == GL_TEXTURE_3D); - - GLint level = static_cast<GLint>(imageLevel); - - gl::Extents fbSize = source->getReadColorbuffer()->getSize(); - gl::Rectangle clippedSourceArea; - if (!ClipRectangle(sourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height), - &clippedSourceArea)) - { - return gl::NoError(); - } - const gl::Offset clippedDestOffset(destOffset.x + clippedSourceArea.x - sourceArea.x, - destOffset.y + clippedSourceArea.y - sourceArea.y, - destOffset.z); - - // Currently, copying directly to the storage is not possible because it's not possible to - // create an SRV from a single layer of a 3D texture. Instead, make sure the image is up to - // date before the copy and then copy back to the storage afterwards if needed. - // TODO: Investigate 3D blits in D3D11. - - bool syncTexStorage = mTexStorage && isLevelComplete(level); - if (syncTexStorage) - { - gl::ImageIndex index = gl::ImageIndex::Make3D(level); - ANGLE_TRY(mImageArray[level]->copyFromTexStorage(context, index, mTexStorage)); - } - ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(context, clippedDestOffset, clippedSourceArea, - source)); - mDirtyImages = true; - - if (syncTexStorage) - { - ANGLE_TRY(updateStorageLevel(context, level)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_3D::setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) -{ - ASSERT(target == GL_TEXTURE_3D); - - for (size_t level = 0; level < levels; level++) - { - gl::Extents levelSize(std::max(1, size.width >> level), - std::max(1, size.height >> level), - std::max(1, size.depth >> level)); - mImageArray[level]->redefine(GL_TEXTURE_3D, internalFormat, levelSize, true); - } - - for (size_t level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) - { - mImageArray[level]->redefine(GL_TEXTURE_3D, GL_NONE, gl::Extents(0, 0, 0), true); - } - - // TODO(geofflang): Verify storage creation had no errors - bool renderTarget = IsRenderTargetUsage(mState.getUsage()); - TexStoragePointer storage(context); - storage.reset(mRenderer->createTextureStorage3D(internalFormat, renderTarget, size.width, - size.height, size.depth, - static_cast<int>(levels))); - - ANGLE_TRY(setCompleteTexStorage(context, storage.get())); - storage.release(); - - ANGLE_TRY(updateStorage(context)); - - mImmutable = true; - - return gl::NoError(); -} - -gl::Error TextureD3D_3D::bindTexImage(const gl::Context *context, egl::Surface *surface) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_3D::releaseTexImage(const gl::Context *context) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_3D::initMipmapImages(const gl::Context *context) -{ - const GLuint baseLevel = mState.getEffectiveBaseLevel(); - const GLuint maxLevel = mState.getMipmapMaxLevel(); - // Purge array levels baseLevel + 1 through q and reset them to represent the generated mipmap - // levels. - for (GLuint level = baseLevel + 1; level <= maxLevel; level++) - { - gl::Extents levelSize(std::max(getLevelZeroWidth() >> level, 1), - std::max(getLevelZeroHeight() >> level, 1), - std::max(getLevelZeroDepth() >> level, 1)); - ANGLE_TRY(redefineImage(context, level, getBaseLevelInternalFormat(), levelSize, false)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_3D::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - // ensure the underlying texture is created - ANGLE_TRY(ensureRenderTarget(context)); - - if (index.hasLayer()) - { - ANGLE_TRY(updateStorage(context)); - } - else - { - ANGLE_TRY(updateStorageLevel(context, index.mipIndex)); - } - - return mTexStorage->getRenderTarget(context, index, outRT); -} - -gl::Error TextureD3D_3D::initializeStorage(const gl::Context *context, bool renderTarget) -{ - // Only initialize the first time this texture is used as a render target or shader resource - if (mTexStorage) - { - return gl::NoError(); - } - - // do not attempt to create storage for nonexistant data - if (!isLevelComplete(getBaseLevel())) - { - return gl::NoError(); - } - - bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage())); - - TexStoragePointer storage(context); - ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage)); - - ANGLE_TRY(setCompleteTexStorage(context, storage.get())); - storage.release(); - - ASSERT(mTexStorage); - - // flush image data to the storage - ANGLE_TRY(updateStorage(context)); - - return gl::NoError(); -} - -gl::Error TextureD3D_3D::createCompleteStorage(bool renderTarget, - TexStoragePointer *outStorage) const -{ - GLsizei width = getLevelZeroWidth(); - GLsizei height = getLevelZeroHeight(); - GLsizei depth = getLevelZeroDepth(); - GLenum internalFormat = getBaseLevelInternalFormat(); - - ASSERT(width > 0 && height > 0 && depth > 0); - - // use existing storage level count, when previously specified by TexStorage*D - GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(width, height, depth)); - - // TODO: Verify creation of the storage succeeded - outStorage->reset(mRenderer->createTextureStorage3D(internalFormat, renderTarget, width, height, - depth, levels)); - - return gl::NoError(); -} - -gl::Error TextureD3D_3D::setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) -{ - ANGLE_TRY(releaseTexStorage(context)); - mTexStorage = newCompleteTexStorage; - mDirtyImages = true; - - // We do not support managed 3D storage, as that is D3D9/ES2-only - ASSERT(!mTexStorage->isManaged()); - - return gl::NoError(); -} - -gl::Error TextureD3D_3D::updateStorage(const gl::Context *context) -{ - if (!mDirtyImages) - { - return gl::NoError(); - } - - ASSERT(mTexStorage != nullptr); - GLint storageLevels = mTexStorage->getLevelCount(); - for (int level = 0; level < storageLevels; level++) - { - if (mImageArray[level]->isDirty() && isLevelComplete(level)) - { - ANGLE_TRY(updateStorageLevel(context, level)); - } - } - - mDirtyImages = false; - return gl::NoError(); -} - -bool TextureD3D_3D::isValidLevel(int level) const -{ - return (mTexStorage ? (level >= 0 && level < mTexStorage->getLevelCount()) : 0); -} - -bool TextureD3D_3D::isLevelComplete(int level) const -{ - ASSERT(level >= 0 && level < static_cast<int>(mImageArray.size()) && - mImageArray[level] != nullptr); - - if (isImmutable()) - { - return true; - } - - GLsizei width = getLevelZeroWidth(); - GLsizei height = getLevelZeroHeight(); - GLsizei depth = getLevelZeroDepth(); - - if (width <= 0 || height <= 0 || depth <= 0) - { - return false; - } - - if (level == static_cast<int>(getBaseLevel())) - { - return true; - } - - ImageD3D *levelImage = mImageArray[level].get(); - - if (levelImage->getInternalFormat() != getBaseLevelInternalFormat()) - { - return false; - } - - if (levelImage->getWidth() != std::max(1, width >> level)) - { - return false; - } - - if (levelImage->getHeight() != std::max(1, height >> level)) - { - return false; - } - - if (levelImage->getDepth() != std::max(1, depth >> level)) - { - return false; - } - - return true; -} - -bool TextureD3D_3D::isImageComplete(const gl::ImageIndex &index) const -{ - return isLevelComplete(index.mipIndex); -} - -gl::Error TextureD3D_3D::updateStorageLevel(const gl::Context *context, int level) -{ - ASSERT(level >= 0 && level < static_cast<int>(mImageArray.size()) && - mImageArray[level] != nullptr); - ASSERT(isLevelComplete(level)); - - if (mImageArray[level]->isDirty()) - { - gl::ImageIndex index = gl::ImageIndex::Make3D(level); - gl::Box region(0, 0, 0, getWidth(level), getHeight(level), getDepth(level)); - ANGLE_TRY(commitRegion(context, index, region)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_3D::redefineImage(const gl::Context *context, - GLint level, - GLenum internalformat, - const gl::Extents &size, - bool forceRelease) -{ - // If there currently is a corresponding storage texture image, it has these parameters - const int storageWidth = std::max(1, getLevelZeroWidth() >> level); - const int storageHeight = std::max(1, getLevelZeroHeight() >> level); - const int storageDepth = std::max(1, getLevelZeroDepth() >> level); - const GLenum storageFormat = getBaseLevelInternalFormat(); - - mImageArray[level]->redefine(GL_TEXTURE_3D, internalformat, size, forceRelease); - mDirtyImages = mDirtyImages || mImageArray[level]->isDirty(); - - if (mTexStorage) - { - const int storageLevels = mTexStorage->getLevelCount(); - - if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth || - size.height != storageHeight || size.depth != storageDepth || - internalformat != storageFormat) // Discard mismatched storage - { - markAllImagesDirty(); - ANGLE_TRY(releaseTexStorage(context)); - } - } - - return gl::NoError(); -} - -gl::ImageIndexIterator TextureD3D_3D::imageIterator() const -{ - return gl::ImageIndexIterator::Make3D(0, mTexStorage->getLevelCount(), - gl::ImageIndex::ENTIRE_LEVEL, gl::ImageIndex::ENTIRE_LEVEL); -} - -gl::ImageIndex TextureD3D_3D::getImageIndex(GLint mip, GLint /*layer*/) const -{ - // The "layer" here does not apply to 3D images. We use one Image per mip. - return gl::ImageIndex::Make3D(mip); -} - -bool TextureD3D_3D::isValidIndex(const gl::ImageIndex &index) const -{ - return (mTexStorage && index.type == GL_TEXTURE_3D && - index.mipIndex >= 0 && index.mipIndex < mTexStorage->getLevelCount()); -} - -void TextureD3D_3D::markAllImagesDirty() -{ - for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) - { - mImageArray[i]->markDirty(); - } - mDirtyImages = true; -} - -GLint TextureD3D_3D::getLevelZeroDepth() const -{ - ASSERT(gl::CountLeadingZeros(static_cast<uint32_t>(getBaseLevelDepth())) > getBaseLevel()); - return getBaseLevelDepth() << getBaseLevel(); -} - -TextureD3D_2DArray::TextureD3D_2DArray(const gl::TextureState &state, RendererD3D *renderer) - : TextureD3D(state, renderer) -{ - for (int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++level) - { - mLayerCounts[level] = 0; - mImageArray[level] = nullptr; - } -} - -gl::Error TextureD3D_2DArray::onDestroy(const gl::Context *context) -{ - // Delete the Images before the TextureStorage. Images might be relying on the TextureStorage - // for some of their data. If TextureStorage is deleted before the Images, then their data will - // be wastefully copied back from the GPU before we delete the Images. - deleteImages(); - return TextureD3D::onDestroy(context); -} - -TextureD3D_2DArray::~TextureD3D_2DArray() -{ -} - -ImageD3D *TextureD3D_2DArray::getImage(int level, int layer) const -{ - ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT((layer == 0 && mLayerCounts[level] == 0) || - layer < mLayerCounts[level]); - return (mImageArray[level] ? mImageArray[level][layer] : nullptr); -} - -ImageD3D *TextureD3D_2DArray::getImage(const gl::ImageIndex &index) const -{ - ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(index.layerIndex != gl::ImageIndex::ENTIRE_LEVEL); - ASSERT((index.layerIndex == 0 && mLayerCounts[index.mipIndex] == 0) || - index.layerIndex < mLayerCounts[index.mipIndex]); - ASSERT(index.type == GL_TEXTURE_2D_ARRAY); - return (mImageArray[index.mipIndex] ? mImageArray[index.mipIndex][index.layerIndex] : nullptr); -} - -GLsizei TextureD3D_2DArray::getLayerCount(int level) const -{ - ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - return mLayerCounts[level]; -} - -GLsizei TextureD3D_2DArray::getWidth(GLint level) const -{ - return (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS && mLayerCounts[level] > 0) ? mImageArray[level][0]->getWidth() : 0; -} - -GLsizei TextureD3D_2DArray::getHeight(GLint level) const -{ - return (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS && mLayerCounts[level] > 0) ? mImageArray[level][0]->getHeight() : 0; -} - -GLenum TextureD3D_2DArray::getInternalFormat(GLint level) const -{ - return (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS && mLayerCounts[level] > 0) ? mImageArray[level][0]->getInternalFormat() : GL_NONE; -} - -bool TextureD3D_2DArray::isDepth(GLint level) const -{ - return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).depthBits > 0; -} - -gl::Error TextureD3D_2DArray::setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_2DArray::setImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_2D_ARRAY); - - const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat, type); - - GLint level = static_cast<GLint>(imageLevel); - ANGLE_TRY(redefineImage(context, level, formatInfo.sizedInternalFormat, size, false)); - - GLsizei inputDepthPitch = 0; - ANGLE_TRY_RESULT(formatInfo.computeDepthPitch(type, size.width, size.height, unpack.alignment, - unpack.rowLength, unpack.imageHeight), - inputDepthPitch); - - for (int i = 0; i < size.depth; i++) - { - const ptrdiff_t layerOffset = (inputDepthPitch * i); - gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, i); - ANGLE_TRY(setImageImpl(context, index, type, unpack, pixels, layerOffset)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2DArray::setSubImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_2D_ARRAY); - GLint level = static_cast<GLint>(imageLevel); - const gl::InternalFormat &formatInfo = - gl::GetInternalFormatInfo(getInternalFormat(level), type); - GLsizei inputDepthPitch = 0; - ANGLE_TRY_RESULT(formatInfo.computeDepthPitch(type, area.width, area.height, unpack.alignment, - unpack.rowLength, unpack.imageHeight), - inputDepthPitch); - - for (int i = 0; i < area.depth; i++) - { - int layer = area.z + i; - const ptrdiff_t layerOffset = (inputDepthPitch * i); - - gl::Box layerArea(area.x, area.y, 0, area.width, area.height, 1); - - gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, layer); - ANGLE_TRY(TextureD3D::subImage(context, index, layerArea, format, type, unpack, pixels, - layerOffset)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2DArray::setCompressedImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_2D_ARRAY); - - GLint level = static_cast<GLint>(imageLevel); - // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly - ANGLE_TRY(redefineImage(context, level, internalFormat, size, false)); - - const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalFormat); - GLsizei inputDepthPitch = 0; - ANGLE_TRY_RESULT( - formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, size.width, size.height, 1, 0, 0), - inputDepthPitch); - - for (int i = 0; i < size.depth; i++) - { - const ptrdiff_t layerOffset = (inputDepthPitch * i); - - gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, i); - ANGLE_TRY(setCompressedImageImpl(context, index, unpack, pixels, layerOffset)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2DArray::setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - ASSERT(target == GL_TEXTURE_2D_ARRAY); - - const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(format); - GLsizei inputDepthPitch = 0; - ANGLE_TRY_RESULT( - formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, area.width, area.height, 1, 0, 0), - inputDepthPitch); - - for (int i = 0; i < area.depth; i++) - { - int layer = area.z + i; - const ptrdiff_t layerOffset = (inputDepthPitch * i); - - gl::Box layerArea(area.x, area.y, 0, area.width, area.height, 1); - - gl::ImageIndex index = gl::ImageIndex::Make2DArray(static_cast<GLint>(level), layer); - ANGLE_TRY(TextureD3D::subImageCompressed(context, index, layerArea, format, unpack, pixels, - layerOffset)); - ANGLE_TRY(commitRegion(context, index, layerArea)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2DArray::copyImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Rectangle &sourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) -{ - UNIMPLEMENTED(); - return gl::InternalError() << "Copying 2D array textures is unimplemented."; -} - -gl::Error TextureD3D_2DArray::copySubImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) -{ - ASSERT(target == GL_TEXTURE_2D_ARRAY); - - GLint level = static_cast<GLint>(imageLevel); - gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, destOffset.z); - - gl::Extents fbSize = source->getReadColorbuffer()->getSize(); - gl::Rectangle clippedSourceArea; - if (!ClipRectangle(sourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height), - &clippedSourceArea)) - { - return gl::NoError(); - } - const gl::Offset clippedDestOffset(destOffset.x + clippedSourceArea.x - sourceArea.x, - destOffset.y + clippedSourceArea.y - sourceArea.y, - destOffset.z); - - if (!canCreateRenderTargetForImage(index)) - { - gl::Offset destLayerOffset(clippedDestOffset.x, clippedDestOffset.y, 0); - ANGLE_TRY(mImageArray[level][clippedDestOffset.z]->copyFromFramebuffer( - context, destLayerOffset, clippedSourceArea, source)); - mDirtyImages = true; - } - else - { - ANGLE_TRY(ensureRenderTarget(context)); - - if (isValidLevel(level)) - { - ANGLE_TRY(updateStorageLevel(context, level)); - ANGLE_TRY( - mRenderer->copyImage2DArray(context, source, clippedSourceArea, - gl::GetUnsizedFormat(getInternalFormat(getBaseLevel())), - clippedDestOffset, mTexStorage, level)); - } - } - return gl::NoError(); -} - -gl::Error TextureD3D_2DArray::setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) -{ - ASSERT(target == GL_TEXTURE_2D_ARRAY); - - deleteImages(); - - for (size_t level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) - { - gl::Extents levelLayerSize(std::max(1, size.width >> level), - std::max(1, size.height >> level), - 1); - - mLayerCounts[level] = (level < levels ? size.depth : 0); - - if (mLayerCounts[level] > 0) - { - // Create new images for this level - mImageArray[level] = new ImageD3D*[mLayerCounts[level]]; - - for (int layer = 0; layer < mLayerCounts[level]; layer++) - { - mImageArray[level][layer] = mRenderer->createImage(); - mImageArray[level][layer]->redefine(GL_TEXTURE_2D_ARRAY, internalFormat, levelLayerSize, true); - } - } - } - - // TODO(geofflang): Verify storage creation had no errors - bool renderTarget = IsRenderTargetUsage(mState.getUsage()); - TexStoragePointer storage(context); - storage.reset(mRenderer->createTextureStorage2DArray(internalFormat, renderTarget, size.width, - size.height, size.depth, - static_cast<int>(levels))); - - ANGLE_TRY(setCompleteTexStorage(context, storage.get())); - storage.release(); - - ANGLE_TRY(updateStorage(context)); - - mImmutable = true; - - return gl::NoError(); -} - -gl::Error TextureD3D_2DArray::bindTexImage(const gl::Context *context, egl::Surface *surface) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_2DArray::releaseTexImage(const gl::Context *context) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_2DArray::initMipmapImages(const gl::Context *context) -{ - const GLuint baseLevel = mState.getEffectiveBaseLevel(); - const GLuint maxLevel = mState.getMipmapMaxLevel(); - int baseWidth = getLevelZeroWidth(); - int baseHeight = getLevelZeroHeight(); - int baseDepth = getLayerCount(getBaseLevel()); - GLenum baseFormat = getBaseLevelInternalFormat(); - - // Purge array levels baseLevel + 1 through q and reset them to represent the generated mipmap - // levels. - for (GLuint level = baseLevel + 1u; level <= maxLevel; level++) - { - ASSERT((baseWidth >> level) > 0 || (baseHeight >> level) > 0); - gl::Extents levelLayerSize(std::max(baseWidth >> level, 1), - std::max(baseHeight >> level, 1), - baseDepth); - ANGLE_TRY(redefineImage(context, level, baseFormat, levelLayerSize, false)); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_2DArray::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - // ensure the underlying texture is created - ANGLE_TRY(ensureRenderTarget(context)); - ANGLE_TRY(updateStorageLevel(context, index.mipIndex)); - return mTexStorage->getRenderTarget(context, index, outRT); -} - -gl::Error TextureD3D_2DArray::initializeStorage(const gl::Context *context, bool renderTarget) -{ - // Only initialize the first time this texture is used as a render target or shader resource - if (mTexStorage) - { - return gl::NoError(); - } - - // do not attempt to create storage for nonexistant data - if (!isLevelComplete(getBaseLevel())) - { - return gl::NoError(); - } - - bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage())); - - TexStoragePointer storage(context); - ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage)); - - ANGLE_TRY(setCompleteTexStorage(context, storage.get())); - storage.release(); - - ASSERT(mTexStorage); - - // flush image data to the storage - ANGLE_TRY(updateStorage(context)); - - return gl::NoError(); -} - -gl::Error TextureD3D_2DArray::createCompleteStorage(bool renderTarget, - TexStoragePointer *outStorage) const -{ - GLsizei width = getLevelZeroWidth(); - GLsizei height = getLevelZeroHeight(); - GLsizei depth = getLayerCount(getBaseLevel()); - GLenum internalFormat = getBaseLevelInternalFormat(); - - ASSERT(width > 0 && height > 0 && depth > 0); - - // use existing storage level count, when previously specified by TexStorage*D - GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(width, height, 1)); - - // TODO(geofflang): Verify storage creation succeeds - outStorage->reset(mRenderer->createTextureStorage2DArray(internalFormat, renderTarget, width, - height, depth, levels)); - - return gl::NoError(); -} - -gl::Error TextureD3D_2DArray::setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) -{ - ANGLE_TRY(releaseTexStorage(context)); - mTexStorage = newCompleteTexStorage; - mDirtyImages = true; - - // We do not support managed 2D array storage, as managed storage is ES2/D3D9 only - ASSERT(!mTexStorage->isManaged()); - - return gl::NoError(); -} - -gl::Error TextureD3D_2DArray::updateStorage(const gl::Context *context) -{ - if (!mDirtyImages) - { - return gl::NoError(); - } - - ASSERT(mTexStorage != nullptr); - GLint storageLevels = mTexStorage->getLevelCount(); - for (int level = 0; level < storageLevels; level++) - { - if (isLevelComplete(level)) - { - ANGLE_TRY(updateStorageLevel(context, level)); - } - } - - mDirtyImages = false; - return gl::NoError(); -} - -bool TextureD3D_2DArray::isValidLevel(int level) const -{ - return (mTexStorage ? (level >= 0 && level < mTexStorage->getLevelCount()) : 0); -} - -bool TextureD3D_2DArray::isLevelComplete(int level) const -{ - ASSERT(level >= 0 && level < (int)ArraySize(mImageArray)); - - if (isImmutable()) - { - return true; - } - - GLsizei width = getLevelZeroWidth(); - GLsizei height = getLevelZeroHeight(); - - if (width <= 0 || height <= 0) - { - return false; - } - - // Layers check needs to happen after the above checks, otherwise out-of-range base level may be - // queried. - GLsizei layers = getLayerCount(getBaseLevel()); - - if (layers <= 0) - { - return false; - } - - if (level == static_cast<int>(getBaseLevel())) - { - return true; - } - - if (getInternalFormat(level) != getInternalFormat(getBaseLevel())) - { - return false; - } - - if (getWidth(level) != std::max(1, width >> level)) - { - return false; - } - - if (getHeight(level) != std::max(1, height >> level)) - { - return false; - } - - if (getLayerCount(level) != layers) - { - return false; - } - - return true; -} - -bool TextureD3D_2DArray::isImageComplete(const gl::ImageIndex &index) const -{ - return isLevelComplete(index.mipIndex); -} - -gl::Error TextureD3D_2DArray::updateStorageLevel(const gl::Context *context, int level) -{ - ASSERT(level >= 0 && level < static_cast<int>(ArraySize(mLayerCounts))); - ASSERT(isLevelComplete(level)); - - for (int layer = 0; layer < mLayerCounts[level]; layer++) - { - ASSERT(mImageArray[level] != nullptr && mImageArray[level][layer] != nullptr); - if (mImageArray[level][layer]->isDirty()) - { - gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, layer); - gl::Box region(0, 0, 0, getWidth(level), getHeight(level), 1); - ANGLE_TRY(commitRegion(context, index, region)); - } - } - - return gl::NoError(); -} - -void TextureD3D_2DArray::deleteImages() -{ - for (int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++level) - { - for (int layer = 0; layer < mLayerCounts[level]; ++layer) - { - delete mImageArray[level][layer]; - } - delete[] mImageArray[level]; - mImageArray[level] = nullptr; - mLayerCounts[level] = 0; - } -} - -gl::Error TextureD3D_2DArray::redefineImage(const gl::Context *context, - GLint level, - GLenum internalformat, - const gl::Extents &size, - bool forceRelease) -{ - // If there currently is a corresponding storage texture image, it has these parameters - const int storageWidth = std::max(1, getLevelZeroWidth() >> level); - const int storageHeight = std::max(1, getLevelZeroHeight() >> level); - const GLuint baseLevel = getBaseLevel(); - int storageDepth = 0; - if (baseLevel < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - { - storageDepth = getLayerCount(baseLevel); - } - - // Only reallocate the layers if the size doesn't match - if (size.depth != mLayerCounts[level]) - { - for (int layer = 0; layer < mLayerCounts[level]; layer++) - { - SafeDelete(mImageArray[level][layer]); - } - SafeDeleteArray(mImageArray[level]); - mLayerCounts[level] = size.depth; - - if (size.depth > 0) - { - mImageArray[level] = new ImageD3D*[size.depth]; - for (int layer = 0; layer < mLayerCounts[level]; layer++) - { - mImageArray[level][layer] = mRenderer->createImage(); - } - } - } - - if (size.depth > 0) - { - for (int layer = 0; layer < mLayerCounts[level]; layer++) - { - mImageArray[level][layer]->redefine(GL_TEXTURE_2D_ARRAY, internalformat, - gl::Extents(size.width, size.height, 1), - forceRelease); - mDirtyImages = mDirtyImages || mImageArray[level][layer]->isDirty(); - } - } - - if (mTexStorage) - { - const GLenum storageFormat = getBaseLevelInternalFormat(); - const int storageLevels = mTexStorage->getLevelCount(); - - if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth || - size.height != storageHeight || size.depth != storageDepth || - internalformat != storageFormat) // Discard mismatched storage - { - markAllImagesDirty(); - ANGLE_TRY(releaseTexStorage(context)); - } - } - - return gl::NoError(); -} - -gl::ImageIndexIterator TextureD3D_2DArray::imageIterator() const -{ - return gl::ImageIndexIterator::Make2DArray(0, mTexStorage->getLevelCount(), mLayerCounts); -} - -gl::ImageIndex TextureD3D_2DArray::getImageIndex(GLint mip, GLint layer) const -{ - return gl::ImageIndex::Make2DArray(mip, layer); -} - -bool TextureD3D_2DArray::isValidIndex(const gl::ImageIndex &index) const -{ - // Check for having a storage and the right type of index - if (!mTexStorage || index.type != GL_TEXTURE_2D_ARRAY) - { - return false; - } - - // Check the mip index - if (index.mipIndex < 0 || index.mipIndex >= mTexStorage->getLevelCount()) - { - return false; - } - - // Check the layer index - return (!index.hasLayer() || (index.layerIndex >= 0 && index.layerIndex < mLayerCounts[index.mipIndex])); -} - -void TextureD3D_2DArray::markAllImagesDirty() -{ - for (int dirtyLevel = 0; dirtyLevel < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; dirtyLevel++) - { - for (int dirtyLayer = 0; dirtyLayer < mLayerCounts[dirtyLevel]; dirtyLayer++) - { - mImageArray[dirtyLevel][dirtyLayer]->markDirty(); - } - } - mDirtyImages = true; -} - -TextureD3D_External::TextureD3D_External(const gl::TextureState &state, RendererD3D *renderer) - : TextureD3D(state, renderer) -{ -} - -TextureD3D_External::~TextureD3D_External() -{ -} - -ImageD3D *TextureD3D_External::getImage(const gl::ImageIndex &index) const -{ - UNREACHABLE(); - return nullptr; -} - -GLsizei TextureD3D_External::getLayerCount(int level) const -{ - return 1; -} - -gl::Error TextureD3D_External::setImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - // Image setting is not supported for external images - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_External::setSubImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_External::setCompressedImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_External::setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_External::copyImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Rectangle &sourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_External::copySubImage(const gl::Context *context, - GLenum target, - size_t imageLevel, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_External::setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_External::setImageExternal(const gl::Context *context, - GLenum target, - egl::Stream *stream, - const egl::Stream::GLTextureDescription &desc) -{ - ASSERT(target == GL_TEXTURE_EXTERNAL_OES); - - ANGLE_TRY(releaseTexStorage(context)); - - // If the stream is null, the external image is unbound and we release the storage - if (stream != nullptr) - { - mTexStorage = mRenderer->createTextureStorageExternal(stream, desc); - } - - return gl::NoError(); -} - -gl::Error TextureD3D_External::bindTexImage(const gl::Context *context, egl::Surface *surface) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_External::releaseTexImage(const gl::Context *context) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_External::setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) -{ - EGLImageD3D *eglImaged3d = GetImplAs<EGLImageD3D>(image); - - // Pass in the RenderTargetD3D here: createTextureStorage can't generate an error. - RenderTargetD3D *renderTargetD3D = nullptr; - ANGLE_TRY(eglImaged3d->getRenderTarget(context, &renderTargetD3D)); - - ANGLE_TRY(releaseTexStorage(context)); - mTexStorage = mRenderer->createTextureStorageEGLImage(eglImaged3d, renderTargetD3D); - - return gl::NoError(); -} - -gl::Error TextureD3D_External::initMipmapImages(const gl::Context *context) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_External::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -bool TextureD3D_External::isImageComplete(const gl::ImageIndex &index) const -{ - return (index.mipIndex == 0) ? (mTexStorage != nullptr) : false; -} - -gl::Error TextureD3D_External::initializeStorage(const gl::Context *context, bool renderTarget) -{ - // Texture storage is created when an external image is bound - ASSERT(mTexStorage); - return gl::NoError(); -} - -gl::Error TextureD3D_External::createCompleteStorage(bool renderTarget, - TexStoragePointer *outStorage) const -{ - UNREACHABLE(); - return gl::NoError(); -} - -gl::Error TextureD3D_External::setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) -{ - UNREACHABLE(); - return gl::NoError(); -} - -gl::Error TextureD3D_External::updateStorage(const gl::Context *context) -{ - // Texture storage does not need to be updated since it is already loaded with the latest - // external image - ASSERT(mTexStorage); - return gl::NoError(); -} - -gl::ImageIndexIterator TextureD3D_External::imageIterator() const -{ - return gl::ImageIndexIterator::Make2D(0, mTexStorage->getLevelCount()); -} - -gl::ImageIndex TextureD3D_External::getImageIndex(GLint mip, GLint /*layer*/) const -{ - // "layer" does not apply to 2D Textures. - return gl::ImageIndex::Make2D(mip); -} - -bool TextureD3D_External::isValidIndex(const gl::ImageIndex &index) const -{ - return (mTexStorage && index.type == GL_TEXTURE_EXTERNAL_OES && index.mipIndex == 0); -} - -void TextureD3D_External::markAllImagesDirty() -{ - UNREACHABLE(); -} - -TextureD3D_2DMultisample::TextureD3D_2DMultisample(const gl::TextureState &state, - RendererD3D *renderer) - : TextureD3D(state, renderer) -{ -} - -TextureD3D_2DMultisample::~TextureD3D_2DMultisample() -{ -} - -ImageD3D *TextureD3D_2DMultisample::getImage(const gl::ImageIndex &index) const -{ - return nullptr; -} - -gl::Error TextureD3D_2DMultisample::setImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_2DMultisample::setSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_2DMultisample::setCompressedImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_2DMultisample::setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_2DMultisample::copyImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Rectangle &sourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_2DMultisample::copySubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_2DMultisample::setStorageMultisample(const gl::Context *context, - GLenum target, - GLsizei samples, - GLint internalFormat, - const gl::Extents &size, - bool fixedSampleLocations) -{ - ASSERT(target == GL_TEXTURE_2D_MULTISAMPLE && size.depth == 1); - - TexStoragePointer storage(context); - storage.reset(mRenderer->createTextureStorage2DMultisample(internalFormat, size.width, - size.height, static_cast<int>(0), - samples, fixedSampleLocations)); - - ANGLE_TRY(setCompleteTexStorage(context, storage.get())); - storage.release(); - - ANGLE_TRY(updateStorage(context)); - - mImmutable = false; - - return gl::NoError(); -} - -gl::Error TextureD3D_2DMultisample::bindTexImage(const gl::Context *context, egl::Surface *surface) -{ - UNREACHABLE(); - return gl::NoError(); -} - -gl::Error TextureD3D_2DMultisample::releaseTexImage(const gl::Context *context) -{ - UNREACHABLE(); - return gl::NoError(); -} - -gl::Error TextureD3D_2DMultisample::setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureD3D_2DMultisample::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - ASSERT(!index.hasLayer()); - - // ensure the underlying texture is created - ANGLE_TRY(ensureRenderTarget(context)); - - return mTexStorage->getRenderTarget(context, index, outRT); -} - -gl::ImageIndexIterator TextureD3D_2DMultisample::imageIterator() const -{ - return gl::ImageIndexIterator::Make2DMultisample(); -} - -gl::ImageIndex TextureD3D_2DMultisample::getImageIndex(GLint mip, GLint layer) const -{ - return gl::ImageIndex::Make2DMultisample(); -} - -bool TextureD3D_2DMultisample::isValidIndex(const gl::ImageIndex &index) const -{ - return (mTexStorage && index.type == GL_TEXTURE_2D_MULTISAMPLE && index.mipIndex == 0); -} - -GLsizei TextureD3D_2DMultisample::getLayerCount(int level) const -{ - return 1; -} - -void TextureD3D_2DMultisample::markAllImagesDirty() -{ -} - -gl::Error TextureD3D_2DMultisample::initializeStorage(const gl::Context *context, bool renderTarget) -{ - // Only initialize the first time this texture is used as a render target or shader resource - if (mTexStorage) - { - return gl::NoError(); - } - - bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage())); - - TexStoragePointer storage(context); - ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage)); - - ANGLE_TRY(setCompleteTexStorage(context, storage.get())); - storage.release(); - - ASSERT(mTexStorage); - - // flush image data to the storage - ANGLE_TRY(updateStorage(context)); - - return gl::NoError(); -} - -gl::Error TextureD3D_2DMultisample::createCompleteStorage(bool renderTarget, - TexStoragePointer *outStorage) const -{ - outStorage->reset(mTexStorage); - - return gl::NoError(); -} - -gl::Error TextureD3D_2DMultisample::setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) -{ - ANGLE_TRY(releaseTexStorage(context)); - mTexStorage = newCompleteTexStorage; - - return gl::NoError(); -} - -gl::Error TextureD3D_2DMultisample::updateStorage(const gl::Context *context) -{ - return gl::NoError(); -} - -gl::Error TextureD3D_2DMultisample::initMipmapImages(const gl::Context *context) -{ - UNIMPLEMENTED(); - return gl::NoError(); -} - -bool TextureD3D_2DMultisample::isImageComplete(const gl::ImageIndex &index) const -{ - return true; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.h deleted file mode 100644 index eb206a6ccc..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.h +++ /dev/null @@ -1,891 +0,0 @@ -// -// 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/TextureStorage.h" - -namespace gl -{ -class Framebuffer; -} - -namespace rx -{ -class EGLImageD3D; -class ImageD3D; -class RendererD3D; -class RenderTargetD3D; -class TextureStorage; - -template <typename T> -using TexLevelsArray = std::array<T, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS>; - -class TextureD3D : public TextureImpl -{ - public: - TextureD3D(const gl::TextureState &data, RendererD3D *renderer); - ~TextureD3D() override; - - gl::Error onDestroy(const gl::Context *context) override; - - gl::Error 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; - - gl::Error getImageAndSyncFromStorage(const gl::Context *context, - const gl::ImageIndex &index, - ImageD3D **outImage); - - GLint getBaseLevelWidth() const; - GLint getBaseLevelHeight() const; - GLenum getBaseLevelInternalFormat() const; - - gl::Error setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) override; - - gl::Error setStorageMultisample(const gl::Context *context, - GLenum target, - GLsizei samples, - GLint internalFormat, - const gl::Extents &size, - bool fixedSampleLocations) override; - - bool isImmutable() const { return mImmutable; } - - virtual gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - 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; - - gl::Error setImageExternal(const gl::Context *context, - GLenum target, - egl::Stream *stream, - const egl::Stream::GLTextureDescription &desc) override; - gl::Error generateMipmap(const gl::Context *context) override; - TextureStorage *getStorage(); - ImageD3D *getBaseLevelImage() const; - - gl::Error getAttachmentRenderTarget(const gl::Context *context, - GLenum binding, - const gl::ImageIndex &imageIndex, - FramebufferAttachmentRenderTarget **rtOut) override; - - gl::Error setBaseLevel(const gl::Context *context, GLuint baseLevel) override; - - void syncState(const gl::Texture::DirtyBits &dirtyBits) override; - - gl::Error initializeContents(const gl::Context *context, - const gl::ImageIndex &imageIndex) override; - - protected: - gl::Error setImageImpl(const gl::Context *context, - const gl::ImageIndex &index, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels, - ptrdiff_t layerOffset); - gl::Error subImage(const gl::Context *context, - const gl::ImageIndex &index, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels, - ptrdiff_t layerOffset); - gl::Error setCompressedImageImpl(const gl::Context *context, - const gl::ImageIndex &index, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels, - ptrdiff_t layerOffset); - gl::Error 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, GLenum sizedInternalFormat); - gl::Error fastUnpackPixels(const gl::Context *context, - const gl::PixelUnpackState &unpack, - 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 gl::Error 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; - gl::Error ensureRenderTarget(const gl::Context *context); - - virtual gl::Error createCompleteStorage(bool renderTarget, - TexStoragePointer *outTexStorage) const = 0; - virtual gl::Error setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) = 0; - gl::Error commitRegion(const gl::Context *context, - const gl::ImageIndex &index, - const gl::Box ®ion); - - gl::Error releaseTexStorage(const gl::Context *context); - - GLuint getBaseLevel() const { return mBaseLevel; }; - - virtual void markAllImagesDirty() = 0; - - GLint getBaseLevelDepth() const; - - RendererD3D *mRenderer; - - bool mDirtyImages; - - bool mImmutable; - TextureStorage *mTexStorage; - - private: - virtual gl::Error initializeStorage(const gl::Context *context, bool renderTarget) = 0; - - virtual gl::Error updateStorage(const gl::Context *context) = 0; - - bool shouldUseSetData(const ImageD3D *image) const; - - gl::Error 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; - - gl::Error 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; - - gl::Error setImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - gl::Error setSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - - gl::Error setCompressedImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - gl::Error setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - - gl::Error copyImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Rectangle &sourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) override; - gl::Error copySubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) override; - - gl::Error copyTexture(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - GLenum type, - size_t sourceLevel, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - const gl::Texture *source) override; - gl::Error copySubTexture(const gl::Context *context, - GLenum target, - size_t level, - const gl::Offset &destOffset, - size_t sourceLevel, - const gl::Rectangle &sourceArea, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - const gl::Texture *source) override; - gl::Error copyCompressedTexture(const gl::Context *context, const gl::Texture *source) override; - - gl::Error setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) override; - - gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override; - gl::Error releaseTexImage(const gl::Context *context) override; - - gl::Error setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) override; - - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - 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: - gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override; - gl::Error createCompleteStorage(bool renderTarget, - TexStoragePointer *outTexStorage) const override; - gl::Error setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) override; - - gl::Error updateStorage(const gl::Context *context) override; - gl::Error initMipmapImages(const gl::Context *context) override; - - bool isValidLevel(int level) const; - bool isLevelComplete(int level) const; - bool isImageComplete(const gl::ImageIndex &index) const override; - - gl::Error updateStorageLevel(const gl::Context *context, int level); - - gl::Error redefineImage(const gl::Context *context, - size_t level, - GLenum internalformat, - const gl::Extents &size, - bool forceRelease); - - bool mEGLImageTarget; - TexLevelsArray<std::unique_ptr<ImageD3D>> mImageArray; -}; - -class TextureD3D_Cube : public TextureD3D -{ - public: - TextureD3D_Cube(const gl::TextureState &data, RendererD3D *renderer); - ~TextureD3D_Cube() override; - - gl::Error 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; - - gl::Error setImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - gl::Error setSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - - gl::Error setCompressedImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - gl::Error setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - - gl::Error copyImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Rectangle &sourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) override; - gl::Error copySubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) override; - - gl::Error copyTexture(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - GLenum type, - size_t sourceLevel, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - const gl::Texture *source) override; - gl::Error copySubTexture(const gl::Context *context, - GLenum target, - size_t level, - const gl::Offset &destOffset, - size_t sourceLevel, - const gl::Rectangle &sourceArea, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - const gl::Texture *source) override; - - gl::Error setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) override; - - gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override; - gl::Error releaseTexImage(const gl::Context *context) override; - - gl::Error setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) override; - - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - 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: - gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override; - gl::Error createCompleteStorage(bool renderTarget, - TexStoragePointer *outTexStorage) const override; - gl::Error setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) override; - - gl::Error updateStorage(const gl::Context *context) override; - gl::Error 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; - gl::Error updateStorageFaceLevel(const gl::Context *context, int faceIndex, int level); - - gl::Error redefineImage(const gl::Context *context, - int faceIndex, - GLint level, - GLenum internalformat, - const gl::Extents &size, - bool forceRelease); - - std::array<TexLevelsArray<std::unique_ptr<ImageD3D>>, 6> mImageArray; -}; - -class TextureD3D_3D : public TextureD3D -{ - public: - TextureD3D_3D(const gl::TextureState &data, RendererD3D *renderer); - ~TextureD3D_3D() override; - - gl::Error 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; - - gl::Error setImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - gl::Error setSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - - gl::Error setCompressedImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - gl::Error setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - - gl::Error copyImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Rectangle &sourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) override; - gl::Error copySubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) override; - - gl::Error setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) override; - - gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override; - gl::Error releaseTexImage(const gl::Context *context) override; - - gl::Error setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) override; - - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - 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: - gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override; - gl::Error createCompleteStorage(bool renderTarget, - TexStoragePointer *outStorage) const override; - gl::Error setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) override; - - gl::Error updateStorage(const gl::Context *context) override; - gl::Error initMipmapImages(const gl::Context *context) override; - - bool isValidLevel(int level) const; - bool isLevelComplete(int level) const; - bool isImageComplete(const gl::ImageIndex &index) const override; - gl::Error updateStorageLevel(const gl::Context *context, int level); - - gl::Error redefineImage(const gl::Context *context, - GLint level, - GLenum internalformat, - const gl::Extents &size, - bool forceRelease); - - TexLevelsArray<std::unique_ptr<ImageD3D>> mImageArray; -}; - -class TextureD3D_2DArray : public TextureD3D -{ - public: - TextureD3D_2DArray(const gl::TextureState &data, RendererD3D *renderer); - ~TextureD3D_2DArray() override; - - gl::Error 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; - - gl::Error setImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - gl::Error setSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - - gl::Error setCompressedImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - gl::Error setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - - gl::Error copyImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Rectangle &sourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) override; - gl::Error copySubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) override; - - gl::Error setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) override; - - gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override; - gl::Error releaseTexImage(const gl::Context *context) override; - - gl::Error setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) override; - - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - 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: - gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override; - gl::Error createCompleteStorage(bool renderTarget, - TexStoragePointer *outStorage) const override; - gl::Error setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) override; - - gl::Error updateStorage(const gl::Context *context) override; - gl::Error initMipmapImages(const gl::Context *context) override; - - bool isValidLevel(int level) const; - bool isLevelComplete(int level) const; - bool isImageComplete(const gl::ImageIndex &index) const override; - gl::Error updateStorageLevel(const gl::Context *context, int level); - - void deleteImages(); - gl::Error 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]; -}; - -class TextureD3D_External : public TextureD3D -{ - public: - TextureD3D_External(const gl::TextureState &data, RendererD3D *renderer); - ~TextureD3D_External() override; - - ImageD3D *getImage(const gl::ImageIndex &index) const override; - GLsizei getLayerCount(int level) const override; - - gl::Error setImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - gl::Error setSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - - gl::Error setCompressedImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - gl::Error setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - - gl::Error copyImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Rectangle &sourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) override; - gl::Error copySubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) override; - - gl::Error setStorage(const gl::Context *context, - GLenum target, - size_t levels, - GLenum internalFormat, - const gl::Extents &size) override; - - gl::Error setImageExternal(const gl::Context *context, - GLenum target, - egl::Stream *stream, - const egl::Stream::GLTextureDescription &desc) override; - - gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override; - gl::Error releaseTexImage(const gl::Context *context) override; - - gl::Error setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) override; - - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - 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: - gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override; - gl::Error createCompleteStorage(bool renderTarget, - TexStoragePointer *outTexStorage) const override; - gl::Error setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) override; - - gl::Error updateStorage(const gl::Context *context) override; - gl::Error initMipmapImages(const gl::Context *context) override; - - bool isImageComplete(const gl::ImageIndex &index) const override; -}; - -class TextureD3D_2DMultisample : public TextureD3D -{ - public: - TextureD3D_2DMultisample(const gl::TextureState &data, RendererD3D *renderer); - ~TextureD3D_2DMultisample() override; - - ImageD3D *getImage(const gl::ImageIndex &index) const override; - gl::Error setImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - gl::Error setSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixels) override; - - gl::Error setCompressedImage(const gl::Context *context, - GLenum target, - size_t level, - GLenum internalFormat, - const gl::Extents &size, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - gl::Error setCompressedSubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Box &area, - GLenum format, - const gl::PixelUnpackState &unpack, - size_t imageSize, - const uint8_t *pixels) override; - - gl::Error copyImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Rectangle &sourceArea, - GLenum internalFormat, - const gl::Framebuffer *source) override; - gl::Error copySubImage(const gl::Context *context, - GLenum target, - size_t level, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) override; - - gl::Error setStorageMultisample(const gl::Context *context, - GLenum target, - GLsizei samples, - GLint internalFormat, - const gl::Extents &size, - bool fixedSampleLocations) override; - - gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override; - gl::Error releaseTexImage(const gl::Context *context) override; - - gl::Error setEGLImageTarget(const gl::Context *context, - GLenum target, - egl::Image *image) override; - - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - 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; - - private: - gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override; - gl::Error createCompleteStorage(bool renderTarget, - TexStoragePointer *outTexStorage) const override; - gl::Error setCompleteTexStorage(const gl::Context *context, - TextureStorage *newCompleteTexStorage) override; - - gl::Error updateStorage(const gl::Context *context) override; - gl::Error initMipmapImages(const gl::Context *context) override; - - bool isImageComplete(const gl::ImageIndex &index) const override; -}; -} - -#endif // LIBANGLE_RENDERER_D3D_TEXTURED3D_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureStorage.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureStorage.h deleted file mode 100644 index 383fbc2141..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureStorage.h +++ /dev/null @@ -1,82 +0,0 @@ -// -// Copyright (c) 2002-2013 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. -// - -// TextureStorage.h: Defines the abstract rx::TextureStorage class. - -#ifndef LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_ -#define LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_ - -#include "common/debug.h" -#include "libANGLE/angletypes.h" - -#include <GLES2/gl2.h> -#include <stdint.h> - -namespace gl -{ -class Context; -struct ImageIndex; -struct Box; -struct PixelUnpackState; -} // namespace gl - -namespace rx -{ -class SwapChainD3D; -class RenderTargetD3D; -class ImageD3D; - -class TextureStorage : angle::NonCopyable -{ - public: - TextureStorage() {} - virtual ~TextureStorage() {} - - virtual gl::Error onDestroy(const gl::Context *context); - - virtual int getTopLevel() const = 0; - virtual bool isRenderTarget() const = 0; - virtual bool isManaged() const = 0; - virtual bool supportsNativeMipmapFunction() const = 0; - virtual int getLevelCount() const = 0; - - virtual gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) = 0; - virtual gl::Error generateMipmap(const gl::Context *context, - const gl::ImageIndex &sourceIndex, - const gl::ImageIndex &destIndex) = 0; - - virtual gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) = 0; - virtual gl::Error setData(const gl::Context *context, - const gl::ImageIndex &index, - ImageD3D *image, - const gl::Box *destBox, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixelData) = 0; - - // This is a no-op for most implementations of TextureStorage. Some (e.g. TextureStorage11_2D) might override it. - virtual gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context, - bool useLevelZeroTexture); -}; - -inline gl::Error TextureStorage::onDestroy(const gl::Context *context) -{ - return gl::NoError(); -} - -inline gl::Error TextureStorage::useLevelZeroWorkaroundTexture(const gl::Context *context, - bool useLevelZeroTexture) -{ - return gl::NoError(); -} - -using TexStoragePointer = angle::UniqueObjectPointer<TextureStorage, gl::Context>; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp deleted file mode 100644 index 7c2d5aec70..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp +++ /dev/null @@ -1,293 +0,0 @@ -// -// Copyright (c) 2002-2012 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. -// - -// VertexBuffer.cpp: Defines the abstract VertexBuffer class and VertexBufferInterface -// class with derivations, classes that perform graphics API agnostic vertex buffer operations. - -#include "libANGLE/renderer/d3d/VertexBuffer.h" - -#include "common/mathutil.h" -#include "libANGLE/renderer/d3d/BufferD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/VertexAttribute.h" - -namespace rx -{ - -// VertexBuffer Implementation -unsigned int VertexBuffer::mNextSerial = 1; - -VertexBuffer::VertexBuffer() : mRefCount(1) -{ - updateSerial(); -} - -VertexBuffer::~VertexBuffer() -{ -} - -void VertexBuffer::updateSerial() -{ - mSerial = mNextSerial++; -} - -unsigned int VertexBuffer::getSerial() const -{ - return mSerial; -} - -void VertexBuffer::addRef() -{ - mRefCount++; -} - -void VertexBuffer::release() -{ - ASSERT(mRefCount > 0); - mRefCount--; - - if (mRefCount == 0) - { - delete this; - } -} - -// VertexBufferInterface Implementation -VertexBufferInterface::VertexBufferInterface(BufferFactoryD3D *factory, bool dynamic) - : mFactory(factory), mVertexBuffer(factory->createVertexBuffer()), mDynamic(dynamic) -{ -} - -VertexBufferInterface::~VertexBufferInterface() -{ - if (mVertexBuffer) - { - mVertexBuffer->release(); - } -} - -unsigned int VertexBufferInterface::getSerial() const -{ - return mVertexBuffer->getSerial(); -} - -unsigned int VertexBufferInterface::getBufferSize() const -{ - return mVertexBuffer->getBufferSize(); -} - -gl::Error VertexBufferInterface::setBufferSize(unsigned int size) -{ - if (mVertexBuffer->getBufferSize() == 0) - { - return mVertexBuffer->initialize(size, mDynamic); - } - - return mVertexBuffer->setBufferSize(size); -} - -gl::ErrorOrResult<unsigned int> VertexBufferInterface::getSpaceRequired( - const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLsizei count, - GLsizei instances) const -{ - unsigned int spaceRequired = 0; - ANGLE_TRY_RESULT(mFactory->getVertexSpaceRequired(attrib, binding, count, instances), - spaceRequired); - - // Align to 16-byte boundary - unsigned int alignedSpaceRequired = roundUp(spaceRequired, 16u); - - if (alignedSpaceRequired < spaceRequired) - { - return gl::OutOfMemory() - << "Vertex buffer overflow in VertexBufferInterface::getSpaceRequired."; - } - - return alignedSpaceRequired; -} - -gl::Error VertexBufferInterface::discard() -{ - return mVertexBuffer->discard(); -} - -VertexBuffer *VertexBufferInterface::getVertexBuffer() const -{ - return mVertexBuffer; -} - -// StreamingVertexBufferInterface Implementation -StreamingVertexBufferInterface::StreamingVertexBufferInterface(BufferFactoryD3D *factory, - std::size_t initialSize) - : VertexBufferInterface(factory, true), mWritePosition(0), mReservedSpace(0) -{ - // TODO(jmadill): Make an initialize method that can return an error. - ANGLE_SWALLOW_ERR(setBufferSize(static_cast<unsigned int>(initialSize))); -} - -StreamingVertexBufferInterface::~StreamingVertexBufferInterface() -{ -} - -gl::Error StreamingVertexBufferInterface::reserveSpace(unsigned int size) -{ - unsigned int curBufferSize = getBufferSize(); - if (size > curBufferSize) - { - ANGLE_TRY(setBufferSize(std::max(size, 3 * curBufferSize / 2))); - mWritePosition = 0; - } - else if (mWritePosition + size > curBufferSize) - { - ANGLE_TRY(discard()); - mWritePosition = 0; - } - - return gl::NoError(); -} - -gl::Error StreamingVertexBufferInterface::storeDynamicAttribute(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLenum currentValueType, - GLint start, - GLsizei count, - GLsizei instances, - unsigned int *outStreamOffset, - const uint8_t *sourceData) -{ - unsigned int spaceRequired = 0; - ANGLE_TRY_RESULT(getSpaceRequired(attrib, binding, count, instances), spaceRequired); - - // Protect against integer overflow - angle::CheckedNumeric<unsigned int> checkedPosition(mWritePosition); - checkedPosition += spaceRequired; - if (!checkedPosition.IsValid()) - { - return gl::OutOfMemory() - << "Internal error, new vertex buffer write position would overflow."; - } - - ANGLE_TRY(reserveSpace(mReservedSpace)); - mReservedSpace = 0; - - ANGLE_TRY(mVertexBuffer->storeVertexAttributes(attrib, binding, currentValueType, start, count, - instances, mWritePosition, sourceData)); - - if (outStreamOffset) - { - *outStreamOffset = mWritePosition; - } - - mWritePosition += spaceRequired; - - return gl::NoError(); -} - -gl::Error StreamingVertexBufferInterface::reserveVertexSpace(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLsizei count, - GLsizei instances) -{ - unsigned int requiredSpace = 0; - ANGLE_TRY_RESULT(mFactory->getVertexSpaceRequired(attrib, binding, count, instances), - requiredSpace); - - // Align to 16-byte boundary - auto alignedRequiredSpace = rx::CheckedRoundUp(requiredSpace, 16u); - alignedRequiredSpace += mReservedSpace; - - // Protect against integer overflow - if (!alignedRequiredSpace.IsValid()) - { - return gl::OutOfMemory() - << "Unable to reserve " << requiredSpace - << " extra bytes in internal vertex buffer, it would result in an overflow."; - } - - mReservedSpace = alignedRequiredSpace.ValueOrDie(); - - return gl::NoError(); -} - -// StaticVertexBufferInterface Implementation -StaticVertexBufferInterface::AttributeSignature::AttributeSignature() - : type(GL_NONE), size(0), stride(0), normalized(false), pureInteger(false), offset(0) -{ -} - -bool StaticVertexBufferInterface::AttributeSignature::matchesAttribute( - const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding) const -{ - size_t attribStride = ComputeVertexAttributeStride(attrib, binding); - - if (type != attrib.type || size != attrib.size || static_cast<GLuint>(stride) != attribStride || - normalized != attrib.normalized || pureInteger != attrib.pureInteger) - { - return false; - } - - size_t attribOffset = - (static_cast<size_t>(ComputeVertexAttributeOffset(attrib, binding)) % attribStride); - return (offset == attribOffset); -} - -void StaticVertexBufferInterface::AttributeSignature::set(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding) -{ - type = attrib.type; - size = attrib.size; - normalized = attrib.normalized; - pureInteger = attrib.pureInteger; - offset = stride = static_cast<GLuint>(ComputeVertexAttributeStride(attrib, binding)); - offset = static_cast<size_t>(ComputeVertexAttributeOffset(attrib, binding)) % - ComputeVertexAttributeStride(attrib, binding); -} - -StaticVertexBufferInterface::StaticVertexBufferInterface(BufferFactoryD3D *factory) - : VertexBufferInterface(factory, false) -{ -} - -StaticVertexBufferInterface::~StaticVertexBufferInterface() -{ -} - -bool StaticVertexBufferInterface::matchesAttribute(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding) const -{ - return mSignature.matchesAttribute(attrib, binding); -} - -void StaticVertexBufferInterface::setAttribute(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding) -{ - return mSignature.set(attrib, binding); -} - -gl::Error StaticVertexBufferInterface::storeStaticAttribute(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLint start, - GLsizei count, - GLsizei instances, - const uint8_t *sourceData) -{ - unsigned int spaceRequired = 0; - ANGLE_TRY_RESULT(getSpaceRequired(attrib, binding, count, instances), spaceRequired); - ANGLE_TRY(setBufferSize(spaceRequired)); - - ASSERT(attrib.enabled); - ANGLE_TRY(mVertexBuffer->storeVertexAttributes(attrib, binding, GL_NONE, start, count, - instances, 0, sourceData)); - - mSignature.set(attrib, binding); - mVertexBuffer->hintUnmapResource(); - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.h deleted file mode 100644 index df8085d3cb..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.h +++ /dev/null @@ -1,175 +0,0 @@ -// -// Copyright (c) 2002-2012 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. -// - -// VertexBuffer.h: Defines the abstract VertexBuffer class and VertexBufferInterface -// class with derivations, classes that perform graphics API agnostic vertex buffer operations. - -#ifndef LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_ -#define LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_ - -#include "common/angleutils.h" -#include "libANGLE/Error.h" - -#include <GLES2/gl2.h> - -#include <cstddef> -#include <cstdint> -#include <vector> - -namespace gl -{ -struct VertexAttribute; -class VertexBinding; -struct VertexAttribCurrentValueData; -} - -namespace rx -{ -class BufferFactoryD3D; - -// Use a ref-counting scheme with self-deletion on release. We do this so that we can more -// easily manage the static buffer cache, without deleting currently bound buffers. -class VertexBuffer : angle::NonCopyable -{ - public: - VertexBuffer(); - - virtual gl::Error initialize(unsigned int size, bool dynamicUsage) = 0; - - // Warning: you should ensure binding really matches attrib.bindingIndex before using this - // function. - virtual gl::Error storeVertexAttributes(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLenum currentValueType, - GLint start, - GLsizei count, - GLsizei instances, - unsigned int offset, - const uint8_t *sourceData) = 0; - - virtual unsigned int getBufferSize() const = 0; - virtual gl::Error setBufferSize(unsigned int size) = 0; - virtual gl::Error discard() = 0; - - unsigned int getSerial() const; - - // This may be overridden (e.g. by VertexBuffer11) if necessary. - virtual void hintUnmapResource() { }; - - // Reference counting. - void addRef(); - void release(); - - protected: - void updateSerial(); - virtual ~VertexBuffer(); - - private: - unsigned int mSerial; - static unsigned int mNextSerial; - unsigned int mRefCount; -}; - -class VertexBufferInterface : angle::NonCopyable -{ - public: - VertexBufferInterface(BufferFactoryD3D *factory, bool dynamic); - virtual ~VertexBufferInterface(); - - unsigned int getBufferSize() const; - bool empty() const { return getBufferSize() == 0; } - - unsigned int getSerial() const; - - VertexBuffer *getVertexBuffer() const; - - protected: - gl::Error discard(); - - gl::Error setBufferSize(unsigned int size); - - gl::ErrorOrResult<unsigned int> getSpaceRequired(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLsizei count, - GLsizei instances) const; - BufferFactoryD3D *const mFactory; - VertexBuffer *mVertexBuffer; - bool mDynamic; -}; - -class StreamingVertexBufferInterface : public VertexBufferInterface -{ - public: - StreamingVertexBufferInterface(BufferFactoryD3D *factory, std::size_t initialSize); - ~StreamingVertexBufferInterface() override; - - gl::Error storeDynamicAttribute(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLenum currentValueType, - GLint start, - GLsizei count, - GLsizei instances, - unsigned int *outStreamOffset, - const uint8_t *sourceData); - - gl::Error reserveVertexSpace(const gl::VertexAttribute &attribute, - const gl::VertexBinding &binding, - GLsizei count, - GLsizei instances); - - private: - gl::Error reserveSpace(unsigned int size); - - unsigned int mWritePosition; - unsigned int mReservedSpace; -}; - -class StaticVertexBufferInterface : public VertexBufferInterface -{ - public: - explicit StaticVertexBufferInterface(BufferFactoryD3D *factory); - ~StaticVertexBufferInterface() override; - - // Warning: you should ensure binding really matches attrib.bindingIndex before using these - // functions. - gl::Error storeStaticAttribute(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLint start, - GLsizei count, - GLsizei instances, - const uint8_t *sourceData); - - bool matchesAttribute(const gl::VertexAttribute &attribute, - const gl::VertexBinding &binding) const; - - void setAttribute(const gl::VertexAttribute &attribute, const gl::VertexBinding &binding); - - private: - class AttributeSignature final : angle::NonCopyable - { - public: - AttributeSignature(); - - bool matchesAttribute(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding) const; - - void set(const gl::VertexAttribute &attrib, const gl::VertexBinding &binding); - - private: - GLenum type; - GLuint size; - GLuint stride; - bool normalized; - bool pureInteger; - size_t offset; - }; - - AttributeSignature mSignature; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp deleted file mode 100644 index 54ad5e54f5..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp +++ /dev/null @@ -1,646 +0,0 @@ -// -// Copyright (c) 2002-2012 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. -// - -// VertexDataManager.h: Defines the VertexDataManager, a class that -// runs the Buffer translation process. - -#include "libANGLE/renderer/d3d/VertexDataManager.h" - -#include "common/bitset_utils.h" -#include "libANGLE/Buffer.h" -#include "libANGLE/Context.h" -#include "libANGLE/Program.h" -#include "libANGLE/State.h" -#include "libANGLE/VertexArray.h" -#include "libANGLE/VertexAttribute.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/BufferD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/VertexBuffer.h" - -using namespace angle; - -namespace rx -{ -namespace -{ -enum -{ - INITIAL_STREAM_BUFFER_SIZE = 1024 * 1024 -}; -// This has to be at least 4k or else it fails on ATI cards. -enum -{ - CONSTANT_VERTEX_BUFFER_SIZE = 4096 -}; - -// Warning: you should ensure binding really matches attrib.bindingIndex before using this function. -int ElementsInBuffer(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - unsigned int size) -{ - // Size cannot be larger than a GLsizei - if (size > static_cast<unsigned int>(std::numeric_limits<int>::max())) - { - size = static_cast<unsigned int>(std::numeric_limits<int>::max()); - } - - GLsizei stride = static_cast<GLsizei>(ComputeVertexAttributeStride(attrib, binding)); - GLsizei offset = static_cast<GLsizei>(ComputeVertexAttributeOffset(attrib, binding)); - return (size - offset % stride + - (stride - static_cast<GLsizei>(ComputeVertexAttributeTypeSize(attrib)))) / - stride; -} - -// Warning: you should ensure binding really matches attrib.bindingIndex before using this function. -bool DirectStoragePossible(const gl::VertexAttribute &attrib, const gl::VertexBinding &binding) -{ - // Current value attribs may not use direct storage. - if (!attrib.enabled) - { - return false; - } - - gl::Buffer *buffer = binding.getBuffer().get(); - if (!buffer) - { - return false; - } - - BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer); - ASSERT(bufferD3D); - if (!bufferD3D->supportsDirectBinding()) - { - return false; - } - - // Alignment restrictions: In D3D, vertex data must be aligned to the format stride, or to a - // 4-byte boundary, whichever is smaller. (Undocumented, and experimentally confirmed) - size_t alignment = 4; - - // TODO(jmadill): add VertexFormatCaps - BufferFactoryD3D *factory = bufferD3D->getFactory(); - - gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib); - - // CPU-converted vertex data must be converted (naturally). - if ((factory->getVertexConversionType(vertexFormatType) & VERTEX_CONVERT_CPU) != 0) - { - return false; - } - - if (attrib.type != GL_FLOAT) - { - auto errorOrElementSize = factory->getVertexSpaceRequired(attrib, binding, 1, 0); - if (errorOrElementSize.isError()) - { - ERR() << "Unlogged error in DirectStoragePossible."; - return false; - } - - alignment = std::min<size_t>(errorOrElementSize.getResult(), 4); - } - - GLintptr offset = ComputeVertexAttributeOffset(attrib, binding); - // Final alignment check - unaligned data must be converted. - return (static_cast<size_t>(ComputeVertexAttributeStride(attrib, binding)) % alignment == 0) && - (static_cast<size_t>(offset) % alignment == 0); -} -} // anonymous namespace - -TranslatedAttribute::TranslatedAttribute() - : active(false), - attribute(nullptr), - binding(nullptr), - currentValueType(GL_NONE), - baseOffset(0), - usesFirstVertexOffset(false), - stride(0), - vertexBuffer(), - storage(nullptr), - serial(0), - divisor(0) -{ -} - -TranslatedAttribute::TranslatedAttribute(const TranslatedAttribute &other) = default; - -gl::ErrorOrResult<unsigned int> TranslatedAttribute::computeOffset(GLint startVertex) const -{ - if (!usesFirstVertexOffset) - { - return baseOffset; - } - - CheckedNumeric<unsigned int> offset; - - offset = baseOffset + stride * static_cast<unsigned int>(startVertex); - ANGLE_TRY_CHECKED_MATH(offset); - return offset.ValueOrDie(); -} - -// Warning: you should ensure binding really matches attrib.bindingIndex before using this function. -VertexStorageType ClassifyAttributeStorage(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding) -{ - // If attribute is disabled, we use the current value. - if (!attrib.enabled) - { - return VertexStorageType::CURRENT_VALUE; - } - - // If specified with immediate data, we must use dynamic storage. - auto *buffer = binding.getBuffer().get(); - if (!buffer) - { - return VertexStorageType::DYNAMIC; - } - - // Check if the buffer supports direct storage. - if (DirectStoragePossible(attrib, binding)) - { - return VertexStorageType::DIRECT; - } - - // Otherwise the storage is static or dynamic. - BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer); - ASSERT(bufferD3D); - switch (bufferD3D->getUsage()) - { - case D3DBufferUsage::DYNAMIC: - return VertexStorageType::DYNAMIC; - case D3DBufferUsage::STATIC: - return VertexStorageType::STATIC; - default: - UNREACHABLE(); - return VertexStorageType::UNKNOWN; - } -} - -VertexDataManager::CurrentValueState::CurrentValueState() : buffer(), offset(0) -{ - data.FloatValues[0] = std::numeric_limits<float>::quiet_NaN(); - data.FloatValues[1] = std::numeric_limits<float>::quiet_NaN(); - data.FloatValues[2] = std::numeric_limits<float>::quiet_NaN(); - data.FloatValues[3] = std::numeric_limits<float>::quiet_NaN(); - data.Type = GL_FLOAT; -} - -VertexDataManager::CurrentValueState::~CurrentValueState() -{ -} - -VertexDataManager::VertexDataManager(BufferFactoryD3D *factory) - : mFactory(factory), mStreamingBuffer(), mCurrentValueCache(gl::MAX_VERTEX_ATTRIBS) -{ -} - -VertexDataManager::~VertexDataManager() -{ -} - -gl::Error VertexDataManager::initialize() -{ - mStreamingBuffer.reset( - new StreamingVertexBufferInterface(mFactory, INITIAL_STREAM_BUFFER_SIZE)); - if (!mStreamingBuffer) - { - return gl::OutOfMemory() << "Failed to allocate the streaming vertex buffer."; - } - - return gl::NoError(); -} - -void VertexDataManager::deinitialize() -{ - mStreamingBuffer.reset(); - mCurrentValueCache.clear(); -} - -gl::Error VertexDataManager::prepareVertexData(const gl::Context *context, - GLint start, - GLsizei count, - std::vector<TranslatedAttribute> *translatedAttribs, - GLsizei instances) -{ - ASSERT(mStreamingBuffer); - - const gl::State &state = context->getGLState(); - const gl::VertexArray *vertexArray = state.getVertexArray(); - const auto &vertexAttributes = vertexArray->getVertexAttributes(); - const auto &vertexBindings = vertexArray->getVertexBindings(); - - mDynamicAttribsMaskCache.reset(); - const gl::Program *program = state.getProgram(); - - translatedAttribs->clear(); - - for (size_t attribIndex = 0; attribIndex < vertexAttributes.size(); ++attribIndex) - { - // Skip attrib locations the program doesn't use. - if (!program->isAttribLocationActive(attribIndex)) - continue; - - const auto &attrib = vertexAttributes[attribIndex]; - const auto &binding = vertexBindings[attrib.bindingIndex]; - - // Resize automatically puts in empty attribs - translatedAttribs->resize(attribIndex + 1); - - TranslatedAttribute *translated = &(*translatedAttribs)[attribIndex]; - auto currentValueData = state.getVertexAttribCurrentValue(attribIndex); - - // Record the attribute now - translated->active = true; - translated->attribute = &attrib; - translated->binding = &binding; - translated->currentValueType = currentValueData.Type; - translated->divisor = binding.getDivisor(); - - switch (ClassifyAttributeStorage(attrib, binding)) - { - case VertexStorageType::STATIC: - { - // Store static attribute. - ANGLE_TRY(StoreStaticAttrib(context, translated)); - break; - } - case VertexStorageType::DYNAMIC: - // Dynamic attributes must be handled together. - mDynamicAttribsMaskCache.set(attribIndex); - break; - case VertexStorageType::DIRECT: - // Update translated data for direct attributes. - StoreDirectAttrib(translated); - break; - case VertexStorageType::CURRENT_VALUE: - { - ANGLE_TRY(storeCurrentValue(currentValueData, translated, attribIndex)); - break; - } - default: - UNREACHABLE(); - break; - } - } - - if (mDynamicAttribsMaskCache.none()) - { - return gl::NoError(); - } - - ANGLE_TRY(storeDynamicAttribs(context, translatedAttribs, mDynamicAttribsMaskCache, start, - count, instances)); - - PromoteDynamicAttribs(context, *translatedAttribs, mDynamicAttribsMaskCache, count); - - return gl::NoError(); -} - -// static -void VertexDataManager::StoreDirectAttrib(TranslatedAttribute *directAttrib) -{ - ASSERT(directAttrib->attribute && directAttrib->binding); - const auto &attrib = *directAttrib->attribute; - const auto &binding = *directAttrib->binding; - - gl::Buffer *buffer = binding.getBuffer().get(); - ASSERT(buffer); - BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer); - - ASSERT(DirectStoragePossible(attrib, binding)); - directAttrib->vertexBuffer.set(nullptr); - directAttrib->storage = bufferD3D; - directAttrib->serial = bufferD3D->getSerial(); - directAttrib->stride = static_cast<unsigned int>(ComputeVertexAttributeStride(attrib, binding)); - directAttrib->baseOffset = - static_cast<unsigned int>(ComputeVertexAttributeOffset(attrib, binding)); - - // Instanced vertices do not apply the 'start' offset - directAttrib->usesFirstVertexOffset = (binding.getDivisor() == 0); -} - -// static -gl::Error VertexDataManager::StoreStaticAttrib(const gl::Context *context, - TranslatedAttribute *translated) -{ - ASSERT(translated->attribute && translated->binding); - const auto &attrib = *translated->attribute; - const auto &binding = *translated->binding; - - gl::Buffer *buffer = binding.getBuffer().get(); - ASSERT(buffer && attrib.enabled && !DirectStoragePossible(attrib, binding)); - BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer); - - // Compute source data pointer - const uint8_t *sourceData = nullptr; - const int offset = static_cast<int>(ComputeVertexAttributeOffset(attrib, binding)); - - ANGLE_TRY(bufferD3D->getData(context, &sourceData)); - sourceData += offset; - - unsigned int streamOffset = 0; - - translated->storage = nullptr; - ANGLE_TRY_RESULT(bufferD3D->getFactory()->getVertexSpaceRequired(attrib, binding, 1, 0), - translated->stride); - - auto *staticBuffer = bufferD3D->getStaticVertexBuffer(attrib, binding); - ASSERT(staticBuffer); - - if (staticBuffer->empty()) - { - // Convert the entire buffer - int totalCount = - ElementsInBuffer(attrib, binding, static_cast<unsigned int>(bufferD3D->getSize())); - int startIndex = offset / static_cast<int>(ComputeVertexAttributeStride(attrib, binding)); - - ANGLE_TRY(staticBuffer->storeStaticAttribute(attrib, binding, -startIndex, totalCount, 0, - sourceData)); - } - - unsigned int firstElementOffset = - (static_cast<unsigned int>(offset) / - static_cast<unsigned int>(ComputeVertexAttributeStride(attrib, binding))) * - translated->stride; - - VertexBuffer *vertexBuffer = staticBuffer->getVertexBuffer(); - - CheckedNumeric<unsigned int> checkedOffset(streamOffset); - checkedOffset += firstElementOffset; - - if (!checkedOffset.IsValid()) - { - return gl::InternalError() << "Integer overflow in VertexDataManager::StoreStaticAttrib"; - } - - translated->vertexBuffer.set(vertexBuffer); - translated->serial = vertexBuffer->getSerial(); - translated->baseOffset = streamOffset + firstElementOffset; - - // Instanced vertices do not apply the 'start' offset - translated->usesFirstVertexOffset = (binding.getDivisor() == 0); - - return gl::NoError(); -} - -gl::Error VertexDataManager::storeDynamicAttribs( - const gl::Context *context, - std::vector<TranslatedAttribute> *translatedAttribs, - const gl::AttributesMask &dynamicAttribsMask, - GLint start, - GLsizei count, - GLsizei instances) -{ - // Instantiating this class will ensure the streaming buffer is never left mapped. - class StreamingBufferUnmapper final : NonCopyable - { - public: - StreamingBufferUnmapper(StreamingVertexBufferInterface *streamingBuffer) - : mStreamingBuffer(streamingBuffer) - { - ASSERT(mStreamingBuffer); - } - ~StreamingBufferUnmapper() { mStreamingBuffer->getVertexBuffer()->hintUnmapResource(); } - - private: - StreamingVertexBufferInterface *mStreamingBuffer; - }; - - // Will trigger unmapping on return. - StreamingBufferUnmapper localUnmapper(mStreamingBuffer.get()); - - // Reserve the required space for the dynamic buffers. - for (auto attribIndex : dynamicAttribsMask) - { - const auto &dynamicAttrib = (*translatedAttribs)[attribIndex]; - ANGLE_TRY(reserveSpaceForAttrib(dynamicAttrib, start, count, instances)); - } - - // Store dynamic attributes - for (auto attribIndex : dynamicAttribsMask) - { - auto *dynamicAttrib = &(*translatedAttribs)[attribIndex]; - ANGLE_TRY(storeDynamicAttrib(context, dynamicAttrib, start, count, instances)); - } - - return gl::NoError(); -} - -void VertexDataManager::PromoteDynamicAttribs( - const gl::Context *context, - const std::vector<TranslatedAttribute> &translatedAttribs, - const gl::AttributesMask &dynamicAttribsMask, - GLsizei count) -{ - for (auto attribIndex : dynamicAttribsMask) - { - const auto &dynamicAttrib = translatedAttribs[attribIndex]; - ASSERT(dynamicAttrib.attribute && dynamicAttrib.binding); - const auto &binding = *dynamicAttrib.binding; - - gl::Buffer *buffer = binding.getBuffer().get(); - if (buffer) - { - BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer); - size_t typeSize = ComputeVertexAttributeTypeSize(*dynamicAttrib.attribute); - bufferD3D->promoteStaticUsage(context, count * static_cast<int>(typeSize)); - } - } -} - -gl::Error VertexDataManager::reserveSpaceForAttrib(const TranslatedAttribute &translatedAttrib, - GLint start, - GLsizei count, - GLsizei instances) const -{ - ASSERT(translatedAttrib.attribute && translatedAttrib.binding); - const auto &attrib = *translatedAttrib.attribute; - const auto &binding = *translatedAttrib.binding; - - ASSERT(!DirectStoragePossible(attrib, binding)); - - gl::Buffer *buffer = binding.getBuffer().get(); - BufferD3D *bufferD3D = buffer ? GetImplAs<BufferD3D>(buffer) : nullptr; - ASSERT(!bufferD3D || bufferD3D->getStaticVertexBuffer(attrib, binding) == nullptr); - - size_t totalCount = gl::ComputeVertexBindingElementCount( - binding.getDivisor(), static_cast<size_t>(count), static_cast<size_t>(instances)); - // TODO(jiajia.qin@intel.com): force the index buffer to clamp any out of range indices instead - // of invalid operation here. - if (bufferD3D) - { - // Vertices do not apply the 'start' offset when the divisor is non-zero even when doing - // a non-instanced draw call - GLint firstVertexIndex = binding.getDivisor() > 0 ? 0 : start; - int64_t maxVertexCount = - static_cast<int64_t>(firstVertexIndex) + static_cast<int64_t>(totalCount); - int elementsInBuffer = - ElementsInBuffer(attrib, binding, static_cast<unsigned int>(bufferD3D->getSize())); - - if (maxVertexCount > elementsInBuffer) - { - return gl::InvalidOperation() << "Vertex buffer is not big enough for the draw call."; - } - } - return mStreamingBuffer->reserveVertexSpace(attrib, binding, static_cast<GLsizei>(totalCount), - instances); -} - -gl::Error VertexDataManager::storeDynamicAttrib(const gl::Context *context, - TranslatedAttribute *translated, - GLint start, - GLsizei count, - GLsizei instances) -{ - ASSERT(translated->attribute && translated->binding); - const auto &attrib = *translated->attribute; - const auto &binding = *translated->binding; - - gl::Buffer *buffer = binding.getBuffer().get(); - ASSERT(buffer || attrib.pointer); - ASSERT(attrib.enabled); - - BufferD3D *storage = buffer ? GetImplAs<BufferD3D>(buffer) : nullptr; - - // Instanced vertices do not apply the 'start' offset - GLint firstVertexIndex = (binding.getDivisor() > 0 ? 0 : start); - - // Compute source data pointer - const uint8_t *sourceData = nullptr; - - if (buffer) - { - ANGLE_TRY(storage->getData(context, &sourceData)); - sourceData += static_cast<int>(ComputeVertexAttributeOffset(attrib, binding)); - } - else - { - // Attributes using client memory ignore the VERTEX_ATTRIB_BINDING state. - // https://www.opengl.org/registry/specs/ARB/vertex_attrib_binding.txt - sourceData = static_cast<const uint8_t*>(attrib.pointer); - } - - unsigned int streamOffset = 0; - - translated->storage = nullptr; - ANGLE_TRY_RESULT(mFactory->getVertexSpaceRequired(attrib, binding, 1, 0), translated->stride); - - size_t totalCount = gl::ComputeVertexBindingElementCount( - binding.getDivisor(), static_cast<size_t>(count), static_cast<size_t>(instances)); - - ANGLE_TRY(mStreamingBuffer->storeDynamicAttribute( - attrib, binding, translated->currentValueType, firstVertexIndex, - static_cast<GLsizei>(totalCount), instances, &streamOffset, sourceData)); - - VertexBuffer *vertexBuffer = mStreamingBuffer->getVertexBuffer(); - - translated->vertexBuffer.set(vertexBuffer); - translated->serial = vertexBuffer->getSerial(); - translated->baseOffset = streamOffset; - translated->usesFirstVertexOffset = false; - - return gl::NoError(); -} - -gl::Error VertexDataManager::storeCurrentValue(const gl::VertexAttribCurrentValueData ¤tValue, - TranslatedAttribute *translated, - size_t attribIndex) -{ - CurrentValueState *cachedState = &mCurrentValueCache[attribIndex]; - auto &buffer = cachedState->buffer; - - if (!buffer) - { - buffer.reset(new StreamingVertexBufferInterface(mFactory, CONSTANT_VERTEX_BUFFER_SIZE)); - } - - if (cachedState->data != currentValue) - { - ASSERT(translated->attribute && translated->binding); - const auto &attrib = *translated->attribute; - const auto &binding = *translated->binding; - - ANGLE_TRY(buffer->reserveVertexSpace(attrib, binding, 1, 0)); - - const uint8_t *sourceData = reinterpret_cast<const uint8_t*>(currentValue.FloatValues); - unsigned int streamOffset; - ANGLE_TRY(buffer->storeDynamicAttribute(attrib, binding, currentValue.Type, 0, 1, 0, - &streamOffset, sourceData)); - - buffer->getVertexBuffer()->hintUnmapResource(); - - cachedState->data = currentValue; - cachedState->offset = streamOffset; - } - - translated->vertexBuffer.set(buffer->getVertexBuffer()); - - translated->storage = nullptr; - translated->serial = buffer->getSerial(); - translated->divisor = 0; - translated->stride = 0; - translated->baseOffset = static_cast<unsigned int>(cachedState->offset); - translated->usesFirstVertexOffset = false; - - return gl::NoError(); -} - -// VertexBufferBinding implementation -VertexBufferBinding::VertexBufferBinding() : mBoundVertexBuffer(nullptr) -{ -} - -VertexBufferBinding::VertexBufferBinding(const VertexBufferBinding &other) - : mBoundVertexBuffer(other.mBoundVertexBuffer) -{ - if (mBoundVertexBuffer) - { - mBoundVertexBuffer->addRef(); - } -} - -VertexBufferBinding::~VertexBufferBinding() -{ - if (mBoundVertexBuffer) - { - mBoundVertexBuffer->release(); - } -} - -VertexBufferBinding &VertexBufferBinding::operator=(const VertexBufferBinding &other) -{ - mBoundVertexBuffer = other.mBoundVertexBuffer; - if (mBoundVertexBuffer) - { - mBoundVertexBuffer->addRef(); - } - return *this; -} - -void VertexBufferBinding::set(VertexBuffer *vertexBuffer) -{ - if (mBoundVertexBuffer == vertexBuffer) - return; - - if (mBoundVertexBuffer) - { - mBoundVertexBuffer->release(); - } - if (vertexBuffer) - { - vertexBuffer->addRef(); - } - - mBoundVertexBuffer = vertexBuffer; -} - -VertexBuffer *VertexBufferBinding::get() const -{ - return mBoundVertexBuffer; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.h deleted file mode 100644 index 694366deb7..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.h +++ /dev/null @@ -1,152 +0,0 @@ -// -// Copyright (c) 2002-2012 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. -// - -// VertexDataManager.h: Defines the VertexDataManager, a class that -// runs the Buffer translation process. - -#ifndef LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_ -#define LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_ - -#include "common/angleutils.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/Constants.h" -#include "libANGLE/VertexAttribute.h" - -namespace gl -{ -class State; -struct VertexAttribute; -class VertexBinding; -struct VertexAttribCurrentValueData; -} - -namespace rx -{ -class BufferD3D; -class BufferFactoryD3D; -class StreamingVertexBufferInterface; -class VertexBuffer; - -class VertexBufferBinding final -{ - public: - VertexBufferBinding(); - VertexBufferBinding(const VertexBufferBinding &other); - ~VertexBufferBinding(); - - void set(VertexBuffer *vertexBuffer); - VertexBuffer *get() const; - VertexBufferBinding &operator=(const VertexBufferBinding &other); - - private: - VertexBuffer *mBoundVertexBuffer; -}; - -struct TranslatedAttribute -{ - TranslatedAttribute(); - TranslatedAttribute(const TranslatedAttribute &other); - - // Computes the correct offset from baseOffset, usesFirstVertexOffset, stride and startVertex. - // Can throw an error on integer overflow. - gl::ErrorOrResult<unsigned int> computeOffset(GLint startVertex) const; - - bool active; - - const gl::VertexAttribute *attribute; - const gl::VertexBinding *binding; - GLenum currentValueType; - unsigned int baseOffset; - bool usesFirstVertexOffset; - unsigned int stride; // 0 means not to advance the read pointer at all - - VertexBufferBinding vertexBuffer; - BufferD3D *storage; - unsigned int serial; - unsigned int divisor; -}; - -enum class VertexStorageType -{ - UNKNOWN, - STATIC, // Translate the vertex data once and re-use it. - DYNAMIC, // Translate the data every frame into a ring buffer. - DIRECT, // Bind a D3D buffer directly without any translation. - CURRENT_VALUE, // Use a single value for the attribute. -}; - -// Given a vertex attribute, return the type of storage it will use. -VertexStorageType ClassifyAttributeStorage(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding); - -class VertexDataManager : angle::NonCopyable -{ - public: - VertexDataManager(BufferFactoryD3D *factory); - virtual ~VertexDataManager(); - - gl::Error initialize(); - void deinitialize(); - - gl::Error prepareVertexData(const gl::Context *context, - GLint start, - GLsizei count, - std::vector<TranslatedAttribute> *translatedAttribs, - GLsizei instances); - - static void StoreDirectAttrib(TranslatedAttribute *directAttrib); - - static gl::Error StoreStaticAttrib(const gl::Context *context, TranslatedAttribute *translated); - - gl::Error storeDynamicAttribs(const gl::Context *context, - std::vector<TranslatedAttribute> *translatedAttribs, - const gl::AttributesMask &dynamicAttribsMask, - GLint start, - GLsizei count, - GLsizei instances); - - // Promote static usage of dynamic buffers. - static void PromoteDynamicAttribs(const gl::Context *context, - const std::vector<TranslatedAttribute> &translatedAttribs, - const gl::AttributesMask &dynamicAttribsMask, - GLsizei count); - - gl::Error storeCurrentValue(const gl::VertexAttribCurrentValueData ¤tValue, - TranslatedAttribute *translated, - size_t attribIndex); - - private: - struct CurrentValueState - { - CurrentValueState(); - ~CurrentValueState(); - - std::unique_ptr<StreamingVertexBufferInterface> buffer; - gl::VertexAttribCurrentValueData data; - size_t offset; - }; - - gl::Error reserveSpaceForAttrib(const TranslatedAttribute &translatedAttrib, - GLsizei count, - GLint start, - GLsizei instances) const; - - gl::Error storeDynamicAttrib(const gl::Context *context, - TranslatedAttribute *translated, - GLint start, - GLsizei count, - GLsizei instances); - - BufferFactoryD3D *const mFactory; - - std::unique_ptr<StreamingVertexBufferInterface> mStreamingBuffer; - std::vector<CurrentValueState> mCurrentValueCache; - gl::AttributesMask mDynamicAttribsMaskCache; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp deleted file mode 100644 index f032e888f1..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp +++ /dev/null @@ -1,2153 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// Blit11.cpp: Texture copy utility class. - -#include "libANGLE/renderer/d3d/d3d11/Blit11.h" - -#include <float.h> - -#include "common/utilities.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" -#include "third_party/trace_event/trace_event.h" - -namespace rx -{ - -namespace -{ - -// Include inline shaders in the anonymous namespace to make sure no symbols are exported -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrougha2d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2di11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2dui11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2di11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2dui11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2di11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2dui11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2di11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dui11ps.h" - -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_ps.h" - -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum3d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha3d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3di11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3dui11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3di11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3dui11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3di11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3dui11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3di11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3dui11ps.h" - -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepth11_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_vs.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvestencil11_ps.h" - -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h" - -void StretchedBlitNearest_RowByRow(const gl::Box &sourceArea, - const gl::Box &destArea, - const gl::Rectangle &clippedDestArea, - const gl::Extents &sourceSize, - unsigned int sourceRowPitch, - unsigned int destRowPitch, - size_t pixelSize, - const uint8_t *sourceData, - uint8_t *destData) -{ - int srcHeightSubOne = (sourceArea.height - 1); - size_t copySize = pixelSize * destArea.width; - size_t srcOffset = sourceArea.x * pixelSize; - size_t destOffset = destArea.x * pixelSize; - - for (int y = clippedDestArea.y; y < clippedDestArea.y + clippedDestArea.height; y++) - { - float yPerc = static_cast<float>(y - destArea.y) / (destArea.height - 1); - - // Interpolate using the original source rectangle to determine which row to sample from - // while clamping to the edges - unsigned int readRow = static_cast<unsigned int>( - gl::clamp(sourceArea.y + floor(yPerc * srcHeightSubOne + 0.5f), 0, srcHeightSubOne)); - unsigned int writeRow = y; - - const uint8_t *sourceRow = sourceData + readRow * sourceRowPitch + srcOffset; - uint8_t *destRow = destData + writeRow * destRowPitch + destOffset; - memcpy(destRow, sourceRow, copySize); - } -} - -void StretchedBlitNearest_PixelByPixel(const gl::Box &sourceArea, - const gl::Box &destArea, - const gl::Rectangle &clippedDestArea, - const gl::Extents &sourceSize, - unsigned int sourceRowPitch, - unsigned int destRowPitch, - ptrdiff_t readOffset, - ptrdiff_t writeOffset, - size_t copySize, - size_t srcPixelStride, - size_t destPixelStride, - const uint8_t *sourceData, - uint8_t *destData) -{ - auto xMax = clippedDestArea.x + clippedDestArea.width; - auto yMax = clippedDestArea.y + clippedDestArea.height; - - for (int writeRow = clippedDestArea.y; writeRow < yMax; writeRow++) - { - // Interpolate using the original source rectangle to determine which row to sample from - // while clamping to the edges - float yPerc = static_cast<float>(writeRow - destArea.y) / (destArea.height - 1); - float yRounded = floor(yPerc * (sourceArea.height - 1) + 0.5f); - unsigned int readRow = - static_cast<unsigned int>(gl::clamp(sourceArea.y + yRounded, 0, sourceSize.height - 1)); - - for (int writeColumn = clippedDestArea.x; writeColumn < xMax; writeColumn++) - { - // Interpolate the original source rectangle to determine which column to sample - // from while clamping to the edges - float xPerc = static_cast<float>(writeColumn - destArea.x) / (destArea.width - 1); - float xRounded = floor(xPerc * (sourceArea.width - 1) + 0.5f); - unsigned int readColumn = static_cast<unsigned int>( - gl::clamp(sourceArea.x + xRounded, 0, sourceSize.height - 1)); - - const uint8_t *sourcePixel = - sourceData + readRow * sourceRowPitch + readColumn * srcPixelStride + readOffset; - - uint8_t *destPixel = - destData + writeRow * destRowPitch + writeColumn * destPixelStride + writeOffset; - - memcpy(destPixel, sourcePixel, copySize); - } - } -} - -void StretchedBlitNearest(const gl::Box &sourceArea, - const gl::Box &destArea, - const gl::Rectangle &clipRect, - const gl::Extents &sourceSize, - unsigned int sourceRowPitch, - unsigned int destRowPitch, - ptrdiff_t readOffset, - ptrdiff_t writeOffset, - size_t copySize, - size_t srcPixelStride, - size_t destPixelStride, - const uint8_t *sourceData, - uint8_t *destData) -{ - gl::Rectangle clippedDestArea(destArea.x, destArea.y, destArea.width, destArea.height); - gl::ClipRectangle(clippedDestArea, clipRect, &clippedDestArea); - - // Determine if entire rows can be copied at once instead of each individual pixel. There - // must be no out of bounds lookups, whole rows copies, and no scale. - if (sourceArea.width == clippedDestArea.width && sourceArea.x >= 0 && - sourceArea.x + sourceArea.width <= sourceSize.width && copySize == srcPixelStride && - copySize == destPixelStride) - { - StretchedBlitNearest_RowByRow(sourceArea, destArea, clippedDestArea, sourceSize, - sourceRowPitch, destRowPitch, srcPixelStride, sourceData, - destData); - } - else - { - StretchedBlitNearest_PixelByPixel(sourceArea, destArea, clippedDestArea, sourceSize, - sourceRowPitch, destRowPitch, readOffset, writeOffset, - copySize, srcPixelStride, destPixelStride, sourceData, - destData); - } -} - -using DepthStencilLoader = void(const float *, uint8_t *); - -void LoadDepth16(const float *source, uint8_t *dest) -{ - uint32_t convertedDepth = gl::floatToNormalized<16, uint32_t>(source[0]); - memcpy(dest, &convertedDepth, 2u); -} - -void LoadDepth24(const float *source, uint8_t *dest) -{ - uint32_t convertedDepth = gl::floatToNormalized<24, uint32_t>(source[0]); - memcpy(dest, &convertedDepth, 3u); -} - -void LoadStencilHelper(const float *source, uint8_t *dest) -{ - uint32_t convertedStencil = gl::getShiftedData<8, 0>(static_cast<uint32_t>(source[1])); - memcpy(dest, &convertedStencil, 1u); -} - -void LoadStencil8(const float *source, uint8_t *dest) -{ - // STENCIL_INDEX8 is implemented with D24S8, with the depth bits unused. Writes zero for safety. - float zero = 0.0f; - LoadDepth24(&zero, &dest[0]); - LoadStencilHelper(source, &dest[3]); -} - -void LoadDepth24Stencil8(const float *source, uint8_t *dest) -{ - LoadDepth24(source, &dest[0]); - LoadStencilHelper(source, &dest[3]); -} - -void LoadDepth32F(const float *source, uint8_t *dest) -{ - memcpy(dest, source, sizeof(float)); -} - -void LoadDepth32FStencil8(const float *source, uint8_t *dest) -{ - LoadDepth32F(source, &dest[0]); - LoadStencilHelper(source, &dest[4]); -} - -template <DepthStencilLoader loader> -void CopyDepthStencil(const gl::Box &sourceArea, - const gl::Box &destArea, - const gl::Rectangle &clippedDestArea, - const gl::Extents &sourceSize, - unsigned int sourceRowPitch, - unsigned int destRowPitch, - ptrdiff_t readOffset, - ptrdiff_t writeOffset, - size_t copySize, - size_t srcPixelStride, - size_t destPixelStride, - const uint8_t *sourceData, - uint8_t *destData) -{ - // No stretching or subregions are supported, only full blits. - ASSERT(sourceArea == destArea); - ASSERT(sourceSize.width == sourceArea.width && sourceSize.height == sourceArea.height && - sourceSize.depth == 1); - ASSERT(clippedDestArea.width == sourceSize.width && - clippedDestArea.height == sourceSize.height); - ASSERT(readOffset == 0 && writeOffset == 0); - ASSERT(destArea.x == 0 && destArea.y == 0); - - for (int row = 0; row < destArea.height; ++row) - { - for (int column = 0; column < destArea.width; ++column) - { - ptrdiff_t offset = row * sourceRowPitch + column * srcPixelStride; - const float *sourcePixel = reinterpret_cast<const float *>(sourceData + offset); - - uint8_t *destPixel = destData + row * destRowPitch + column * destPixelStride; - - loader(sourcePixel, destPixel); - } - } -} - -void Depth32FStencil8ToDepth32F(const float *source, float *dest) -{ - *dest = *source; -} - -void Depth24Stencil8ToDepth32F(const uint32_t *source, float *dest) -{ - uint32_t normDepth = source[0] & 0x00FFFFFF; - float floatDepth = gl::normalizedToFloat<24>(normDepth); - *dest = floatDepth; -} - -void BlitD24S8ToD32F(const gl::Box &sourceArea, - const gl::Box &destArea, - const gl::Rectangle &clippedDestArea, - const gl::Extents &sourceSize, - unsigned int sourceRowPitch, - unsigned int destRowPitch, - ptrdiff_t readOffset, - ptrdiff_t writeOffset, - size_t copySize, - size_t srcPixelStride, - size_t destPixelStride, - const uint8_t *sourceData, - uint8_t *destData) -{ - // No stretching or subregions are supported, only full blits. - ASSERT(sourceArea == destArea); - ASSERT(sourceSize.width == sourceArea.width && sourceSize.height == sourceArea.height && - sourceSize.depth == 1); - ASSERT(clippedDestArea.width == sourceSize.width && - clippedDestArea.height == sourceSize.height); - ASSERT(readOffset == 0 && writeOffset == 0); - ASSERT(destArea.x == 0 && destArea.y == 0); - - for (int row = 0; row < destArea.height; ++row) - { - for (int column = 0; column < destArea.width; ++column) - { - ptrdiff_t offset = row * sourceRowPitch + column * srcPixelStride; - const uint32_t *sourcePixel = reinterpret_cast<const uint32_t *>(sourceData + offset); - - float *destPixel = - reinterpret_cast<float *>(destData + row * destRowPitch + column * destPixelStride); - - Depth24Stencil8ToDepth32F(sourcePixel, destPixel); - } - } -} - -void BlitD32FS8ToD32F(const gl::Box &sourceArea, - const gl::Box &destArea, - const gl::Rectangle &clippedDestArea, - const gl::Extents &sourceSize, - unsigned int sourceRowPitch, - unsigned int destRowPitch, - ptrdiff_t readOffset, - ptrdiff_t writeOffset, - size_t copySize, - size_t srcPixelStride, - size_t destPixelStride, - const uint8_t *sourceData, - uint8_t *destData) -{ - // No stretching or subregions are supported, only full blits. - ASSERT(sourceArea == destArea); - ASSERT(sourceSize.width == sourceArea.width && sourceSize.height == sourceArea.height && - sourceSize.depth == 1); - ASSERT(clippedDestArea.width == sourceSize.width && - clippedDestArea.height == sourceSize.height); - ASSERT(readOffset == 0 && writeOffset == 0); - ASSERT(destArea.x == 0 && destArea.y == 0); - - for (int row = 0; row < destArea.height; ++row) - { - for (int column = 0; column < destArea.width; ++column) - { - ptrdiff_t offset = row * sourceRowPitch + column * srcPixelStride; - const float *sourcePixel = reinterpret_cast<const float *>(sourceData + offset); - float *destPixel = - reinterpret_cast<float *>(destData + row * destRowPitch + column * destPixelStride); - - Depth32FStencil8ToDepth32F(sourcePixel, destPixel); - } - } -} - -Blit11::BlitConvertFunction *GetCopyDepthStencilFunction(GLenum internalFormat) -{ - switch (internalFormat) - { - case GL_DEPTH_COMPONENT16: - return &CopyDepthStencil<LoadDepth16>; - case GL_DEPTH_COMPONENT24: - return &CopyDepthStencil<LoadDepth24>; - case GL_DEPTH_COMPONENT32F: - return &CopyDepthStencil<LoadDepth32F>; - case GL_STENCIL_INDEX8: - return &CopyDepthStencil<LoadStencil8>; - case GL_DEPTH24_STENCIL8: - return &CopyDepthStencil<LoadDepth24Stencil8>; - case GL_DEPTH32F_STENCIL8: - return &CopyDepthStencil<LoadDepth32FStencil8>; - default: - UNREACHABLE(); - return nullptr; - } -} - -inline void GenerateVertexCoords(const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const gl::Box &destArea, - const gl::Extents &destSize, - float *x1, - float *y1, - float *x2, - float *y2, - float *u1, - float *v1, - float *u2, - float *v2) -{ - *x1 = (destArea.x / float(destSize.width)) * 2.0f - 1.0f; - *y1 = ((destSize.height - destArea.y - destArea.height) / float(destSize.height)) * 2.0f - 1.0f; - *x2 = ((destArea.x + destArea.width) / float(destSize.width)) * 2.0f - 1.0f; - *y2 = ((destSize.height - destArea.y) / float(destSize.height)) * 2.0f - 1.0f; - - *u1 = sourceArea.x / float(sourceSize.width); - *v1 = sourceArea.y / float(sourceSize.height); - *u2 = (sourceArea.x + sourceArea.width) / float(sourceSize.width); - *v2 = (sourceArea.y + sourceArea.height) / float(sourceSize.height); -} - -void Write2DVertices(const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const gl::Box &destArea, - const gl::Extents &destSize, - void *outVertices, - unsigned int *outStride, - unsigned int *outVertexCount, - D3D11_PRIMITIVE_TOPOLOGY *outTopology) -{ - float x1, y1, x2, y2, u1, v1, u2, v2; - GenerateVertexCoords(sourceArea, sourceSize, destArea, destSize, &x1, &y1, &x2, &y2, &u1, &v1, - &u2, &v2); - - d3d11::PositionTexCoordVertex *vertices = - static_cast<d3d11::PositionTexCoordVertex *>(outVertices); - - d3d11::SetPositionTexCoordVertex(&vertices[0], x1, y1, u1, v2); - d3d11::SetPositionTexCoordVertex(&vertices[1], x1, y2, u1, v1); - d3d11::SetPositionTexCoordVertex(&vertices[2], x2, y1, u2, v2); - d3d11::SetPositionTexCoordVertex(&vertices[3], x2, y2, u2, v1); - - *outStride = sizeof(d3d11::PositionTexCoordVertex); - *outVertexCount = 4; - *outTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP; -} - -void Write3DVertices(const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const gl::Box &destArea, - const gl::Extents &destSize, - void *outVertices, - unsigned int *outStride, - unsigned int *outVertexCount, - D3D11_PRIMITIVE_TOPOLOGY *outTopology) -{ - ASSERT(sourceSize.depth > 0 && destSize.depth > 0); - - float x1, y1, x2, y2, u1, v1, u2, v2; - GenerateVertexCoords(sourceArea, sourceSize, destArea, destSize, &x1, &y1, &x2, &y2, &u1, &v1, - &u2, &v2); - - d3d11::PositionLayerTexCoord3DVertex *vertices = - static_cast<d3d11::PositionLayerTexCoord3DVertex *>(outVertices); - - for (int i = 0; i < destSize.depth; i++) - { - float readDepth = (float)i / std::max(destSize.depth - 1, 1); - - d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 0], x1, y1, i, u1, v2, readDepth); - d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 1], x1, y2, i, u1, v1, readDepth); - d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 2], x2, y1, i, u2, v2, readDepth); - - d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 3], x1, y2, i, u1, v1, readDepth); - d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 4], x2, y2, i, u2, v1, readDepth); - d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 5], x2, y1, i, u2, v2, readDepth); - } - - *outStride = sizeof(d3d11::PositionLayerTexCoord3DVertex); - *outVertexCount = destSize.depth * 6; - *outTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; -} - -unsigned int GetSwizzleIndex(GLenum swizzle) -{ - unsigned int colorIndex = 0; - - switch (swizzle) - { - case GL_RED: - colorIndex = 0; - break; - case GL_GREEN: - colorIndex = 1; - break; - case GL_BLUE: - colorIndex = 2; - break; - case GL_ALPHA: - colorIndex = 3; - break; - case GL_ZERO: - colorIndex = 4; - break; - case GL_ONE: - colorIndex = 5; - break; - default: - UNREACHABLE(); - break; - } - - return colorIndex; -} - -D3D11_BLEND_DESC GetAlphaMaskBlendStateDesc() -{ - D3D11_BLEND_DESC desc; - memset(&desc, 0, sizeof(desc)); - desc.RenderTarget[0].BlendEnable = TRUE; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_ZERO; - desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; - desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_RED | - D3D11_COLOR_WRITE_ENABLE_GREEN | - D3D11_COLOR_WRITE_ENABLE_BLUE; - return desc; -} - -D3D11_INPUT_ELEMENT_DESC quad2DLayout[] = { - {"POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, - {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0}, -}; - -D3D11_INPUT_ELEMENT_DESC quad3DLayout[] = { - {"POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, - {"LAYER", 0, DXGI_FORMAT_R32_UINT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0}, - {"TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}, -}; - -DXGI_FORMAT GetStencilSRVFormat(const d3d11::Format &formatSet) -{ - switch (formatSet.texFormat) - { - case DXGI_FORMAT_R32G8X24_TYPELESS: - return DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; - case DXGI_FORMAT_R24G8_TYPELESS: - return DXGI_FORMAT_X24_TYPELESS_G8_UINT; - default: - UNREACHABLE(); - return DXGI_FORMAT_UNKNOWN; - } -} - -} // namespace - -Blit11::Shader::Shader() = default; - -Blit11::Shader::Shader(Shader &&other) = default; - -Blit11::Shader::~Shader() = default; - -Blit11::Shader &Blit11::Shader::operator=(Blit11::Shader &&other) = default; - -Blit11::Blit11(Renderer11 *renderer) - : mRenderer(renderer), - mResourcesInitialized(false), - mVertexBuffer(), - mPointSampler(), - mLinearSampler(), - mScissorEnabledRasterizerState(), - mScissorDisabledRasterizerState(), - mDepthStencilState(), - mQuad2DIL(quad2DLayout, - ArraySize(quad2DLayout), - g_VS_Passthrough2D, - ArraySize(g_VS_Passthrough2D), - "Blit11 2D input layout"), - mQuad2DVS(g_VS_Passthrough2D, ArraySize(g_VS_Passthrough2D), "Blit11 2D vertex shader"), - mDepthPS(g_PS_PassthroughDepth2D, - ArraySize(g_PS_PassthroughDepth2D), - "Blit11 2D depth pixel shader"), - mQuad3DIL(quad3DLayout, - ArraySize(quad3DLayout), - g_VS_Passthrough3D, - ArraySize(g_VS_Passthrough3D), - "Blit11 3D input layout"), - mQuad3DVS(g_VS_Passthrough3D, ArraySize(g_VS_Passthrough3D), "Blit11 3D vertex shader"), - mQuad3DGS(g_GS_Passthrough3D, ArraySize(g_GS_Passthrough3D), "Blit11 3D geometry shader"), - mAlphaMaskBlendState(GetAlphaMaskBlendStateDesc(), "Blit11 Alpha Mask Blend"), - mSwizzleCB(), - mResolveDepthStencilVS(g_VS_ResolveDepthStencil, - ArraySize(g_VS_ResolveDepthStencil), - "Blit11::mResolveDepthStencilVS"), - mResolveDepthPS(g_PS_ResolveDepth, ArraySize(g_PS_ResolveDepth), "Blit11::mResolveDepthPS"), - mResolveDepthStencilPS(g_PS_ResolveDepthStencil, - ArraySize(g_PS_ResolveDepthStencil), - "Blit11::mResolveDepthStencilPS"), - mResolveStencilPS(g_PS_ResolveStencil, - ArraySize(g_PS_ResolveStencil), - "Blit11::mResolveStencilPS"), - mStencilSRV(), - mResolvedDepthStencilRTView() -{ -} - -Blit11::~Blit11() -{ -} - -gl::Error Blit11::initResources() -{ - if (mResourcesInitialized) - { - return gl::NoError(); - } - - TRACE_EVENT0("gpu.angle", "Blit11::initResources"); - - D3D11_BUFFER_DESC vbDesc; - vbDesc.ByteWidth = - static_cast<unsigned int>(std::max(sizeof(d3d11::PositionLayerTexCoord3DVertex), - sizeof(d3d11::PositionTexCoordVertex)) * - 6 * mRenderer->getNativeCaps().max3DTextureSize); - vbDesc.Usage = D3D11_USAGE_DYNAMIC; - vbDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - vbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - vbDesc.MiscFlags = 0; - vbDesc.StructureByteStride = 0; - - ANGLE_TRY(mRenderer->allocateResource(vbDesc, &mVertexBuffer)); - mVertexBuffer.setDebugName("Blit11 vertex buffer"); - - D3D11_SAMPLER_DESC pointSamplerDesc; - pointSamplerDesc.Filter = D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR; - pointSamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - pointSamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - pointSamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - pointSamplerDesc.MipLODBias = 0.0f; - pointSamplerDesc.MaxAnisotropy = 0; - pointSamplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; - pointSamplerDesc.BorderColor[0] = 0.0f; - pointSamplerDesc.BorderColor[1] = 0.0f; - pointSamplerDesc.BorderColor[2] = 0.0f; - pointSamplerDesc.BorderColor[3] = 0.0f; - pointSamplerDesc.MinLOD = 0.0f; - pointSamplerDesc.MaxLOD = FLT_MAX; - - ANGLE_TRY(mRenderer->allocateResource(pointSamplerDesc, &mPointSampler)); - mPointSampler.setDebugName("Blit11 point sampler"); - - D3D11_SAMPLER_DESC linearSamplerDesc; - linearSamplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - linearSamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - linearSamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - linearSamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - linearSamplerDesc.MipLODBias = 0.0f; - linearSamplerDesc.MaxAnisotropy = 0; - linearSamplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; - linearSamplerDesc.BorderColor[0] = 0.0f; - linearSamplerDesc.BorderColor[1] = 0.0f; - linearSamplerDesc.BorderColor[2] = 0.0f; - linearSamplerDesc.BorderColor[3] = 0.0f; - linearSamplerDesc.MinLOD = 0.0f; - linearSamplerDesc.MaxLOD = FLT_MAX; - - ANGLE_TRY(mRenderer->allocateResource(linearSamplerDesc, &mLinearSampler)); - mLinearSampler.setDebugName("Blit11 linear sampler"); - - // Use a rasterizer state that will not cull so that inverted quads will not be culled - D3D11_RASTERIZER_DESC rasterDesc; - rasterDesc.FillMode = D3D11_FILL_SOLID; - rasterDesc.CullMode = D3D11_CULL_NONE; - rasterDesc.FrontCounterClockwise = FALSE; - rasterDesc.DepthBias = 0; - rasterDesc.SlopeScaledDepthBias = 0.0f; - rasterDesc.DepthBiasClamp = 0.0f; - rasterDesc.DepthClipEnable = TRUE; - rasterDesc.MultisampleEnable = FALSE; - rasterDesc.AntialiasedLineEnable = FALSE; - - rasterDesc.ScissorEnable = TRUE; - ANGLE_TRY(mRenderer->allocateResource(rasterDesc, &mScissorEnabledRasterizerState)); - mScissorEnabledRasterizerState.setDebugName("Blit11 scissoring rasterizer state"); - - rasterDesc.ScissorEnable = FALSE; - ANGLE_TRY(mRenderer->allocateResource(rasterDesc, &mScissorDisabledRasterizerState)); - mScissorDisabledRasterizerState.setDebugName("Blit11 no scissoring rasterizer state"); - - D3D11_DEPTH_STENCIL_DESC depthStencilDesc; - depthStencilDesc.DepthEnable = TRUE; - depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - depthStencilDesc.DepthFunc = D3D11_COMPARISON_ALWAYS; - depthStencilDesc.StencilEnable = FALSE; - depthStencilDesc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK; - depthStencilDesc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; - depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - - ANGLE_TRY(mRenderer->allocateResource(depthStencilDesc, &mDepthStencilState)); - mDepthStencilState.setDebugName("Blit11 depth stencil state"); - - D3D11_BUFFER_DESC swizzleBufferDesc; - swizzleBufferDesc.ByteWidth = sizeof(unsigned int) * 4; - swizzleBufferDesc.Usage = D3D11_USAGE_DYNAMIC; - swizzleBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - swizzleBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - swizzleBufferDesc.MiscFlags = 0; - swizzleBufferDesc.StructureByteStride = 0; - - ANGLE_TRY(mRenderer->allocateResource(swizzleBufferDesc, &mSwizzleCB)); - mSwizzleCB.setDebugName("Blit11 swizzle constant buffer"); - - mResourcesInitialized = true; - - return gl::NoError(); -} - -// static -Blit11::BlitShaderType Blit11::GetBlitShaderType(GLenum destinationFormat, - GLenum sourceFormat, - bool isSigned, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - ShaderDimension dimension) -{ - if (dimension == SHADER_3D) - { - ASSERT(!unpackPremultiplyAlpha && !unpackUnmultiplyAlpha); - - if (isSigned) - { - switch (destinationFormat) - { - case GL_RGBA_INTEGER: - return BLITSHADER_3D_RGBAI; - case GL_RGB_INTEGER: - return BLITSHADER_3D_RGBI; - case GL_RG_INTEGER: - return BLITSHADER_3D_RGI; - case GL_RED_INTEGER: - return BLITSHADER_3D_RI; - default: - UNREACHABLE(); - return BLITSHADER_INVALID; - } - } - else - { - switch (destinationFormat) - { - case GL_RGBA: - return BLITSHADER_3D_RGBAF; - case GL_RGBA_INTEGER: - return BLITSHADER_3D_RGBAUI; - case GL_BGRA_EXT: - return BLITSHADER_3D_BGRAF; - case GL_RGB: - return BLITSHADER_3D_RGBF; - case GL_RGB_INTEGER: - return BLITSHADER_3D_RGBUI; - case GL_RG: - return BLITSHADER_3D_RGF; - case GL_RG_INTEGER: - return BLITSHADER_3D_RGUI; - case GL_RED: - return BLITSHADER_3D_RF; - case GL_RED_INTEGER: - return BLITSHADER_3D_RUI; - case GL_ALPHA: - return BLITSHADER_3D_ALPHA; - case GL_LUMINANCE: - return BLITSHADER_3D_LUMA; - case GL_LUMINANCE_ALPHA: - return BLITSHADER_3D_LUMAALPHA; - default: - UNREACHABLE(); - return BLITSHADER_INVALID; - } - } - } - else if (isSigned) - { - ASSERT(!unpackPremultiplyAlpha && !unpackUnmultiplyAlpha); - - switch (destinationFormat) - { - case GL_RGBA_INTEGER: - return BLITSHADER_2D_RGBAI; - case GL_RGB_INTEGER: - return BLITSHADER_2D_RGBI; - case GL_RG_INTEGER: - return BLITSHADER_2D_RGI; - case GL_RED_INTEGER: - return BLITSHADER_2D_RI; - default: - UNREACHABLE(); - return BLITSHADER_INVALID; - } - } - else - { - bool floatToIntBlit = - !gl::IsIntegerFormat(sourceFormat) && gl::IsIntegerFormat(destinationFormat); - if (unpackPremultiplyAlpha != unpackUnmultiplyAlpha || floatToIntBlit) - { - switch (destinationFormat) - { - case GL_RGBA: - case GL_BGRA_EXT: - ASSERT(!floatToIntBlit); - return unpackPremultiplyAlpha ? BLITSHADER_2D_RGBAF_PREMULTIPLY - : BLITSHADER_2D_RGBAF_UNMULTIPLY; - - case GL_RGB: - case GL_RG: - case GL_RED: - ASSERT(!floatToIntBlit); - return unpackPremultiplyAlpha ? BLITSHADER_2D_RGBF_PREMULTIPLY - : BLITSHADER_2D_RGBF_UNMULTIPLY; - - case GL_RGBA_INTEGER: - if (unpackPremultiplyAlpha == unpackUnmultiplyAlpha) - { - return BLITSHADER_2D_RGBAF_TOUI; - } - else - { - return unpackPremultiplyAlpha ? BLITSHADER_2D_RGBAF_TOUI_PREMULTIPLY - : BLITSHADER_2D_RGBAF_TOUI_UNMULTIPLY; - } - - case GL_RGB_INTEGER: - case GL_RG_INTEGER: - case GL_RED_INTEGER: - if (unpackPremultiplyAlpha == unpackUnmultiplyAlpha) - { - return BLITSHADER_2D_RGBF_TOUI; - } - else - { - return unpackPremultiplyAlpha ? BLITSHADER_2D_RGBF_TOUI_PREMULTIPLY - : BLITSHADER_2D_RGBF_TOUI_UNMULTIPLY; - } - case GL_LUMINANCE: - ASSERT(!floatToIntBlit); - return unpackPremultiplyAlpha ? BLITSHADER_2D_LUMAF_PREMULTIPLY - : BLITSHADER_2D_LUMAF_UNMULTIPLY; - case GL_LUMINANCE_ALPHA: - ASSERT(!floatToIntBlit); - return unpackPremultiplyAlpha ? BLITSHADER_2D_LUMAALPHAF_PREMULTIPLY - : BLITSHADER_2D_LUMAALPHAF_UNMULTIPLY; - case GL_ALPHA: - ASSERT(!floatToIntBlit); - return BLITSHADER_2D_ALPHA; - default: - UNREACHABLE(); - return BLITSHADER_INVALID; - } - } - else - { - switch (destinationFormat) - { - case GL_RGBA: - return BLITSHADER_2D_RGBAF; - case GL_RGBA_INTEGER: - return BLITSHADER_2D_RGBAUI; - case GL_BGRA_EXT: - return BLITSHADER_2D_BGRAF; - case GL_RGB: - return BLITSHADER_2D_RGBF; - case GL_RGB_INTEGER: - return BLITSHADER_2D_RGBUI; - case GL_RG: - return BLITSHADER_2D_RGF; - case GL_RG_INTEGER: - return BLITSHADER_2D_RGUI; - case GL_RED: - return BLITSHADER_2D_RF; - case GL_RED_INTEGER: - return BLITSHADER_2D_RUI; - case GL_ALPHA: - return BLITSHADER_2D_ALPHA; - case GL_LUMINANCE: - return BLITSHADER_2D_LUMA; - case GL_LUMINANCE_ALPHA: - return BLITSHADER_2D_LUMAALPHA; - default: - UNREACHABLE(); - return BLITSHADER_INVALID; - } - } - } -} - -// static -Blit11::SwizzleShaderType Blit11::GetSwizzleShaderType(GLenum type, - D3D11_SRV_DIMENSION dimensionality) -{ - switch (dimensionality) - { - case D3D11_SRV_DIMENSION_TEXTURE2D: - switch (type) - { - case GL_FLOAT: - return SWIZZLESHADER_2D_FLOAT; - case GL_UNSIGNED_INT: - return SWIZZLESHADER_2D_UINT; - case GL_INT: - return SWIZZLESHADER_2D_INT; - default: - UNREACHABLE(); - return SWIZZLESHADER_INVALID; - } - case D3D11_SRV_DIMENSION_TEXTURECUBE: - switch (type) - { - case GL_FLOAT: - return SWIZZLESHADER_CUBE_FLOAT; - case GL_UNSIGNED_INT: - return SWIZZLESHADER_CUBE_UINT; - case GL_INT: - return SWIZZLESHADER_CUBE_INT; - default: - UNREACHABLE(); - return SWIZZLESHADER_INVALID; - } - case D3D11_SRV_DIMENSION_TEXTURE3D: - switch (type) - { - case GL_FLOAT: - return SWIZZLESHADER_3D_FLOAT; - case GL_UNSIGNED_INT: - return SWIZZLESHADER_3D_UINT; - case GL_INT: - return SWIZZLESHADER_3D_INT; - default: - UNREACHABLE(); - return SWIZZLESHADER_INVALID; - } - case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: - switch (type) - { - case GL_FLOAT: - return SWIZZLESHADER_ARRAY_FLOAT; - case GL_UNSIGNED_INT: - return SWIZZLESHADER_ARRAY_UINT; - case GL_INT: - return SWIZZLESHADER_ARRAY_INT; - default: - UNREACHABLE(); - return SWIZZLESHADER_INVALID; - } - default: - UNREACHABLE(); - return SWIZZLESHADER_INVALID; - } -} - -gl::Error Blit11::getShaderSupport(const Shader &shader, Blit11::ShaderSupport *supportOut) -{ - if (shader.dimension == SHADER_2D) - { - ANGLE_TRY(mQuad2DIL.resolve(mRenderer)); - ANGLE_TRY(mQuad2DVS.resolve(mRenderer)); - supportOut->inputLayout = &mQuad2DIL.getObj(); - supportOut->vertexShader = &mQuad2DVS.getObj(); - supportOut->geometryShader = nullptr; - supportOut->vertexWriteFunction = Write2DVertices; - } - else - { - ASSERT(shader.dimension == SHADER_3D); - ANGLE_TRY(mQuad3DIL.resolve(mRenderer)); - ANGLE_TRY(mQuad3DVS.resolve(mRenderer)); - ANGLE_TRY(mQuad3DGS.resolve(mRenderer)); - supportOut->inputLayout = &mQuad2DIL.getObj(); - supportOut->vertexShader = &mQuad3DVS.getObj(); - supportOut->geometryShader = &mQuad3DGS.getObj(); - supportOut->vertexWriteFunction = Write3DVertices; - } - - return gl::NoError(); -} - -gl::Error Blit11::swizzleTexture(const gl::Context *context, - const d3d11::SharedSRV &source, - const d3d11::RenderTargetView &dest, - const gl::Extents &size, - const gl::SwizzleState &swizzleTarget) -{ - ANGLE_TRY(initResources()); - - HRESULT result; - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - D3D11_SHADER_RESOURCE_VIEW_DESC sourceSRVDesc; - source.get()->GetDesc(&sourceSRVDesc); - - GLenum componentType = d3d11::GetComponentType(sourceSRVDesc.Format); - if (componentType == GL_NONE) - { - // We're swizzling the depth component of a depth-stencil texture. - switch (sourceSRVDesc.Format) - { - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - componentType = GL_UNSIGNED_NORMALIZED; - break; - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - componentType = GL_FLOAT; - break; - default: - UNREACHABLE(); - break; - } - } - - GLenum shaderType = GL_NONE; - switch (componentType) - { - case GL_UNSIGNED_NORMALIZED: - case GL_SIGNED_NORMALIZED: - case GL_FLOAT: - shaderType = GL_FLOAT; - break; - case GL_INT: - shaderType = GL_INT; - break; - case GL_UNSIGNED_INT: - shaderType = GL_UNSIGNED_INT; - break; - default: - UNREACHABLE(); - break; - } - - const Shader *shader = nullptr; - ANGLE_TRY(getSwizzleShader(shaderType, sourceSRVDesc.ViewDimension, &shader)); - - // Set vertices - D3D11_MAPPED_SUBRESOURCE mappedResource; - result = - deviceContext->Map(mVertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to map internal vertex buffer for swizzle, " - << gl::FmtHR(result); - } - - ShaderSupport support; - ANGLE_TRY(getShaderSupport(*shader, &support)); - - UINT stride = 0; - UINT drawCount = 0; - D3D11_PRIMITIVE_TOPOLOGY topology; - - gl::Box area(0, 0, 0, size.width, size.height, size.depth); - support.vertexWriteFunction(area, size, area, size, mappedResource.pData, &stride, &drawCount, - &topology); - - deviceContext->Unmap(mVertexBuffer.get(), 0); - - // Set constant buffer - result = deviceContext->Map(mSwizzleCB.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to map internal constant buffer for swizzle, " - << gl::FmtHR(result); - } - - unsigned int *swizzleIndices = reinterpret_cast<unsigned int *>(mappedResource.pData); - swizzleIndices[0] = GetSwizzleIndex(swizzleTarget.swizzleRed); - swizzleIndices[1] = GetSwizzleIndex(swizzleTarget.swizzleGreen); - swizzleIndices[2] = GetSwizzleIndex(swizzleTarget.swizzleBlue); - swizzleIndices[3] = GetSwizzleIndex(swizzleTarget.swizzleAlpha); - - deviceContext->Unmap(mSwizzleCB.get(), 0); - - StateManager11 *stateManager = mRenderer->getStateManager(); - - // Apply vertex buffer - stateManager->setSingleVertexBuffer(&mVertexBuffer, stride, 0); - - // Apply constant buffer - stateManager->setPixelConstantBuffer(0, &mSwizzleCB); - - // Apply state - stateManager->setSimpleBlendState(nullptr); - stateManager->setDepthStencilState(nullptr, 0xFFFFFFFF); - stateManager->setRasterizerState(&mScissorDisabledRasterizerState); - - // Apply shaders - stateManager->setInputLayout(support.inputLayout); - stateManager->setPrimitiveTopology(topology); - - stateManager->setDrawShaders(support.vertexShader, support.geometryShader, - &shader->pixelShader); - - // Apply render target - stateManager->setRenderTarget(dest.get(), nullptr); - - // Set the viewport - stateManager->setSimpleViewport(size); - - // Apply textures and sampler - stateManager->setSimplePixelTextureAndSampler(source, mPointSampler); - - // Draw the quad - deviceContext->Draw(drawCount, 0); - - return gl::NoError(); -} - -gl::Error Blit11::copyTexture(const gl::Context *context, - const d3d11::SharedSRV &source, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - GLenum sourceFormat, - const d3d11::RenderTargetView &dest, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor, - GLenum destFormat, - GLenum filter, - bool maskOffAlpha, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) -{ - ANGLE_TRY(initResources()); - - HRESULT result; - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - // Determine if the source format is a signed integer format, the destFormat will already - // be GL_XXXX_INTEGER but it does not tell us if it is signed or unsigned. - D3D11_SHADER_RESOURCE_VIEW_DESC sourceSRVDesc; - source.get()->GetDesc(&sourceSRVDesc); - - GLenum componentType = d3d11::GetComponentType(sourceSRVDesc.Format); - - ASSERT(componentType != GL_NONE); - ASSERT(componentType != GL_SIGNED_NORMALIZED); - bool isSigned = (componentType == GL_INT); - - ShaderDimension dimension = - (sourceSRVDesc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE3D) ? SHADER_3D : SHADER_2D; - - const Shader *shader = nullptr; - ANGLE_TRY(getBlitShader(destFormat, sourceFormat, isSigned, unpackPremultiplyAlpha, - unpackUnmultiplyAlpha, dimension, &shader)); - - ShaderSupport support; - ANGLE_TRY(getShaderSupport(*shader, &support)); - - // Set vertices - D3D11_MAPPED_SUBRESOURCE mappedResource; - result = - deviceContext->Map(mVertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to map internal vertex buffer for texture copy, " - << gl::FmtHR(result); - } - - UINT stride = 0; - UINT drawCount = 0; - D3D11_PRIMITIVE_TOPOLOGY topology; - - support.vertexWriteFunction(sourceArea, sourceSize, destArea, destSize, mappedResource.pData, - &stride, &drawCount, &topology); - - deviceContext->Unmap(mVertexBuffer.get(), 0); - - StateManager11 *stateManager = mRenderer->getStateManager(); - - // Apply vertex buffer - stateManager->setSingleVertexBuffer(&mVertexBuffer, stride, 0); - - // Apply state - if (maskOffAlpha) - { - ANGLE_TRY(mAlphaMaskBlendState.resolve(mRenderer)); - stateManager->setSimpleBlendState(&mAlphaMaskBlendState.getObj()); - } - else - { - stateManager->setSimpleBlendState(nullptr); - } - stateManager->setDepthStencilState(nullptr, 0xFFFFFFFF); - - if (scissor) - { - stateManager->setSimpleScissorRect(*scissor); - stateManager->setRasterizerState(&mScissorEnabledRasterizerState); - } - else - { - stateManager->setRasterizerState(&mScissorDisabledRasterizerState); - } - - // Apply shaders - stateManager->setInputLayout(support.inputLayout); - stateManager->setPrimitiveTopology(topology); - - stateManager->setDrawShaders(support.vertexShader, support.geometryShader, - &shader->pixelShader); - - // Apply render target - stateManager->setRenderTarget(dest.get(), nullptr); - - // Set the viewport - stateManager->setSimpleViewport(destSize); - - // Apply texture and sampler - switch (filter) - { - case GL_NEAREST: - stateManager->setSimplePixelTextureAndSampler(source, mPointSampler); - break; - case GL_LINEAR: - stateManager->setSimplePixelTextureAndSampler(source, mLinearSampler); - break; - - default: - UNREACHABLE(); - return gl::InternalError() << "Internal error, unknown blit filter mode."; - } - - // Draw the quad - deviceContext->Draw(drawCount, 0); - - return gl::NoError(); -} - -gl::Error Blit11::copyStencil(const gl::Context *context, - const TextureHelper11 &source, - unsigned int sourceSubresource, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const TextureHelper11 &dest, - unsigned int destSubresource, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor) -{ - return copyDepthStencilImpl(source, sourceSubresource, sourceArea, sourceSize, dest, - destSubresource, destArea, destSize, scissor, true); -} - -gl::Error Blit11::copyDepth(const gl::Context *context, - const d3d11::SharedSRV &source, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const d3d11::DepthStencilView &dest, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor) -{ - ANGLE_TRY(initResources()); - - HRESULT result; - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - // Set vertices - D3D11_MAPPED_SUBRESOURCE mappedResource; - result = - deviceContext->Map(mVertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to map internal vertex buffer for texture copy, " - << gl::FmtHR(result); - } - - UINT stride = 0; - UINT drawCount = 0; - D3D11_PRIMITIVE_TOPOLOGY topology; - - Write2DVertices(sourceArea, sourceSize, destArea, destSize, mappedResource.pData, &stride, - &drawCount, &topology); - - deviceContext->Unmap(mVertexBuffer.get(), 0); - - StateManager11 *stateManager = mRenderer->getStateManager(); - - // Apply vertex buffer - stateManager->setSingleVertexBuffer(&mVertexBuffer, stride, 0); - - // Apply state - stateManager->setSimpleBlendState(nullptr); - stateManager->setDepthStencilState(&mDepthStencilState, 0xFFFFFFFF); - - if (scissor) - { - stateManager->setSimpleScissorRect(*scissor); - stateManager->setRasterizerState(&mScissorEnabledRasterizerState); - } - else - { - stateManager->setRasterizerState(&mScissorDisabledRasterizerState); - } - - ANGLE_TRY(mQuad2DIL.resolve(mRenderer)); - ANGLE_TRY(mQuad2DVS.resolve(mRenderer)); - ANGLE_TRY(mDepthPS.resolve(mRenderer)); - - // Apply shaders - stateManager->setInputLayout(&mQuad2DIL.getObj()); - stateManager->setPrimitiveTopology(topology); - - stateManager->setDrawShaders(&mQuad2DVS.getObj(), nullptr, &mDepthPS.getObj()); - - // Apply render target - stateManager->setRenderTarget(nullptr, dest.get()); - - // Set the viewport - stateManager->setSimpleViewport(destSize); - - // Apply texture and sampler - stateManager->setSimplePixelTextureAndSampler(source, mPointSampler); - - // Draw the quad - deviceContext->Draw(drawCount, 0); - - return gl::NoError(); -} - -gl::Error Blit11::copyDepthStencil(const TextureHelper11 &source, - unsigned int sourceSubresource, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const TextureHelper11 &dest, - unsigned int destSubresource, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor) -{ - return copyDepthStencilImpl(source, sourceSubresource, sourceArea, sourceSize, dest, - destSubresource, destArea, destSize, scissor, false); -} - -gl::Error Blit11::copyDepthStencilImpl(const TextureHelper11 &source, - unsigned int sourceSubresource, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const TextureHelper11 &dest, - unsigned int destSubresource, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor, - bool stencilOnly) -{ - auto srcDXGIFormat = source.getFormat(); - const auto &srcSizeInfo = d3d11::GetDXGIFormatSizeInfo(srcDXGIFormat); - unsigned int srcPixelSize = srcSizeInfo.pixelBytes; - unsigned int copyOffset = 0; - unsigned int copySize = srcPixelSize; - auto destDXGIFormat = dest.getFormat(); - const auto &destSizeInfo = d3d11::GetDXGIFormatSizeInfo(destDXGIFormat); - unsigned int destPixelSize = destSizeInfo.pixelBytes; - - ASSERT(srcDXGIFormat == destDXGIFormat || destDXGIFormat == DXGI_FORMAT_R32_TYPELESS); - - if (stencilOnly) - { - const auto &srcFormat = source.getFormatSet().format(); - - // Stencil channel should be right after the depth channel. Some views to depth/stencil - // resources have red channel for depth, in which case the depth channel bit width is in - // redBits. - ASSERT((srcFormat.redBits != 0) != (srcFormat.depthBits != 0)); - GLuint depthBits = srcFormat.redBits + srcFormat.depthBits; - // Known formats have either 24 or 32 bits of depth. - ASSERT(depthBits == 24 || depthBits == 32); - copyOffset = depthBits / 8; - - // Stencil is assumed to be 8-bit - currently this is true for all possible formats. - copySize = 1; - } - - if (srcDXGIFormat != destDXGIFormat) - { - if (srcDXGIFormat == DXGI_FORMAT_R24G8_TYPELESS) - { - ASSERT(sourceArea == destArea && sourceSize == destSize && scissor == nullptr); - return copyAndConvert(source, sourceSubresource, sourceArea, sourceSize, dest, - destSubresource, destArea, destSize, scissor, copyOffset, - copyOffset, copySize, srcPixelSize, destPixelSize, - BlitD24S8ToD32F); - } - ASSERT(srcDXGIFormat == DXGI_FORMAT_R32G8X24_TYPELESS); - return copyAndConvert(source, sourceSubresource, sourceArea, sourceSize, dest, - destSubresource, destArea, destSize, scissor, copyOffset, copyOffset, - copySize, srcPixelSize, destPixelSize, BlitD32FS8ToD32F); - } - - return copyAndConvert(source, sourceSubresource, sourceArea, sourceSize, dest, destSubresource, - destArea, destSize, scissor, copyOffset, copyOffset, copySize, - srcPixelSize, destPixelSize, StretchedBlitNearest); -} - -gl::Error Blit11::copyAndConvertImpl(const TextureHelper11 &source, - unsigned int sourceSubresource, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const TextureHelper11 &destStaging, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor, - size_t readOffset, - size_t writeOffset, - size_t copySize, - size_t srcPixelStride, - size_t destPixelStride, - BlitConvertFunction *convertFunction) -{ - ANGLE_TRY(initResources()); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - TextureHelper11 sourceStaging; - ANGLE_TRY_RESULT(mRenderer->createStagingTexture(ResourceType::Texture2D, source.getFormatSet(), - sourceSize, StagingAccess::READ), - sourceStaging); - - deviceContext->CopySubresourceRegion(sourceStaging.get(), 0, 0, 0, 0, source.get(), - sourceSubresource, nullptr); - - D3D11_MAPPED_SUBRESOURCE sourceMapping; - HRESULT result = deviceContext->Map(sourceStaging.get(), 0, D3D11_MAP_READ, 0, &sourceMapping); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to map internal source staging texture for depth stencil blit, " - << gl::FmtHR(result); - } - - D3D11_MAPPED_SUBRESOURCE destMapping; - result = deviceContext->Map(destStaging.get(), 0, D3D11_MAP_WRITE, 0, &destMapping); - if (FAILED(result)) - { - deviceContext->Unmap(sourceStaging.get(), 0); - return gl::OutOfMemory() - << "Failed to map internal destination staging texture for depth stencil blit, " - << gl::FmtHR(result); - } - - // Clip dest area to the destination size - gl::Rectangle clipRect = gl::Rectangle(0, 0, destSize.width, destSize.height); - - // Clip dest area to the scissor - if (scissor) - { - gl::ClipRectangle(clipRect, *scissor, &clipRect); - } - - convertFunction(sourceArea, destArea, clipRect, sourceSize, sourceMapping.RowPitch, - destMapping.RowPitch, readOffset, writeOffset, copySize, srcPixelStride, - destPixelStride, static_cast<const uint8_t *>(sourceMapping.pData), - static_cast<uint8_t *>(destMapping.pData)); - - deviceContext->Unmap(sourceStaging.get(), 0); - deviceContext->Unmap(destStaging.get(), 0); - - return gl::NoError(); -} - -gl::Error Blit11::copyAndConvert(const TextureHelper11 &source, - unsigned int sourceSubresource, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const TextureHelper11 &dest, - unsigned int destSubresource, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor, - size_t readOffset, - size_t writeOffset, - size_t copySize, - size_t srcPixelStride, - size_t destPixelStride, - BlitConvertFunction *convertFunction) -{ - ANGLE_TRY(initResources()); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - // HACK: Create the destination staging buffer as a read/write texture so - // ID3D11DevicContext::UpdateSubresource can be called - // using it's mapped data as a source - TextureHelper11 destStaging; - ANGLE_TRY_RESULT(mRenderer->createStagingTexture(ResourceType::Texture2D, dest.getFormatSet(), - destSize, StagingAccess::READ_WRITE), - destStaging); - - deviceContext->CopySubresourceRegion(destStaging.get(), 0, 0, 0, 0, dest.get(), destSubresource, - nullptr); - - ANGLE_TRY(copyAndConvertImpl(source, sourceSubresource, sourceArea, sourceSize, destStaging, - destArea, destSize, scissor, readOffset, writeOffset, copySize, - srcPixelStride, destPixelStride, convertFunction)); - - // Work around timeouts/TDRs in older NVIDIA drivers. - if (mRenderer->getWorkarounds().depthStencilBlitExtraCopy) - { - D3D11_MAPPED_SUBRESOURCE mapped; - deviceContext->Map(destStaging.get(), 0, D3D11_MAP_READ, 0, &mapped); - deviceContext->UpdateSubresource(dest.get(), destSubresource, nullptr, mapped.pData, - mapped.RowPitch, mapped.DepthPitch); - deviceContext->Unmap(destStaging.get(), 0); - } - else - { - deviceContext->CopySubresourceRegion(dest.get(), destSubresource, 0, 0, 0, - destStaging.get(), 0, nullptr); - } - - return gl::NoError(); -} - -gl::Error Blit11::addBlitShaderToMap(BlitShaderType blitShaderType, - ShaderDimension dimension, - const ShaderData &shaderData, - const char *name) -{ - ASSERT(mBlitShaderMap.find(blitShaderType) == mBlitShaderMap.end()); - - d3d11::PixelShader ps; - ANGLE_TRY(mRenderer->allocateResource(shaderData, &ps)); - ps.setDebugName(name); - - Shader shader; - shader.dimension = dimension; - shader.pixelShader = std::move(ps); - - mBlitShaderMap[blitShaderType] = std::move(shader); - return gl::NoError(); -} - -gl::Error Blit11::addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType, - ShaderDimension dimension, - const ShaderData &shaderData, - const char *name) -{ - ASSERT(mSwizzleShaderMap.find(swizzleShaderType) == mSwizzleShaderMap.end()); - - d3d11::PixelShader ps; - ANGLE_TRY(mRenderer->allocateResource(shaderData, &ps)); - ps.setDebugName(name); - - Shader shader; - shader.dimension = dimension; - shader.pixelShader = std::move(ps); - - mSwizzleShaderMap[swizzleShaderType] = std::move(shader); - return gl::NoError(); -} - -void Blit11::clearShaderMap() -{ - mBlitShaderMap.clear(); - mSwizzleShaderMap.clear(); -} - -gl::Error Blit11::getBlitShader(GLenum destFormat, - GLenum sourceFormat, - bool isSigned, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - ShaderDimension dimension, - const Shader **shader) -{ - BlitShaderType blitShaderType = - GetBlitShaderType(destFormat, sourceFormat, isSigned, unpackPremultiplyAlpha, - unpackUnmultiplyAlpha, dimension); - - if (blitShaderType == BLITSHADER_INVALID) - { - return gl::InternalError() << "Internal blit shader type mismatch"; - } - - auto blitShaderIt = mBlitShaderMap.find(blitShaderType); - if (blitShaderIt != mBlitShaderMap.end()) - { - *shader = &blitShaderIt->second; - return gl::NoError(); - } - - ASSERT(dimension == SHADER_2D || mRenderer->isES3Capable()); - - switch (blitShaderType) - { - case BLITSHADER_2D_RGBAF: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughRGBA2D), - "Blit11 2D RGBA pixel shader")); - break; - case BLITSHADER_2D_BGRAF: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughRGBA2D), - "Blit11 2D BGRA pixel shader")); - break; - case BLITSHADER_2D_RGBF: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughRGB2D), - "Blit11 2D RGB pixel shader")); - break; - case BLITSHADER_2D_RGF: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughRG2D), - "Blit11 2D RG pixel shader")); - break; - case BLITSHADER_2D_RF: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_PassthroughR2D), - "Blit11 2D R pixel shader")); - break; - case BLITSHADER_2D_ALPHA: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_PassthroughA2D), - "Blit11 2D alpha pixel shader")); - break; - case BLITSHADER_2D_LUMA: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughLum2D), - "Blit11 2D lum pixel shader")); - break; - case BLITSHADER_2D_LUMAALPHA: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughLumAlpha2D), - "Blit11 2D luminance alpha pixel shader")); - break; - case BLITSHADER_2D_RGBAUI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughRGBA2DUI), - "Blit11 2D RGBA UI pixel shader")); - break; - case BLITSHADER_2D_RGBAI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughRGBA2DI), - "Blit11 2D RGBA I pixel shader")); - break; - case BLITSHADER_2D_RGBUI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughRGB2DUI), - "Blit11 2D RGB UI pixel shader")); - break; - case BLITSHADER_2D_RGBI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughRGB2DI), - "Blit11 2D RGB I pixel shader")); - break; - case BLITSHADER_2D_RGUI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughRG2DUI), - "Blit11 2D RG UI pixel shader")); - break; - case BLITSHADER_2D_RGI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughRG2DI), - "Blit11 2D RG I pixel shader")); - break; - case BLITSHADER_2D_RUI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughR2DUI), - "Blit11 2D R UI pixel shader")); - break; - case BLITSHADER_2D_RI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_PassthroughR2DI), - "Blit11 2D R I pixel shader")); - break; - case BLITSHADER_3D_RGBAF: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughRGBA3D), - "Blit11 3D RGBA pixel shader")); - break; - case BLITSHADER_3D_RGBAUI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughRGBA3DUI), - "Blit11 3D UI RGBA pixel shader")); - break; - case BLITSHADER_3D_RGBAI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughRGBA3DI), - "Blit11 3D I RGBA pixel shader")); - break; - case BLITSHADER_3D_BGRAF: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughRGBA3D), - "Blit11 3D BGRA pixel shader")); - break; - case BLITSHADER_3D_RGBF: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughRGB3D), - "Blit11 3D RGB pixel shader")); - break; - case BLITSHADER_3D_RGBUI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughRGB3DUI), - "Blit11 3D RGB UI pixel shader")); - break; - case BLITSHADER_3D_RGBI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughRGB3DI), - "Blit11 3D RGB I pixel shader")); - break; - case BLITSHADER_3D_RGF: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughRG3D), - "Blit11 3D RG pixel shader")); - break; - case BLITSHADER_3D_RGUI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughRG3DUI), - "Blit11 3D RG UI pixel shader")); - break; - case BLITSHADER_3D_RGI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughRG3DI), - "Blit11 3D RG I pixel shader")); - break; - case BLITSHADER_3D_RF: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, ShaderData(g_PS_PassthroughR3D), - "Blit11 3D R pixel shader")); - break; - case BLITSHADER_3D_RUI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughR3DUI), - "Blit11 3D R UI pixel shader")); - break; - case BLITSHADER_3D_RI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughR3DI), - "Blit11 3D R I pixel shader")); - break; - case BLITSHADER_3D_ALPHA: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughRGBA3D), - "Blit11 3D alpha pixel shader")); - break; - case BLITSHADER_3D_LUMA: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughLum3D), - "Blit11 3D luminance pixel shader")); - break; - case BLITSHADER_3D_LUMAALPHA: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, - ShaderData(g_PS_PassthroughLumAlpha3D), - "Blit11 3D luminance alpha pixel shader")); - break; - - case BLITSHADER_2D_RGBAF_PREMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_PM_RGBA), - "Blit11 2D RGBA premultiply pixel shader")); - break; - - case BLITSHADER_2D_RGBAF_UNMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_UM_RGBA), - "Blit11 2D RGBA unmultiply pixel shader")); - break; - - case BLITSHADER_2D_RGBF_PREMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_PM_RGB), - "Blit11 2D RGB premultiply pixel shader")); - break; - - case BLITSHADER_2D_RGBF_UNMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_UM_RGB), - "Blit11 2D RGB unmultiply pixel shader")); - break; - - case BLITSHADER_2D_RGBAF_TOUI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_PT_RGBA), - "Blit11 2D RGBA to uint pixel shader")); - break; - - case BLITSHADER_2D_RGBAF_TOUI_PREMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_PM_RGBA), - "Blit11 2D RGBA to uint premultiply pixel shader")); - break; - - case BLITSHADER_2D_RGBAF_TOUI_UNMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_UM_RGBA), - "Blit11 2D RGBA to uint unmultiply pixel shader")); - break; - - case BLITSHADER_2D_RGBF_TOUI: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_PT_RGB), - "Blit11 2D RGB to uint pixel shader")); - break; - - case BLITSHADER_2D_RGBF_TOUI_PREMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_PM_RGB), - "Blit11 2D RGB to uint premultiply pixel shader")); - break; - - case BLITSHADER_2D_RGBF_TOUI_UNMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_UM_RGB), - "Blit11 2D RGB to uint unmultiply pixel shader")); - break; - case BLITSHADER_2D_LUMAF_PREMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_PM_LUMA), - "Blit11 2D LUMA premultiply pixel shader")); - break; - case BLITSHADER_2D_LUMAF_UNMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_UM_LUMA), - "Blit11 2D LUMA unmultiply pixel shader")); - break; - case BLITSHADER_2D_LUMAALPHAF_PREMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_FtoF_PM_LUMAALPHA), - "Blit11 2D LUMAALPHA premultiply pixel shader")); - break; - case BLITSHADER_2D_LUMAALPHAF_UNMULTIPLY: - ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, - ShaderData(g_PS_FtoF_UM_LUMAALPHA), - "Blit11 2D LUMAALPHA unmultiply pixel shader")); - break; - - default: - UNREACHABLE(); - return gl::InternalError() << "Internal error"; - } - - blitShaderIt = mBlitShaderMap.find(blitShaderType); - ASSERT(blitShaderIt != mBlitShaderMap.end()); - *shader = &blitShaderIt->second; - return gl::NoError(); -} - -gl::Error Blit11::getSwizzleShader(GLenum type, - D3D11_SRV_DIMENSION viewDimension, - const Shader **shader) -{ - SwizzleShaderType swizzleShaderType = GetSwizzleShaderType(type, viewDimension); - - if (swizzleShaderType == SWIZZLESHADER_INVALID) - { - return gl::InternalError() << "Swizzle shader type not found"; - } - - auto swizzleShaderIt = mSwizzleShaderMap.find(swizzleShaderType); - if (swizzleShaderIt != mSwizzleShaderMap.end()) - { - *shader = &swizzleShaderIt->second; - return gl::NoError(); - } - - // Swizzling shaders (OpenGL ES 3+) - ASSERT(mRenderer->isES3Capable()); - - switch (swizzleShaderType) - { - case SWIZZLESHADER_2D_FLOAT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_2D, - ShaderData(g_PS_SwizzleF2D), - "Blit11 2D F swizzle pixel shader")); - break; - case SWIZZLESHADER_2D_UINT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_2D, - ShaderData(g_PS_SwizzleUI2D), - "Blit11 2D UI swizzle pixel shader")); - break; - case SWIZZLESHADER_2D_INT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_2D, - ShaderData(g_PS_SwizzleI2D), - "Blit11 2D I swizzle pixel shader")); - break; - case SWIZZLESHADER_CUBE_FLOAT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, - ShaderData(g_PS_SwizzleF2DArray), - "Blit11 2D Cube F swizzle pixel shader")); - break; - case SWIZZLESHADER_CUBE_UINT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, - ShaderData(g_PS_SwizzleUI2DArray), - "Blit11 2D Cube UI swizzle pixel shader")); - break; - case SWIZZLESHADER_CUBE_INT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, - ShaderData(g_PS_SwizzleI2DArray), - "Blit11 2D Cube I swizzle pixel shader")); - break; - case SWIZZLESHADER_3D_FLOAT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, - ShaderData(g_PS_SwizzleF3D), - "Blit11 3D F swizzle pixel shader")); - break; - case SWIZZLESHADER_3D_UINT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, - ShaderData(g_PS_SwizzleUI3D), - "Blit11 3D UI swizzle pixel shader")); - break; - case SWIZZLESHADER_3D_INT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, - ShaderData(g_PS_SwizzleI3D), - "Blit11 3D I swizzle pixel shader")); - break; - case SWIZZLESHADER_ARRAY_FLOAT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, - ShaderData(g_PS_SwizzleF2DArray), - "Blit11 2D Array F swizzle pixel shader")); - break; - case SWIZZLESHADER_ARRAY_UINT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, - ShaderData(g_PS_SwizzleUI2DArray), - "Blit11 2D Array UI swizzle pixel shader")); - break; - case SWIZZLESHADER_ARRAY_INT: - ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, - ShaderData(g_PS_SwizzleI2DArray), - "Blit11 2D Array I swizzle pixel shader")); - break; - default: - UNREACHABLE(); - return gl::InternalError() << "Internal error"; - } - - swizzleShaderIt = mSwizzleShaderMap.find(swizzleShaderType); - ASSERT(swizzleShaderIt != mSwizzleShaderMap.end()); - *shader = &swizzleShaderIt->second; - return gl::NoError(); -} - -gl::ErrorOrResult<TextureHelper11> Blit11::resolveDepth(const gl::Context *context, - RenderTarget11 *depth) -{ - ANGLE_TRY(initResources()); - - // Multisampled depth stencil SRVs are not available in feature level 10.0 - ASSERT(mRenderer->getRenderer11DeviceCaps().featureLevel > D3D_FEATURE_LEVEL_10_0); - - const auto &extents = depth->getExtents(); - auto *deviceContext = mRenderer->getDeviceContext(); - auto *stateManager = mRenderer->getStateManager(); - - ANGLE_TRY(initResolveDepthOnly(depth->getFormatSet(), extents)); - - ANGLE_TRY(mResolveDepthStencilVS.resolve(mRenderer)); - ANGLE_TRY(mResolveDepthPS.resolve(mRenderer)); - - // Apply the necessary state changes to the D3D11 immediate device context. - stateManager->setInputLayout(nullptr); - stateManager->setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - stateManager->setDrawShaders(&mResolveDepthStencilVS.getObj(), nullptr, - &mResolveDepthPS.getObj()); - stateManager->setRasterizerState(nullptr); - stateManager->setDepthStencilState(&mDepthStencilState, 0xFFFFFFFF); - stateManager->setRenderTargets(nullptr, 0, mResolvedDepthDSView.get()); - stateManager->setSimpleBlendState(nullptr); - stateManager->setSimpleViewport(extents); - - // Set the viewport - stateManager->setShaderResourceShared(gl::SAMPLER_PIXEL, 0, &depth->getShaderResourceView()); - - // Trigger the blit on the GPU. - deviceContext->Draw(6, 0); - - return mResolvedDepth; -} - -gl::Error Blit11::initResolveDepthOnly(const d3d11::Format &format, const gl::Extents &extents) -{ - if (mResolvedDepth.valid() && extents == mResolvedDepth.getExtents() && - format.texFormat == mResolvedDepth.getFormat()) - { - return gl::NoError(); - } - - D3D11_TEXTURE2D_DESC textureDesc; - textureDesc.Width = extents.width; - textureDesc.Height = extents.height; - textureDesc.MipLevels = 1; - textureDesc.ArraySize = 1; - textureDesc.Format = format.texFormat; - textureDesc.SampleDesc.Count = 1; - textureDesc.SampleDesc.Quality = 0; - textureDesc.Usage = D3D11_USAGE_DEFAULT; - textureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; - textureDesc.CPUAccessFlags = 0; - textureDesc.MiscFlags = 0; - - ANGLE_TRY(mRenderer->allocateTexture(textureDesc, format, &mResolvedDepth)); - mResolvedDepth.setDebugName("Blit11::mResolvedDepth"); - - D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; - dsvDesc.Flags = 0; - dsvDesc.Format = format.dsvFormat; - dsvDesc.Texture2D.MipSlice = 0; - dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; - - ANGLE_TRY(mRenderer->allocateResource(dsvDesc, mResolvedDepth.get(), &mResolvedDepthDSView)); - mResolvedDepthDSView.setDebugName("Blit11::mResolvedDepthDSView"); - - // Possibly D3D11 bug or undefined behaviour: Clear the DSV so that our first render - // works as expected. Otherwise the results of the first use seem to be incorrect. - ID3D11DeviceContext *context = mRenderer->getDeviceContext(); - context->ClearDepthStencilView(mResolvedDepthDSView.get(), D3D11_CLEAR_DEPTH, 1.0f, 0); - - return gl::NoError(); -} - -gl::Error Blit11::initResolveDepthStencil(const gl::Extents &extents) -{ - // Check if we need to recreate depth stencil view - if (mResolvedDepthStencil.valid() && extents == mResolvedDepthStencil.getExtents()) - { - ASSERT(mResolvedDepthStencil.getFormat() == DXGI_FORMAT_R32G32_FLOAT); - return gl::NoError(); - } - - if (mResolvedDepthStencil.valid()) - { - releaseResolveDepthStencilResources(); - } - - const auto &formatSet = d3d11::Format::Get(GL_RG32F, mRenderer->getRenderer11DeviceCaps()); - - D3D11_TEXTURE2D_DESC textureDesc; - textureDesc.Width = extents.width; - textureDesc.Height = extents.height; - textureDesc.MipLevels = 1; - textureDesc.ArraySize = 1; - textureDesc.Format = formatSet.texFormat; - textureDesc.SampleDesc.Count = 1; - textureDesc.SampleDesc.Quality = 0; - textureDesc.Usage = D3D11_USAGE_DEFAULT; - textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET; - textureDesc.CPUAccessFlags = 0; - textureDesc.MiscFlags = 0; - - ANGLE_TRY(mRenderer->allocateTexture(textureDesc, formatSet, &mResolvedDepthStencil)); - mResolvedDepthStencil.setDebugName("Blit11::mResolvedDepthStencil"); - - ANGLE_TRY(mRenderer->allocateResourceNoDesc(mResolvedDepthStencil.get(), - &mResolvedDepthStencilRTView)); - mResolvedDepthStencilRTView.setDebugName("Blit11::mResolvedDepthStencilRTView"); - - return gl::NoError(); -} - -gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(const gl::Context *context, - RenderTarget11 *depthStencil, - bool alsoDepth) -{ - ANGLE_TRY(initResources()); - - // Multisampled depth stencil SRVs are not available in feature level 10.0 - ASSERT(mRenderer->getRenderer11DeviceCaps().featureLevel > D3D_FEATURE_LEVEL_10_0); - - const auto &extents = depthStencil->getExtents(); - - ANGLE_TRY(initResolveDepthStencil(extents)); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - auto *stateManager = mRenderer->getStateManager(); - ID3D11Resource *stencilResource = depthStencil->getTexture().get(); - - // Check if we need to re-create the stencil SRV. - if (mStencilSRV.valid()) - { - ID3D11Resource *priorResource = nullptr; - mStencilSRV.get()->GetResource(&priorResource); - - if (stencilResource != priorResource) - { - mStencilSRV.reset(); - } - - SafeRelease(priorResource); - } - - if (!mStencilSRV.valid()) - { - D3D11_SHADER_RESOURCE_VIEW_DESC srViewDesc; - srViewDesc.Format = GetStencilSRVFormat(depthStencil->getFormatSet()); - srViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMS; - - ANGLE_TRY(mRenderer->allocateResource(srViewDesc, stencilResource, &mStencilSRV)); - mStencilSRV.setDebugName("Blit11::mStencilSRV"); - } - - // Notify the Renderer that all state should be invalidated. - ANGLE_TRY(mResolveDepthStencilVS.resolve(mRenderer)); - - // Resolving the depth buffer works by sampling the depth in the shader using a SRV, then - // writing to the resolved depth buffer using SV_Depth. We can't use this method for stencil - // because SV_StencilRef isn't supported until HLSL 5.1/D3D11.3. - const d3d11::PixelShader *pixelShader = nullptr; - if (alsoDepth) - { - ANGLE_TRY(mResolveDepthStencilPS.resolve(mRenderer)); - pixelShader = &mResolveDepthStencilPS.getObj(); - } - else - { - ANGLE_TRY(mResolveStencilPS.resolve(mRenderer)); - pixelShader = &mResolveStencilPS.getObj(); - } - - // Apply the necessary state changes to the D3D11 immediate device context. - stateManager->setInputLayout(nullptr); - stateManager->setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - stateManager->setDrawShaders(&mResolveDepthStencilVS.getObj(), nullptr, pixelShader); - stateManager->setRasterizerState(nullptr); - stateManager->setDepthStencilState(nullptr, 0xFFFFFFFF); - stateManager->setRenderTarget(mResolvedDepthStencilRTView.get(), nullptr); - stateManager->setSimpleBlendState(nullptr); - - // Set the viewport - stateManager->setSimpleViewport(extents); - stateManager->setShaderResourceShared(gl::SAMPLER_PIXEL, 0, - &depthStencil->getShaderResourceView()); - stateManager->setShaderResource(gl::SAMPLER_PIXEL, 1, &mStencilSRV); - - // Trigger the blit on the GPU. - deviceContext->Draw(6, 0); - - gl::Box copyBox(0, 0, 0, extents.width, extents.height, 1); - - TextureHelper11 dest; - ANGLE_TRY_RESULT( - mRenderer->createStagingTexture(ResourceType::Texture2D, depthStencil->getFormatSet(), - extents, StagingAccess::READ_WRITE), - dest); - - const auto ©Function = GetCopyDepthStencilFunction(depthStencil->getInternalFormat()); - const auto &dsFormatSet = depthStencil->getFormatSet(); - const auto &dsDxgiInfo = d3d11::GetDXGIFormatSizeInfo(dsFormatSet.texFormat); - - ANGLE_TRY(copyAndConvertImpl(mResolvedDepthStencil, 0, copyBox, extents, dest, copyBox, extents, - nullptr, 0, 0, 0, 8u, dsDxgiInfo.pixelBytes, copyFunction)); - - // Return the resolved depth texture, which the caller must Release. - return dest; -} - -void Blit11::releaseResolveDepthStencilResources() -{ - mStencilSRV.reset(); - mResolvedDepthStencilRTView.reset(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h deleted file mode 100644 index 14078f9db8..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h +++ /dev/null @@ -1,332 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// Blit11.cpp: Texture copy utility class. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_BLIT11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_BLIT11_H_ - -#include "common/angleutils.h" -#include "libANGLE/Error.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -#include <map> - -namespace rx -{ -class Renderer11; - -class Blit11 : angle::NonCopyable -{ - public: - explicit Blit11(Renderer11 *renderer); - ~Blit11(); - - gl::Error swizzleTexture(const gl::Context *context, - const d3d11::SharedSRV &source, - const d3d11::RenderTargetView &dest, - const gl::Extents &size, - const gl::SwizzleState &swizzleTarget); - - gl::Error copyTexture(const gl::Context *context, - const d3d11::SharedSRV &source, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - GLenum sourceFormat, - const d3d11::RenderTargetView &dest, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor, - GLenum destFormat, - GLenum filter, - bool maskOffAlpha, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha); - - gl::Error copyStencil(const gl::Context *context, - const TextureHelper11 &source, - unsigned int sourceSubresource, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const TextureHelper11 &dest, - unsigned int destSubresource, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor); - - gl::Error copyDepth(const gl::Context *context, - const d3d11::SharedSRV &source, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const d3d11::DepthStencilView &dest, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor); - - gl::Error copyDepthStencil(const TextureHelper11 &source, - unsigned int sourceSubresource, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const TextureHelper11 &dest, - unsigned int destSubresource, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor); - - gl::ErrorOrResult<TextureHelper11> resolveDepth(const gl::Context *context, - RenderTarget11 *depth); - - gl::ErrorOrResult<TextureHelper11> resolveStencil(const gl::Context *context, - RenderTarget11 *depthStencil, - bool alsoDepth); - - using BlitConvertFunction = void(const gl::Box &sourceArea, - const gl::Box &destArea, - const gl::Rectangle &clipRect, - const gl::Extents &sourceSize, - unsigned int sourceRowPitch, - unsigned int destRowPitch, - ptrdiff_t readOffset, - ptrdiff_t writeOffset, - size_t copySize, - size_t srcPixelStride, - size_t destPixelStride, - const uint8_t *sourceData, - uint8_t *destData); - - private: - enum BlitShaderType - { - BLITSHADER_INVALID, - - // Passthrough shaders - BLITSHADER_2D_RGBAF, - BLITSHADER_2D_BGRAF, - BLITSHADER_2D_RGBF, - BLITSHADER_2D_RGF, - BLITSHADER_2D_RF, - BLITSHADER_2D_ALPHA, - BLITSHADER_2D_LUMA, - BLITSHADER_2D_LUMAALPHA, - BLITSHADER_2D_RGBAUI, - BLITSHADER_2D_RGBAI, - BLITSHADER_2D_RGBUI, - BLITSHADER_2D_RGBI, - BLITSHADER_2D_RGUI, - BLITSHADER_2D_RGI, - BLITSHADER_2D_RUI, - BLITSHADER_2D_RI, - BLITSHADER_3D_RGBAF, - BLITSHADER_3D_RGBAUI, - BLITSHADER_3D_RGBAI, - BLITSHADER_3D_BGRAF, - BLITSHADER_3D_RGBF, - BLITSHADER_3D_RGBUI, - BLITSHADER_3D_RGBI, - BLITSHADER_3D_RGF, - BLITSHADER_3D_RGUI, - BLITSHADER_3D_RGI, - BLITSHADER_3D_RF, - BLITSHADER_3D_RUI, - BLITSHADER_3D_RI, - BLITSHADER_3D_ALPHA, - BLITSHADER_3D_LUMA, - BLITSHADER_3D_LUMAALPHA, - - // Multiply alpha shaders - BLITSHADER_2D_RGBAF_PREMULTIPLY, - BLITSHADER_2D_RGBAF_UNMULTIPLY, - - BLITSHADER_2D_RGBF_PREMULTIPLY, - BLITSHADER_2D_RGBF_UNMULTIPLY, - - BLITSHADER_2D_RGBAF_TOUI, - BLITSHADER_2D_RGBAF_TOUI_PREMULTIPLY, - BLITSHADER_2D_RGBAF_TOUI_UNMULTIPLY, - - BLITSHADER_2D_RGBF_TOUI, - BLITSHADER_2D_RGBF_TOUI_PREMULTIPLY, - BLITSHADER_2D_RGBF_TOUI_UNMULTIPLY, - - BLITSHADER_2D_LUMAF_PREMULTIPLY, - BLITSHADER_2D_LUMAF_UNMULTIPLY, - - BLITSHADER_2D_LUMAALPHAF_PREMULTIPLY, - BLITSHADER_2D_LUMAALPHAF_UNMULTIPLY - }; - - enum SwizzleShaderType - { - SWIZZLESHADER_INVALID, - SWIZZLESHADER_2D_FLOAT, - SWIZZLESHADER_2D_UINT, - SWIZZLESHADER_2D_INT, - SWIZZLESHADER_CUBE_FLOAT, - SWIZZLESHADER_CUBE_UINT, - SWIZZLESHADER_CUBE_INT, - SWIZZLESHADER_3D_FLOAT, - SWIZZLESHADER_3D_UINT, - SWIZZLESHADER_3D_INT, - SWIZZLESHADER_ARRAY_FLOAT, - SWIZZLESHADER_ARRAY_UINT, - SWIZZLESHADER_ARRAY_INT, - }; - - typedef void (*WriteVertexFunction)(const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const gl::Box &destArea, - const gl::Extents &destSize, - void *outVertices, - unsigned int *outStride, - unsigned int *outVertexCount, - D3D11_PRIMITIVE_TOPOLOGY *outTopology); - - enum ShaderDimension - { - SHADER_2D, - SHADER_3D, - }; - - struct Shader - { - Shader(); - Shader(Shader &&other); - ~Shader(); - Shader &operator=(Shader &&other); - - ShaderDimension dimension; - d3d11::PixelShader pixelShader; - }; - - struct ShaderSupport - { - const d3d11::InputLayout *inputLayout; - const d3d11::VertexShader *vertexShader; - const d3d11::GeometryShader *geometryShader; - WriteVertexFunction vertexWriteFunction; - }; - - gl::Error initResources(); - - gl::Error getShaderSupport(const Shader &shader, ShaderSupport *supportOut); - - static BlitShaderType GetBlitShaderType(GLenum destinationFormat, - GLenum sourceFormat, - bool isSigned, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - ShaderDimension dimension); - static SwizzleShaderType GetSwizzleShaderType(GLenum type, D3D11_SRV_DIMENSION dimensionality); - - gl::Error copyDepthStencilImpl(const TextureHelper11 &source, - unsigned int sourceSubresource, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const TextureHelper11 &dest, - unsigned int destSubresource, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor, - bool stencilOnly); - - gl::Error copyAndConvertImpl(const TextureHelper11 &source, - unsigned int sourceSubresource, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const TextureHelper11 &destStaging, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor, - size_t readOffset, - size_t writeOffset, - size_t copySize, - size_t srcPixelStride, - size_t destPixelStride, - BlitConvertFunction *convertFunction); - - gl::Error copyAndConvert(const TextureHelper11 &source, - unsigned int sourceSubresource, - const gl::Box &sourceArea, - const gl::Extents &sourceSize, - const TextureHelper11 &dest, - unsigned int destSubresource, - const gl::Box &destArea, - const gl::Extents &destSize, - const gl::Rectangle *scissor, - size_t readOffset, - size_t writeOffset, - size_t copySize, - size_t srcPixelStride, - size_t destPixelStride, - BlitConvertFunction *convertFunction); - - gl::Error addBlitShaderToMap(BlitShaderType blitShaderType, - ShaderDimension dimension, - const ShaderData &shaderData, - const char *name); - - gl::Error getBlitShader(GLenum destFormat, - GLenum sourceFormat, - bool isSigned, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - ShaderDimension dimension, - const Shader **shaderOut); - gl::Error getSwizzleShader(GLenum type, - D3D11_SRV_DIMENSION viewDimension, - const Shader **shaderOut); - - gl::Error addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType, - ShaderDimension dimension, - const ShaderData &shaderData, - const char *name); - - void clearShaderMap(); - void releaseResolveDepthStencilResources(); - gl::Error initResolveDepthOnly(const d3d11::Format &format, const gl::Extents &extents); - gl::Error initResolveDepthStencil(const gl::Extents &extents); - - Renderer11 *mRenderer; - - std::map<BlitShaderType, Shader> mBlitShaderMap; - std::map<SwizzleShaderType, Shader> mSwizzleShaderMap; - - bool mResourcesInitialized; - d3d11::Buffer mVertexBuffer; - d3d11::SamplerState mPointSampler; - d3d11::SamplerState mLinearSampler; - d3d11::RasterizerState mScissorEnabledRasterizerState; - d3d11::RasterizerState mScissorDisabledRasterizerState; - d3d11::DepthStencilState mDepthStencilState; - - d3d11::LazyInputLayout mQuad2DIL; - d3d11::LazyShader<ID3D11VertexShader> mQuad2DVS; - d3d11::LazyShader<ID3D11PixelShader> mDepthPS; - - d3d11::LazyInputLayout mQuad3DIL; - d3d11::LazyShader<ID3D11VertexShader> mQuad3DVS; - d3d11::LazyShader<ID3D11GeometryShader> mQuad3DGS; - - d3d11::LazyBlendState mAlphaMaskBlendState; - - d3d11::Buffer mSwizzleCB; - - d3d11::LazyShader<ID3D11VertexShader> mResolveDepthStencilVS; - d3d11::LazyShader<ID3D11PixelShader> mResolveDepthPS; - d3d11::LazyShader<ID3D11PixelShader> mResolveDepthStencilPS; - d3d11::LazyShader<ID3D11PixelShader> mResolveStencilPS; - d3d11::ShaderResourceView mStencilSRV; - TextureHelper11 mResolvedDepthStencil; - d3d11::RenderTargetView mResolvedDepthStencilRTView; - TextureHelper11 mResolvedDepth; - d3d11::DepthStencilView mResolvedDepthDSView; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_BLIT11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp deleted file mode 100644 index 2317c9abdb..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp +++ /dev/null @@ -1,1600 +0,0 @@ -// -// 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. -// - -// Buffer11.cpp Defines the Buffer11 class. - -#include "libANGLE/renderer/d3d/d3d11/Buffer11.h" - -#include <memory> - -#include "common/MemoryBuffer.h" -#include "libANGLE/renderer/d3d/IndexDataManager.h" -#include "libANGLE/renderer/d3d/VertexDataManager.h" -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/renderer_utils.h" - -namespace rx -{ - -namespace -{ - -template <typename T> -GLuint ReadIndexValueFromIndices(const uint8_t *data, size_t index) -{ - return reinterpret_cast<const T *>(data)[index]; -} -typedef GLuint (*ReadIndexValueFunction)(const uint8_t *data, size_t index); - -enum class CopyResult -{ - RECREATED, - NOT_RECREATED, -}; - -void CalculateConstantBufferParams(GLintptr offset, - GLsizeiptr size, - UINT *outFirstConstant, - UINT *outNumConstants) -{ - // The offset must be aligned to 256 bytes (should have been enforced by glBindBufferRange). - ASSERT(offset % 256 == 0); - - // firstConstant and numConstants are expressed in constants of 16-bytes. Furthermore they must - // be a multiple of 16 constants. - *outFirstConstant = static_cast<UINT>(offset / 16); - - // The GL size is not required to be aligned to a 256 bytes boundary. - // Round the size up to a 256 bytes boundary then express the results in constants of 16-bytes. - *outNumConstants = static_cast<UINT>(rx::roundUp(size, static_cast<GLsizeiptr>(256)) / 16); - - // Since the size is rounded up, firstConstant + numConstants may be bigger than the actual size - // of the buffer. This behaviour is explictly allowed according to the documentation on - // ID3D11DeviceContext1::PSSetConstantBuffers1 - // https://msdn.microsoft.com/en-us/library/windows/desktop/hh404649%28v=vs.85%29.aspx -} - -} // anonymous namespace - -namespace gl_d3d11 -{ - -D3D11_MAP GetD3DMapTypeFromBits(BufferUsage usage, GLbitfield access) -{ - bool readBit = ((access & GL_MAP_READ_BIT) != 0); - bool writeBit = ((access & GL_MAP_WRITE_BIT) != 0); - - ASSERT(readBit || writeBit); - - // Note : we ignore the discard bit, because in D3D11, staging buffers - // don't accept the map-discard flag (discard only works for DYNAMIC usage) - - if (readBit && !writeBit) - { - return D3D11_MAP_READ; - } - else if (writeBit && !readBit) - { - // Special case for uniform storage - we only allow full buffer updates. - return usage == BUFFER_USAGE_UNIFORM ? D3D11_MAP_WRITE_DISCARD : D3D11_MAP_WRITE; - } - else if (writeBit && readBit) - { - return D3D11_MAP_READ_WRITE; - } - else - { - UNREACHABLE(); - return D3D11_MAP_READ; - } -} -} // namespace gl_d3d11 - -// Each instance of Buffer11::BufferStorage is specialized for a class of D3D binding points -// - vertex/transform feedback buffers -// - index buffers -// - pixel unpack buffers -// - uniform buffers -class Buffer11::BufferStorage : angle::NonCopyable -{ - public: - virtual ~BufferStorage() {} - - DataRevision getDataRevision() const { return mRevision; } - BufferUsage getUsage() const { return mUsage; } - size_t getSize() const { return mBufferSize; } - void setDataRevision(DataRevision rev) { mRevision = rev; } - - virtual bool isCPUAccessible(GLbitfield access) const = 0; - - virtual bool isGPUAccessible() const = 0; - - virtual gl::ErrorOrResult<CopyResult> copyFromStorage(const gl::Context *context, - BufferStorage *source, - size_t sourceOffset, - size_t size, - size_t destOffset) = 0; - virtual gl::Error resize(const gl::Context *context, size_t size, bool preserveData) = 0; - - virtual gl::Error map(size_t offset, - size_t length, - GLbitfield access, - uint8_t **mapPointerOut) = 0; - virtual void unmap() = 0; - - gl::Error setData(const uint8_t *data, size_t offset, size_t size); - - protected: - BufferStorage(Renderer11 *renderer, BufferUsage usage); - - Renderer11 *mRenderer; - DataRevision mRevision; - const BufferUsage mUsage; - size_t mBufferSize; -}; - -// A native buffer storage represents an underlying D3D11 buffer for a particular -// type of storage. -class Buffer11::NativeStorage : public Buffer11::BufferStorage -{ - public: - NativeStorage(Renderer11 *renderer, - BufferUsage usage, - const OnBufferDataDirtyChannel *onStorageChanged); - ~NativeStorage() override; - - bool isCPUAccessible(GLbitfield access) const override; - - bool isGPUAccessible() const override { return true; } - - const d3d11::Buffer &getBuffer() const { return mBuffer; } - gl::ErrorOrResult<CopyResult> copyFromStorage(const gl::Context *context, - BufferStorage *source, - size_t sourceOffset, - size_t size, - size_t destOffset) override; - gl::Error resize(const gl::Context *context, size_t size, bool preserveData) override; - - gl::Error map(size_t offset, - size_t length, - GLbitfield access, - uint8_t **mapPointerOut) override; - void unmap() override; - - gl::ErrorOrResult<const d3d11::ShaderResourceView *> getSRVForFormat(DXGI_FORMAT srvFormat); - - private: - static void FillBufferDesc(D3D11_BUFFER_DESC *bufferDesc, - Renderer11 *renderer, - BufferUsage usage, - unsigned int bufferSize); - void clearSRVs(); - - d3d11::Buffer mBuffer; - const OnBufferDataDirtyChannel *mOnStorageChanged; - std::map<DXGI_FORMAT, d3d11::ShaderResourceView> mBufferResourceViews; -}; - -// A emulated indexed buffer storage represents an underlying D3D11 buffer for data -// that has been expanded to match the indices list used. This storage is only -// used for FL9_3 pointsprite rendering emulation. -class Buffer11::EmulatedIndexedStorage : public Buffer11::BufferStorage -{ - public: - EmulatedIndexedStorage(Renderer11 *renderer); - ~EmulatedIndexedStorage() override; - - bool isCPUAccessible(GLbitfield access) const override { return true; } - - bool isGPUAccessible() const override { return false; } - - gl::ErrorOrResult<const d3d11::Buffer *> getBuffer(SourceIndexData *indexInfo, - const TranslatedAttribute &attribute, - GLint startVertex); - - gl::ErrorOrResult<CopyResult> copyFromStorage(const gl::Context *context, - BufferStorage *source, - size_t sourceOffset, - size_t size, - size_t destOffset) override; - - gl::Error resize(const gl::Context *context, size_t size, bool preserveData) override; - - gl::Error map(size_t offset, - size_t length, - GLbitfield access, - uint8_t **mapPointerOut) override; - void unmap() override; - - private: - d3d11::Buffer mBuffer; // contains expanded data for use by D3D - angle::MemoryBuffer mMemoryBuffer; // original data (not expanded) - angle::MemoryBuffer mIndicesMemoryBuffer; // indices data -}; - -// Pack storage represents internal storage for pack buffers. We implement pack buffers -// as CPU memory, tied to a staging texture, for asynchronous texture readback. -class Buffer11::PackStorage : public Buffer11::BufferStorage -{ - public: - explicit PackStorage(Renderer11 *renderer); - ~PackStorage() override; - - bool isCPUAccessible(GLbitfield access) const override { return true; } - - bool isGPUAccessible() const override { return false; } - - gl::ErrorOrResult<CopyResult> copyFromStorage(const gl::Context *context, - BufferStorage *source, - size_t sourceOffset, - size_t size, - size_t destOffset) override; - gl::Error resize(const gl::Context *context, size_t size, bool preserveData) override; - - gl::Error map(size_t offset, - size_t length, - GLbitfield access, - uint8_t **mapPointerOut) override; - void unmap() override; - - gl::Error packPixels(const gl::Context *context, - const gl::FramebufferAttachment &readAttachment, - const PackPixelsParams ¶ms); - - private: - gl::Error flushQueuedPackCommand(); - - TextureHelper11 mStagingTexture; - angle::MemoryBuffer mMemoryBuffer; - std::unique_ptr<PackPixelsParams> mQueuedPackCommand; - PackPixelsParams mPackParams; - bool mDataModified; -}; - -// System memory storage stores a CPU memory buffer with our buffer data. -// For dynamic data, it's much faster to update the CPU memory buffer than -// it is to update a D3D staging buffer and read it back later. -class Buffer11::SystemMemoryStorage : public Buffer11::BufferStorage -{ - public: - explicit SystemMemoryStorage(Renderer11 *renderer); - ~SystemMemoryStorage() override {} - - bool isCPUAccessible(GLbitfield access) const override { return true; } - - bool isGPUAccessible() const override { return false; } - - gl::ErrorOrResult<CopyResult> copyFromStorage(const gl::Context *context, - BufferStorage *source, - size_t sourceOffset, - size_t size, - size_t destOffset) override; - gl::Error resize(const gl::Context *context, size_t size, bool preserveData) override; - - gl::Error map(size_t offset, - size_t length, - GLbitfield access, - uint8_t **mapPointerOut) override; - void unmap() override; - - angle::MemoryBuffer *getSystemCopy() { return &mSystemCopy; } - - protected: - angle::MemoryBuffer mSystemCopy; -}; - -Buffer11::Buffer11(const gl::BufferState &state, Renderer11 *renderer) - : BufferD3D(state, renderer), - mRenderer(renderer), - mSize(0), - mMappedStorage(nullptr), - mBufferStorages({}), - mLatestBufferStorage(nullptr), - mDeallocThresholds({}), - mIdleness({}), - mConstantBufferStorageAdditionalSize(0), - mMaxConstantBufferLruCount(0) -{ -} - -Buffer11::~Buffer11() -{ - for (BufferStorage *&storage : mBufferStorages) - { - SafeDelete(storage); - } - - for (auto &p : mConstantBufferRangeStoragesCache) - { - SafeDelete(p.second.storage); - } - - mRenderer->onBufferDelete(this); -} - -gl::Error Buffer11::setData(const gl::Context *context, - gl::BufferBinding target, - const void *data, - size_t size, - gl::BufferUsage usage) -{ - updateD3DBufferUsage(context, usage); - ANGLE_TRY(setSubData(context, target, data, size, 0)); - return gl::NoError(); -} - -gl::Error Buffer11::getData(const gl::Context *context, const uint8_t **outData) -{ - SystemMemoryStorage *systemMemoryStorage = nullptr; - ANGLE_TRY_RESULT(getSystemMemoryStorage(context), systemMemoryStorage); - - ASSERT(systemMemoryStorage->getSize() >= mSize); - - *outData = systemMemoryStorage->getSystemCopy()->data(); - return gl::NoError(); -} - -gl::ErrorOrResult<Buffer11::SystemMemoryStorage *> Buffer11::getSystemMemoryStorage( - const gl::Context *context) -{ - BufferStorage *storage = nullptr; - ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_SYSTEM_MEMORY), storage); - return GetAs<SystemMemoryStorage>(storage); -} - -gl::Error Buffer11::setSubData(const gl::Context *context, - gl::BufferBinding target, - const void *data, - size_t size, - size_t offset) -{ - size_t requiredSize = size + offset; - - if (data && size > 0) - { - // Use system memory storage for dynamic buffers. - // Try using a constant storage for constant buffers - BufferStorage *writeBuffer = nullptr; - if (target == gl::BufferBinding::Uniform) - { - // If we are a very large uniform buffer, keep system memory storage around so that we - // aren't forced to read back from a constant buffer. We also check the workaround for - // Intel - this requires us to use system memory so we don't end up having to copy from - // a constant buffer to a staging buffer. - // TODO(jmadill): Use Context caps. - if (offset == 0 && size >= mSize && - size <= static_cast<UINT>(mRenderer->getNativeCaps().maxUniformBlockSize) && - !mRenderer->getWorkarounds().useSystemMemoryForConstantBuffers) - { - ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_UNIFORM), writeBuffer); - } - else - { - ANGLE_TRY_RESULT(getSystemMemoryStorage(context), writeBuffer); - } - } - else if (supportsDirectBinding()) - { - ANGLE_TRY_RESULT(getStagingStorage(context), writeBuffer); - } - else - { - ANGLE_TRY_RESULT(getSystemMemoryStorage(context), writeBuffer); - } - - ASSERT(writeBuffer); - - // Explicitly resize the staging buffer, preserving data if the new data will not - // completely fill the buffer - if (writeBuffer->getSize() < requiredSize) - { - bool preserveData = (offset > 0); - ANGLE_TRY(writeBuffer->resize(context, requiredSize, preserveData)); - } - - ANGLE_TRY(writeBuffer->setData(static_cast<const uint8_t *>(data), offset, size)); - onStorageUpdate(writeBuffer); - - // Notify any vertex arrays that we have dirty data. - // TODO(jmadill): Use a more fine grained notification for data updates. - mDirectBroadcastChannel.signal(context); - } - - mSize = std::max(mSize, requiredSize); - invalidateStaticData(context); - - return gl::NoError(); -} - -gl::Error Buffer11::copySubData(const gl::Context *context, - BufferImpl *source, - GLintptr sourceOffset, - GLintptr destOffset, - GLsizeiptr size) -{ - Buffer11 *sourceBuffer = GetAs<Buffer11>(source); - ASSERT(sourceBuffer != nullptr); - - BufferStorage *copyDest = nullptr; - ANGLE_TRY_RESULT(getLatestBufferStorage(context), copyDest); - - if (!copyDest) - { - ANGLE_TRY_RESULT(getStagingStorage(context), copyDest); - } - - BufferStorage *copySource = nullptr; - ANGLE_TRY_RESULT(sourceBuffer->getLatestBufferStorage(context), copySource); - - if (!copySource) - { - ANGLE_TRY_RESULT(sourceBuffer->getStagingStorage(context), copySource); - } - - ASSERT(copySource && copyDest); - - // A staging buffer is needed if there is no cpu-cpu or gpu-gpu copy path avaiable. - if (!copyDest->isGPUAccessible() && !copySource->isCPUAccessible(GL_MAP_READ_BIT)) - { - ANGLE_TRY_RESULT(sourceBuffer->getStagingStorage(context), copySource); - } - else if (!copySource->isGPUAccessible() && !copyDest->isCPUAccessible(GL_MAP_WRITE_BIT)) - { - ANGLE_TRY_RESULT(getStagingStorage(context), copyDest); - } - - // D3D11 does not allow overlapped copies until 11.1, and only if the - // device supports D3D11_FEATURE_DATA_D3D11_OPTIONS::CopyWithOverlap - // Get around this via a different source buffer - if (copySource == copyDest) - { - if (copySource->getUsage() == BUFFER_USAGE_STAGING) - { - ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK), - copySource); - } - else - { - ANGLE_TRY_RESULT(getStagingStorage(context), copySource); - } - } - - CopyResult copyResult = CopyResult::NOT_RECREATED; - ANGLE_TRY_RESULT(copyDest->copyFromStorage(context, copySource, sourceOffset, size, destOffset), - copyResult); - onStorageUpdate(copyDest); - - mSize = std::max<size_t>(mSize, destOffset + size); - invalidateStaticData(context); - - // Also notify that direct buffers are dirty. - mDirectBroadcastChannel.signal(context); - - return gl::NoError(); -} - -gl::Error Buffer11::map(const gl::Context *context, GLenum access, void **mapPtr) -{ - // GL_OES_mapbuffer uses an enum instead of a bitfield for it's access, convert to a bitfield - // and call mapRange. - ASSERT(access == GL_WRITE_ONLY_OES); - return mapRange(context, 0, mSize, GL_MAP_WRITE_BIT, mapPtr); -} - -gl::Error Buffer11::mapRange(const gl::Context *context, - size_t offset, - size_t length, - GLbitfield access, - void **mapPtr) -{ - ASSERT(!mMappedStorage); - - BufferStorage *latestStorage = nullptr; - ANGLE_TRY_RESULT(getLatestBufferStorage(context), latestStorage); - - if (latestStorage && (latestStorage->getUsage() == BUFFER_USAGE_PIXEL_PACK || - latestStorage->getUsage() == BUFFER_USAGE_STAGING)) - { - // Latest storage is mappable. - mMappedStorage = latestStorage; - } - else - { - // Fall back to using the staging buffer if the latest storage does not exist or is not - // CPU-accessible. - ANGLE_TRY_RESULT(getStagingStorage(context), mMappedStorage); - } - - if (!mMappedStorage) - { - return gl::OutOfMemory() << "Failed to allocate mappable internal buffer."; - } - - if ((access & GL_MAP_WRITE_BIT) > 0) - { - // Update the data revision immediately, since the data might be changed at any time - onStorageUpdate(mMappedStorage); - invalidateStaticData(context); - } - - uint8_t *mappedBuffer = nullptr; - ANGLE_TRY(mMappedStorage->map(offset, length, access, &mappedBuffer)); - ASSERT(mappedBuffer); - - *mapPtr = static_cast<void *>(mappedBuffer); - return gl::NoError(); -} - -gl::Error Buffer11::unmap(const gl::Context *context, GLboolean *result) -{ - ASSERT(mMappedStorage); - mMappedStorage->unmap(); - mMappedStorage = nullptr; - - // TODO: detect if we had corruption. if so, return false. - *result = GL_TRUE; - - return gl::NoError(); -} - -gl::Error Buffer11::markTransformFeedbackUsage(const gl::Context *context) -{ - BufferStorage *transformFeedbackStorage = nullptr; - ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK), - transformFeedbackStorage); - - if (transformFeedbackStorage) - { - onStorageUpdate(transformFeedbackStorage); - } - - invalidateStaticData(context); - return gl::NoError(); -} - -void Buffer11::updateDeallocThreshold(BufferUsage usage) -{ - // The following strategy was tuned on the Oort online benchmark (http://oortonline.gl/) - // as well as a custom microbenchmark (IndexConversionPerfTest.Run/index_range_d3d11) - - // First readback: 8 unmodified uses before we free buffer memory. - // After that, double the threshold each time until we reach the max. - if (mDeallocThresholds[usage] == 0) - { - mDeallocThresholds[usage] = 8; - } - else if (mDeallocThresholds[usage] < std::numeric_limits<unsigned int>::max() / 2u) - { - mDeallocThresholds[usage] *= 2u; - } - else - { - mDeallocThresholds[usage] = std::numeric_limits<unsigned int>::max(); - } -} - -// Free the storage if we decide it isn't being used very often. -gl::Error Buffer11::checkForDeallocation(const gl::Context *context, BufferUsage usage) -{ - mIdleness[usage]++; - - BufferStorage *&storage = mBufferStorages[usage]; - if (storage != nullptr && mIdleness[usage] > mDeallocThresholds[usage]) - { - BufferStorage *latestStorage = nullptr; - ANGLE_TRY_RESULT(getLatestBufferStorage(context), latestStorage); - if (latestStorage != storage) - { - SafeDelete(storage); - } - } - - return gl::NoError(); -} - -// Keep system memory when we are using it for the canonical version of data. -bool Buffer11::canDeallocateSystemMemory() const -{ - // Must keep system memory on Intel. - if (mRenderer->getWorkarounds().useSystemMemoryForConstantBuffers) - { - return false; - } - - return (!mBufferStorages[BUFFER_USAGE_UNIFORM] || - mSize <= mRenderer->getNativeCaps().maxUniformBlockSize); -} - -void Buffer11::markBufferUsage(BufferUsage usage) -{ - mIdleness[usage] = 0; -} - -gl::Error Buffer11::garbageCollection(const gl::Context *context, BufferUsage currentUsage) -{ - if (currentUsage != BUFFER_USAGE_SYSTEM_MEMORY && canDeallocateSystemMemory()) - { - ANGLE_TRY(checkForDeallocation(context, BUFFER_USAGE_SYSTEM_MEMORY)); - } - - if (currentUsage != BUFFER_USAGE_STAGING) - { - ANGLE_TRY(checkForDeallocation(context, BUFFER_USAGE_STAGING)); - } - - return gl::NoError(); -} - -gl::ErrorOrResult<ID3D11Buffer *> Buffer11::getBuffer(const gl::Context *context, BufferUsage usage) -{ - BufferStorage *storage = nullptr; - ANGLE_TRY_RESULT(getBufferStorage(context, usage), storage); - return GetAs<NativeStorage>(storage)->getBuffer().get(); -} - -gl::ErrorOrResult<ID3D11Buffer *> Buffer11::getEmulatedIndexedBuffer( - const gl::Context *context, - SourceIndexData *indexInfo, - const TranslatedAttribute &attribute, - GLint startVertex) -{ - ASSERT(indexInfo); - - BufferStorage *untypedStorage = nullptr; - ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_EMULATED_INDEXED_VERTEX), - untypedStorage); - - EmulatedIndexedStorage *emulatedStorage = GetAs<EmulatedIndexedStorage>(untypedStorage); - - const d3d11::Buffer *nativeStorage = nullptr; - ANGLE_TRY_RESULT(emulatedStorage->getBuffer(indexInfo, attribute, startVertex), nativeStorage); - - return nativeStorage->get(); -} - -gl::Error Buffer11::getConstantBufferRange(const gl::Context *context, - GLintptr offset, - GLsizeiptr size, - const d3d11::Buffer **bufferOut, - UINT *firstConstantOut, - UINT *numConstantsOut) -{ - BufferStorage *bufferStorage = nullptr; - - if (offset == 0 || mRenderer->getRenderer11DeviceCaps().supportsConstantBufferOffsets) - { - ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_UNIFORM), bufferStorage); - CalculateConstantBufferParams(offset, size, firstConstantOut, numConstantsOut); - } - else - { - ANGLE_TRY_RESULT(getConstantBufferRangeStorage(context, offset, size), bufferStorage); - *firstConstantOut = 0; - *numConstantsOut = 0; - } - - *bufferOut = &GetAs<NativeStorage>(bufferStorage)->getBuffer(); - - return gl::NoError(); -} - -gl::ErrorOrResult<const d3d11::ShaderResourceView *> Buffer11::getSRV(const gl::Context *context, - DXGI_FORMAT srvFormat) -{ - BufferStorage *storage = nullptr; - ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_PIXEL_UNPACK), storage); - NativeStorage *nativeStorage = GetAs<NativeStorage>(storage); - return nativeStorage->getSRVForFormat(srvFormat); -} - -gl::Error Buffer11::packPixels(const gl::Context *context, - const gl::FramebufferAttachment &readAttachment, - const PackPixelsParams ¶ms) -{ - PackStorage *packStorage = nullptr; - ANGLE_TRY_RESULT(getPackStorage(context), packStorage); - - ASSERT(packStorage); - ANGLE_TRY(packStorage->packPixels(context, readAttachment, params)); - onStorageUpdate(packStorage); - - return gl::NoError(); -} - -size_t Buffer11::getTotalCPUBufferMemoryBytes() const -{ - size_t allocationSize = 0; - - BufferStorage *staging = mBufferStorages[BUFFER_USAGE_STAGING]; - allocationSize += staging ? staging->getSize() : 0; - - BufferStorage *sysMem = mBufferStorages[BUFFER_USAGE_SYSTEM_MEMORY]; - allocationSize += sysMem ? sysMem->getSize() : 0; - - return allocationSize; -} - -gl::ErrorOrResult<Buffer11::BufferStorage *> Buffer11::getBufferStorage(const gl::Context *context, - BufferUsage usage) -{ - ASSERT(0 <= usage && usage < BUFFER_USAGE_COUNT); - BufferStorage *&newStorage = mBufferStorages[usage]; - - if (!newStorage) - { - newStorage = allocateStorage(usage); - } - - markBufferUsage(usage); - - // resize buffer - if (newStorage->getSize() < mSize) - { - ANGLE_TRY(newStorage->resize(context, mSize, true)); - } - - ASSERT(newStorage); - - ANGLE_TRY(updateBufferStorage(context, newStorage, 0, mSize)); - ANGLE_TRY(garbageCollection(context, usage)); - - return newStorage; -} - -Buffer11::BufferStorage *Buffer11::allocateStorage(BufferUsage usage) -{ - updateDeallocThreshold(usage); - switch (usage) - { - case BUFFER_USAGE_PIXEL_PACK: - return new PackStorage(mRenderer); - case BUFFER_USAGE_SYSTEM_MEMORY: - return new SystemMemoryStorage(mRenderer); - case BUFFER_USAGE_EMULATED_INDEXED_VERTEX: - return new EmulatedIndexedStorage(mRenderer); - case BUFFER_USAGE_INDEX: - case BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK: - return new NativeStorage(mRenderer, usage, &mDirectBroadcastChannel); - default: - return new NativeStorage(mRenderer, usage, nullptr); - } -} - -gl::ErrorOrResult<Buffer11::BufferStorage *> Buffer11::getConstantBufferRangeStorage( - const gl::Context *context, - GLintptr offset, - GLsizeiptr size) -{ - BufferStorage *newStorage; - - { - // Keep the cacheEntry in a limited scope because it may be invalidated later in the code if - // we need to reclaim some space. - ConstantBufferCacheEntry *cacheEntry = &mConstantBufferRangeStoragesCache[offset]; - - if (!cacheEntry->storage) - { - cacheEntry->storage = allocateStorage(BUFFER_USAGE_UNIFORM); - cacheEntry->lruCount = ++mMaxConstantBufferLruCount; - } - - cacheEntry->lruCount = ++mMaxConstantBufferLruCount; - newStorage = cacheEntry->storage; - } - - markBufferUsage(BUFFER_USAGE_UNIFORM); - - if (newStorage->getSize() < static_cast<size_t>(size)) - { - size_t maximumAllowedAdditionalSize = 2 * getSize(); - - size_t sizeDelta = size - newStorage->getSize(); - - while (mConstantBufferStorageAdditionalSize + sizeDelta > maximumAllowedAdditionalSize) - { - auto iter = std::min_element(std::begin(mConstantBufferRangeStoragesCache), - std::end(mConstantBufferRangeStoragesCache), - [](const ConstantBufferCache::value_type &a, - const ConstantBufferCache::value_type &b) { - return a.second.lruCount < b.second.lruCount; - }); - - ASSERT(iter->second.storage != newStorage); - ASSERT(mConstantBufferStorageAdditionalSize >= iter->second.storage->getSize()); - - mConstantBufferStorageAdditionalSize -= iter->second.storage->getSize(); - SafeDelete(iter->second.storage); - mConstantBufferRangeStoragesCache.erase(iter); - } - - ANGLE_TRY(newStorage->resize(context, size, false)); - mConstantBufferStorageAdditionalSize += sizeDelta; - - // We don't copy the old data when resizing the constant buffer because the data may be - // out-of-date therefore we reset the data revision and let updateBufferStorage() handle the - // copy. - newStorage->setDataRevision(0); - } - - ANGLE_TRY(updateBufferStorage(context, newStorage, offset, size)); - ANGLE_TRY(garbageCollection(context, BUFFER_USAGE_UNIFORM)); - return newStorage; -} - -gl::Error Buffer11::updateBufferStorage(const gl::Context *context, - BufferStorage *storage, - size_t sourceOffset, - size_t storageSize) -{ - BufferStorage *latestBuffer = nullptr; - ANGLE_TRY_RESULT(getLatestBufferStorage(context), latestBuffer); - - ASSERT(storage); - - if (!latestBuffer) - { - onStorageUpdate(storage); - return gl::NoError(); - } - - if (latestBuffer->getDataRevision() <= storage->getDataRevision()) - { - return gl::NoError(); - } - - // Copy through a staging buffer if we're copying from or to a non-staging, mappable - // buffer storage. This is because we can't map a GPU buffer, and copy CPU - // data directly. If we're already using a staging buffer we're fine. - if (latestBuffer->getUsage() != BUFFER_USAGE_STAGING && - storage->getUsage() != BUFFER_USAGE_STAGING && - (!latestBuffer->isCPUAccessible(GL_MAP_READ_BIT) || - !storage->isCPUAccessible(GL_MAP_WRITE_BIT))) - { - NativeStorage *stagingBuffer = nullptr; - ANGLE_TRY_RESULT(getStagingStorage(context), stagingBuffer); - - CopyResult copyResult = CopyResult::NOT_RECREATED; - ANGLE_TRY_RESULT( - stagingBuffer->copyFromStorage(context, latestBuffer, 0, latestBuffer->getSize(), 0), - copyResult); - onCopyStorage(stagingBuffer, latestBuffer); - - latestBuffer = stagingBuffer; - } - - CopyResult copyResult = CopyResult::NOT_RECREATED; - ANGLE_TRY_RESULT(storage->copyFromStorage(context, latestBuffer, sourceOffset, storageSize, 0), - copyResult); - // If the D3D buffer has been recreated, we should update our serial. - if (copyResult == CopyResult::RECREATED) - { - updateSerial(); - } - onCopyStorage(storage, latestBuffer); - return gl::NoError(); -} - -gl::ErrorOrResult<Buffer11::BufferStorage *> Buffer11::getLatestBufferStorage( - const gl::Context *context) const -{ - // resize buffer - if (mLatestBufferStorage && mLatestBufferStorage->getSize() < mSize) - { - ANGLE_TRY(mLatestBufferStorage->resize(context, mSize, true)); - } - - return mLatestBufferStorage; -} - -gl::ErrorOrResult<Buffer11::NativeStorage *> Buffer11::getStagingStorage(const gl::Context *context) -{ - BufferStorage *stagingStorage = nullptr; - ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_STAGING), stagingStorage); - return GetAs<NativeStorage>(stagingStorage); -} - -gl::ErrorOrResult<Buffer11::PackStorage *> Buffer11::getPackStorage(const gl::Context *context) -{ - BufferStorage *packStorage = nullptr; - ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_PIXEL_PACK), packStorage); - return GetAs<PackStorage>(packStorage); -} - -size_t Buffer11::getSize() const -{ - return mSize; -} - -bool Buffer11::supportsDirectBinding() const -{ - // Do not support direct buffers for dynamic data. The streaming buffer - // offers better performance for data which changes every frame. - return (mUsage == D3DBufferUsage::STATIC); -} - -void Buffer11::initializeStaticData(const gl::Context *context) -{ - BufferD3D::initializeStaticData(context); - - // Notify when static data changes. - mStaticBroadcastChannel.signal(context); -} - -void Buffer11::invalidateStaticData(const gl::Context *context) -{ - BufferD3D::invalidateStaticData(context); - - // Notify when static data changes. - mStaticBroadcastChannel.signal(context); -} - -OnBufferDataDirtyChannel *Buffer11::getStaticBroadcastChannel() -{ - return &mStaticBroadcastChannel; -} - -OnBufferDataDirtyChannel *Buffer11::getDirectBroadcastChannel() -{ - return &mDirectBroadcastChannel; -} - -void Buffer11::onCopyStorage(BufferStorage *dest, BufferStorage *source) -{ - ASSERT(source && mLatestBufferStorage); - dest->setDataRevision(source->getDataRevision()); - - // Only update the latest buffer storage if our usage index is lower. See comment in header. - if (dest->getUsage() < mLatestBufferStorage->getUsage()) - { - mLatestBufferStorage = dest; - } -} - -void Buffer11::onStorageUpdate(BufferStorage *updatedStorage) -{ - updatedStorage->setDataRevision(updatedStorage->getDataRevision() + 1); - mLatestBufferStorage = updatedStorage; -} - -// Buffer11::BufferStorage implementation - -Buffer11::BufferStorage::BufferStorage(Renderer11 *renderer, BufferUsage usage) - : mRenderer(renderer), mRevision(0), mUsage(usage), mBufferSize(0) -{ -} - -gl::Error Buffer11::BufferStorage::setData(const uint8_t *data, size_t offset, size_t size) -{ - ASSERT(isCPUAccessible(GL_MAP_WRITE_BIT)); - - // Uniform storage can have a different internal size than the buffer size. Ensure we don't - // overflow. - size_t mapSize = std::min(size, mBufferSize - offset); - - uint8_t *writePointer = nullptr; - ANGLE_TRY(map(offset, mapSize, GL_MAP_WRITE_BIT, &writePointer)); - - memcpy(writePointer, data, mapSize); - - unmap(); - - return gl::NoError(); -} - -// Buffer11::NativeStorage implementation - -Buffer11::NativeStorage::NativeStorage(Renderer11 *renderer, - BufferUsage usage, - const OnBufferDataDirtyChannel *onStorageChanged) - : BufferStorage(renderer, usage), mBuffer(), mOnStorageChanged(onStorageChanged) -{ -} - -Buffer11::NativeStorage::~NativeStorage() -{ - clearSRVs(); -} - -bool Buffer11::NativeStorage::isCPUAccessible(GLbitfield access) const -{ - if ((access & GL_MAP_READ_BIT) != 0) - { - // Read is more exclusive than write mappability. - return (mUsage == BUFFER_USAGE_STAGING); - } - ASSERT((access & GL_MAP_WRITE_BIT) != 0); - return (mUsage == BUFFER_USAGE_STAGING || mUsage == BUFFER_USAGE_UNIFORM); -} - -// Returns true if it recreates the direct buffer -gl::ErrorOrResult<CopyResult> Buffer11::NativeStorage::copyFromStorage(const gl::Context *context, - BufferStorage *source, - size_t sourceOffset, - size_t size, - size_t destOffset) -{ - size_t requiredSize = destOffset + size; - bool createBuffer = !mBuffer.valid() || mBufferSize < requiredSize; - - // (Re)initialize D3D buffer if needed - bool preserveData = (destOffset > 0); - if (createBuffer) - { - ANGLE_TRY(resize(context, requiredSize, preserveData)); - } - - size_t clampedSize = size; - if (mUsage == BUFFER_USAGE_UNIFORM) - { - clampedSize = std::min(clampedSize, mBufferSize - destOffset); - } - - if (source->getUsage() == BUFFER_USAGE_PIXEL_PACK || - source->getUsage() == BUFFER_USAGE_SYSTEM_MEMORY) - { - ASSERT(source->isCPUAccessible(GL_MAP_READ_BIT) && isCPUAccessible(GL_MAP_WRITE_BIT)); - - // Uniform buffers must be mapped with write/discard. - ASSERT(!(preserveData && mUsage == BUFFER_USAGE_UNIFORM)); - - uint8_t *sourcePointer = nullptr; - ANGLE_TRY(source->map(sourceOffset, clampedSize, GL_MAP_READ_BIT, &sourcePointer)); - - auto err = setData(sourcePointer, destOffset, clampedSize); - source->unmap(); - ANGLE_TRY(err); - } - else - { - D3D11_BOX srcBox; - srcBox.left = static_cast<unsigned int>(sourceOffset); - srcBox.right = static_cast<unsigned int>(sourceOffset + clampedSize); - srcBox.top = 0; - srcBox.bottom = 1; - srcBox.front = 0; - srcBox.back = 1; - - const d3d11::Buffer *sourceBuffer = &GetAs<NativeStorage>(source)->getBuffer(); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - deviceContext->CopySubresourceRegion(mBuffer.get(), 0, - static_cast<unsigned int>(destOffset), 0, 0, - sourceBuffer->get(), 0, &srcBox); - } - - return createBuffer ? CopyResult::RECREATED : CopyResult::NOT_RECREATED; -} - -gl::Error Buffer11::NativeStorage::resize(const gl::Context *context, - size_t size, - bool preserveData) -{ - D3D11_BUFFER_DESC bufferDesc; - FillBufferDesc(&bufferDesc, mRenderer, mUsage, static_cast<unsigned int>(size)); - - d3d11::Buffer newBuffer; - ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &newBuffer)); - newBuffer.setDebugName("Buffer11::NativeStorage"); - - if (mBuffer.valid() && preserveData) - { - // We don't call resize if the buffer is big enough already. - ASSERT(mBufferSize <= size); - - D3D11_BOX srcBox; - srcBox.left = 0; - srcBox.right = static_cast<unsigned int>(mBufferSize); - srcBox.top = 0; - srcBox.bottom = 1; - srcBox.front = 0; - srcBox.back = 1; - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - deviceContext->CopySubresourceRegion(newBuffer.get(), 0, 0, 0, 0, mBuffer.get(), 0, - &srcBox); - } - - // No longer need the old buffer - mBuffer = std::move(newBuffer); - - mBufferSize = bufferDesc.ByteWidth; - - // Free the SRVs. - clearSRVs(); - - // Notify that the storage has changed. - if (mOnStorageChanged) - { - mOnStorageChanged->signal(context); - } - - return gl::NoError(); -} - -// static -void Buffer11::NativeStorage::FillBufferDesc(D3D11_BUFFER_DESC *bufferDesc, - Renderer11 *renderer, - BufferUsage usage, - unsigned int bufferSize) -{ - bufferDesc->ByteWidth = bufferSize; - bufferDesc->MiscFlags = 0; - bufferDesc->StructureByteStride = 0; - - switch (usage) - { - case BUFFER_USAGE_STAGING: - bufferDesc->Usage = D3D11_USAGE_STAGING; - bufferDesc->BindFlags = 0; - bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; - break; - - case BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK: - bufferDesc->Usage = D3D11_USAGE_DEFAULT; - bufferDesc->BindFlags = D3D11_BIND_VERTEX_BUFFER; - - if (renderer->isES3Capable()) - { - bufferDesc->BindFlags |= D3D11_BIND_STREAM_OUTPUT; - } - - bufferDesc->CPUAccessFlags = 0; - break; - - case BUFFER_USAGE_INDEX: - bufferDesc->Usage = D3D11_USAGE_DEFAULT; - bufferDesc->BindFlags = D3D11_BIND_INDEX_BUFFER; - bufferDesc->CPUAccessFlags = 0; - break; - - case BUFFER_USAGE_INDIRECT: - bufferDesc->MiscFlags = D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS; - bufferDesc->Usage = D3D11_USAGE_DEFAULT; - bufferDesc->BindFlags = 0; - bufferDesc->CPUAccessFlags = 0; - break; - - case BUFFER_USAGE_PIXEL_UNPACK: - bufferDesc->Usage = D3D11_USAGE_DEFAULT; - bufferDesc->BindFlags = D3D11_BIND_SHADER_RESOURCE; - bufferDesc->CPUAccessFlags = 0; - break; - - case BUFFER_USAGE_UNIFORM: - bufferDesc->Usage = D3D11_USAGE_DYNAMIC; - bufferDesc->BindFlags = D3D11_BIND_CONSTANT_BUFFER; - bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - // Constant buffers must be of a limited size, and aligned to 16 byte boundaries - // For our purposes we ignore any buffer data past the maximum constant buffer size - bufferDesc->ByteWidth = roundUp(bufferDesc->ByteWidth, 16u); - - // Note: it seems that D3D11 allows larger buffers on some platforms, but not all. - // (Windows 10 seems to allow larger constant buffers, but not Windows 7) - bufferDesc->ByteWidth = - std::min<UINT>(bufferDesc->ByteWidth, - static_cast<UINT>(renderer->getNativeCaps().maxUniformBlockSize)); - break; - - default: - UNREACHABLE(); - } -} - -gl::Error Buffer11::NativeStorage::map(size_t offset, - size_t length, - GLbitfield access, - uint8_t **mapPointerOut) -{ - ASSERT(isCPUAccessible(access)); - - D3D11_MAPPED_SUBRESOURCE mappedResource; - ID3D11DeviceContext *context = mRenderer->getDeviceContext(); - D3D11_MAP d3dMapType = gl_d3d11::GetD3DMapTypeFromBits(mUsage, access); - UINT d3dMapFlag = ((access & GL_MAP_UNSYNCHRONIZED_BIT) != 0 ? D3D11_MAP_FLAG_DO_NOT_WAIT : 0); - - HRESULT result = context->Map(mBuffer.get(), 0, d3dMapType, d3dMapFlag, &mappedResource); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to map native storage in Buffer11::NativeStorage::map"; - } - ASSERT(mappedResource.pData); - *mapPointerOut = static_cast<uint8_t *>(mappedResource.pData) + offset; - return gl::NoError(); -} - -void Buffer11::NativeStorage::unmap() -{ - ASSERT(isCPUAccessible(GL_MAP_WRITE_BIT) || isCPUAccessible(GL_MAP_READ_BIT)); - ID3D11DeviceContext *context = mRenderer->getDeviceContext(); - context->Unmap(mBuffer.get(), 0); -} - -gl::ErrorOrResult<const d3d11::ShaderResourceView *> Buffer11::NativeStorage::getSRVForFormat( - DXGI_FORMAT srvFormat) -{ - auto bufferSRVIt = mBufferResourceViews.find(srvFormat); - - if (bufferSRVIt != mBufferResourceViews.end()) - { - return &bufferSRVIt->second; - } - - const d3d11::DXGIFormatSize &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(srvFormat); - - D3D11_SHADER_RESOURCE_VIEW_DESC bufferSRVDesc; - bufferSRVDesc.Buffer.ElementOffset = 0; - bufferSRVDesc.Buffer.ElementWidth = static_cast<UINT>(mBufferSize) / dxgiFormatInfo.pixelBytes; - bufferSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER; - bufferSRVDesc.Format = srvFormat; - - ANGLE_TRY(mRenderer->allocateResource(bufferSRVDesc, mBuffer.get(), - &mBufferResourceViews[srvFormat])); - - return &mBufferResourceViews[srvFormat]; -} - -void Buffer11::NativeStorage::clearSRVs() -{ - mBufferResourceViews.clear(); -} - -// Buffer11::EmulatedIndexStorage implementation - -Buffer11::EmulatedIndexedStorage::EmulatedIndexedStorage(Renderer11 *renderer) - : BufferStorage(renderer, BUFFER_USAGE_EMULATED_INDEXED_VERTEX), mBuffer() -{ -} - -Buffer11::EmulatedIndexedStorage::~EmulatedIndexedStorage() -{ -} - -gl::ErrorOrResult<const d3d11::Buffer *> Buffer11::EmulatedIndexedStorage::getBuffer( - SourceIndexData *indexInfo, - const TranslatedAttribute &attribute, - GLint startVertex) -{ - // If a change in the indices applied from the last draw call is detected, then the emulated - // indexed buffer needs to be invalidated. After invalidation, the change detected flag should - // be cleared to avoid unnecessary recreation of the buffer. - if (!mBuffer.valid() || indexInfo->srcIndicesChanged) - { - mBuffer.reset(); - - // Copy the source index data. This ensures that the lifetime of the indices pointer - // stays with this storage until the next time we invalidate. - size_t indicesDataSize = 0; - switch (indexInfo->srcIndexType) - { - case GL_UNSIGNED_INT: - indicesDataSize = sizeof(GLuint) * indexInfo->srcCount; - break; - case GL_UNSIGNED_SHORT: - indicesDataSize = sizeof(GLushort) * indexInfo->srcCount; - break; - case GL_UNSIGNED_BYTE: - indicesDataSize = sizeof(GLubyte) * indexInfo->srcCount; - break; - default: - indicesDataSize = sizeof(GLushort) * indexInfo->srcCount; - break; - } - - if (!mIndicesMemoryBuffer.resize(indicesDataSize)) - { - return gl::OutOfMemory() << "Error resizing index memory buffer in " - "Buffer11::EmulatedIndexedStorage::getBuffer"; - } - - memcpy(mIndicesMemoryBuffer.data(), indexInfo->srcIndices, indicesDataSize); - - indexInfo->srcIndicesChanged = false; - } - - if (!mBuffer.valid()) - { - unsigned int offset = 0; - ANGLE_TRY_RESULT(attribute.computeOffset(startVertex), offset); - - // Expand the memory storage upon request and cache the results. - unsigned int expandedDataSize = - static_cast<unsigned int>((indexInfo->srcCount * attribute.stride) + offset); - angle::MemoryBuffer expandedData; - if (!expandedData.resize(expandedDataSize)) - { - return gl::OutOfMemory() - << "Error resizing buffer in Buffer11::EmulatedIndexedStorage::getBuffer"; - } - - // Clear the contents of the allocated buffer - ZeroMemory(expandedData.data(), expandedDataSize); - - uint8_t *curr = expandedData.data(); - const uint8_t *ptr = static_cast<const uint8_t *>(indexInfo->srcIndices); - - // Ensure that we start in the correct place for the emulated data copy operation to - // maintain offset behaviors. - curr += offset; - - ReadIndexValueFunction readIndexValue = ReadIndexValueFromIndices<GLushort>; - - switch (indexInfo->srcIndexType) - { - case GL_UNSIGNED_INT: - readIndexValue = ReadIndexValueFromIndices<GLuint>; - break; - case GL_UNSIGNED_SHORT: - readIndexValue = ReadIndexValueFromIndices<GLushort>; - break; - case GL_UNSIGNED_BYTE: - readIndexValue = ReadIndexValueFromIndices<GLubyte>; - break; - } - - // Iterate over the cached index data and copy entries indicated into the emulated buffer. - for (GLuint i = 0; i < indexInfo->srcCount; i++) - { - GLuint idx = readIndexValue(ptr, i); - memcpy(curr, mMemoryBuffer.data() + (attribute.stride * idx), attribute.stride); - curr += attribute.stride; - } - - // Finally, initialize the emulated indexed native storage object with the newly copied data - // and free the temporary buffers used. - D3D11_BUFFER_DESC bufferDesc; - bufferDesc.ByteWidth = expandedDataSize; - bufferDesc.MiscFlags = 0; - bufferDesc.StructureByteStride = 0; - bufferDesc.Usage = D3D11_USAGE_DEFAULT; - bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - bufferDesc.CPUAccessFlags = 0; - - D3D11_SUBRESOURCE_DATA subResourceData = {expandedData.data(), 0, 0}; - - ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &subResourceData, &mBuffer)); - mBuffer.setDebugName("Buffer11::EmulatedIndexedStorage"); - } - - return &mBuffer; -} - -gl::ErrorOrResult<CopyResult> Buffer11::EmulatedIndexedStorage::copyFromStorage( - const gl::Context *context, - BufferStorage *source, - size_t sourceOffset, - size_t size, - size_t destOffset) -{ - ASSERT(source->isCPUAccessible(GL_MAP_READ_BIT)); - uint8_t *sourceData = nullptr; - ANGLE_TRY(source->map(sourceOffset, size, GL_MAP_READ_BIT, &sourceData)); - ASSERT(destOffset + size <= mMemoryBuffer.size()); - memcpy(mMemoryBuffer.data() + destOffset, sourceData, size); - source->unmap(); - return CopyResult::RECREATED; -} - -gl::Error Buffer11::EmulatedIndexedStorage::resize(const gl::Context *context, - size_t size, - bool preserveData) -{ - if (mMemoryBuffer.size() < size) - { - if (!mMemoryBuffer.resize(size)) - { - return gl::OutOfMemory() << "Failed to resize EmulatedIndexedStorage"; - } - mBufferSize = size; - } - - return gl::NoError(); -} - -gl::Error Buffer11::EmulatedIndexedStorage::map(size_t offset, - size_t length, - GLbitfield access, - uint8_t **mapPointerOut) -{ - ASSERT(!mMemoryBuffer.empty() && offset + length <= mMemoryBuffer.size()); - *mapPointerOut = mMemoryBuffer.data() + offset; - return gl::NoError(); -} - -void Buffer11::EmulatedIndexedStorage::unmap() -{ - // No-op -} - -// Buffer11::PackStorage implementation - -Buffer11::PackStorage::PackStorage(Renderer11 *renderer) - : BufferStorage(renderer, BUFFER_USAGE_PIXEL_PACK), mStagingTexture(), mDataModified(false) -{ -} - -Buffer11::PackStorage::~PackStorage() -{ -} - -gl::ErrorOrResult<CopyResult> Buffer11::PackStorage::copyFromStorage(const gl::Context *context, - BufferStorage *source, - size_t sourceOffset, - size_t size, - size_t destOffset) -{ - ANGLE_TRY(flushQueuedPackCommand()); - - // For all use cases of pack buffers, we must copy through a readable buffer. - ASSERT(source->isCPUAccessible(GL_MAP_READ_BIT)); - uint8_t *sourceData = nullptr; - ANGLE_TRY(source->map(sourceOffset, size, GL_MAP_READ_BIT, &sourceData)); - ASSERT(destOffset + size <= mMemoryBuffer.size()); - memcpy(mMemoryBuffer.data() + destOffset, sourceData, size); - source->unmap(); - return CopyResult::NOT_RECREATED; -} - -gl::Error Buffer11::PackStorage::resize(const gl::Context *context, size_t size, bool preserveData) -{ - if (size != mBufferSize) - { - if (!mMemoryBuffer.resize(size)) - { - return gl::OutOfMemory() << "Failed to resize internal buffer storage."; - } - mBufferSize = size; - } - - return gl::NoError(); -} - -gl::Error Buffer11::PackStorage::map(size_t offset, - size_t length, - GLbitfield access, - uint8_t **mapPointerOut) -{ - ASSERT(offset + length <= getSize()); - // TODO: fast path - // We might be able to optimize out one or more memcpy calls by detecting when - // and if D3D packs the staging texture memory identically to how we would fill - // the pack buffer according to the current pack state. - - ANGLE_TRY(flushQueuedPackCommand()); - - mDataModified = (mDataModified || (access & GL_MAP_WRITE_BIT) != 0); - - *mapPointerOut = mMemoryBuffer.data() + offset; - return gl::NoError(); -} - -void Buffer11::PackStorage::unmap() -{ - // No-op -} - -gl::Error Buffer11::PackStorage::packPixels(const gl::Context *context, - const gl::FramebufferAttachment &readAttachment, - const PackPixelsParams ¶ms) -{ - ANGLE_TRY(flushQueuedPackCommand()); - - RenderTarget11 *renderTarget = nullptr; - ANGLE_TRY(readAttachment.getRenderTarget(context, &renderTarget)); - - const TextureHelper11 &srcTexture = renderTarget->getTexture(); - ASSERT(srcTexture.valid()); - unsigned int srcSubresource = renderTarget->getSubresourceIndex(); - - mQueuedPackCommand.reset(new PackPixelsParams(params)); - - gl::Extents srcTextureSize(params.area.width, params.area.height, 1); - if (!mStagingTexture.get() || mStagingTexture.getFormat() != srcTexture.getFormat() || - mStagingTexture.getExtents() != srcTextureSize) - { - ANGLE_TRY_RESULT( - mRenderer->createStagingTexture(srcTexture.getTextureType(), srcTexture.getFormatSet(), - srcTextureSize, StagingAccess::READ), - mStagingTexture); - } - - // ReadPixels from multisampled FBOs isn't supported in current GL - ASSERT(srcTexture.getSampleCount() <= 1); - - ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext(); - D3D11_BOX srcBox; - srcBox.left = params.area.x; - srcBox.right = params.area.x + params.area.width; - srcBox.top = params.area.y; - srcBox.bottom = params.area.y + params.area.height; - - // Select the correct layer from a 3D attachment - srcBox.front = 0; - if (mStagingTexture.is3D()) - { - srcBox.front = static_cast<UINT>(readAttachment.layer()); - } - srcBox.back = srcBox.front + 1; - - // Asynchronous copy - immediateContext->CopySubresourceRegion(mStagingTexture.get(), 0, 0, 0, 0, srcTexture.get(), - srcSubresource, &srcBox); - - return gl::NoError(); -} - -gl::Error Buffer11::PackStorage::flushQueuedPackCommand() -{ - ASSERT(mMemoryBuffer.size() > 0); - - if (mQueuedPackCommand) - { - ANGLE_TRY( - mRenderer->packPixels(mStagingTexture, *mQueuedPackCommand, mMemoryBuffer.data())); - mQueuedPackCommand.reset(nullptr); - } - - return gl::NoError(); -} - -// Buffer11::SystemMemoryStorage implementation - -Buffer11::SystemMemoryStorage::SystemMemoryStorage(Renderer11 *renderer) - : Buffer11::BufferStorage(renderer, BUFFER_USAGE_SYSTEM_MEMORY) -{ -} - -gl::ErrorOrResult<CopyResult> Buffer11::SystemMemoryStorage::copyFromStorage( - const gl::Context *context, - BufferStorage *source, - size_t sourceOffset, - size_t size, - size_t destOffset) -{ - ASSERT(source->isCPUAccessible(GL_MAP_READ_BIT)); - uint8_t *sourceData = nullptr; - ANGLE_TRY(source->map(sourceOffset, size, GL_MAP_READ_BIT, &sourceData)); - ASSERT(destOffset + size <= mSystemCopy.size()); - memcpy(mSystemCopy.data() + destOffset, sourceData, size); - source->unmap(); - return CopyResult::RECREATED; -} - -gl::Error Buffer11::SystemMemoryStorage::resize(const gl::Context *context, - size_t size, - bool preserveData) -{ - if (mSystemCopy.size() < size) - { - if (!mSystemCopy.resize(size)) - { - return gl::OutOfMemory() << "Failed to resize SystemMemoryStorage"; - } - mBufferSize = size; - } - - return gl::NoError(); -} - -gl::Error Buffer11::SystemMemoryStorage::map(size_t offset, - size_t length, - GLbitfield access, - uint8_t **mapPointerOut) -{ - ASSERT(!mSystemCopy.empty() && offset + length <= mSystemCopy.size()); - *mapPointerOut = mSystemCopy.data() + offset; - return gl::NoError(); -} - -void Buffer11::SystemMemoryStorage::unmap() -{ - // No-op -} -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h deleted file mode 100644 index f92a68454b..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h +++ /dev/null @@ -1,189 +0,0 @@ -// -// 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. -// - -// Buffer11.h: Defines the rx::Buffer11 class which implements rx::BufferImpl via rx::BufferD3D. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_ - -#include <array> -#include <map> - -#include "libANGLE/angletypes.h" -#include "libANGLE/renderer/d3d/BufferD3D.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -namespace gl -{ -class FramebufferAttachment; -} - -namespace rx -{ -struct PackPixelsParams; -class Renderer11; -struct SourceIndexData; -struct TranslatedAttribute; - -// The order of this enum governs priority of 'getLatestBufferStorage'. -enum BufferUsage -{ - BUFFER_USAGE_STAGING, - BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK, - BUFFER_USAGE_INDEX, - // TODO: possibly share this buffer type with shader storage buffers. - BUFFER_USAGE_INDIRECT, - BUFFER_USAGE_PIXEL_UNPACK, - BUFFER_USAGE_PIXEL_PACK, - BUFFER_USAGE_UNIFORM, - BUFFER_USAGE_SYSTEM_MEMORY, - BUFFER_USAGE_EMULATED_INDEXED_VERTEX, - - BUFFER_USAGE_COUNT, -}; - -typedef size_t DataRevision; - -class Buffer11 : public BufferD3D -{ - public: - Buffer11(const gl::BufferState &state, Renderer11 *renderer); - ~Buffer11() override; - - gl::ErrorOrResult<ID3D11Buffer *> getBuffer(const gl::Context *context, BufferUsage usage); - gl::ErrorOrResult<ID3D11Buffer *> getEmulatedIndexedBuffer(const gl::Context *context, - SourceIndexData *indexInfo, - const TranslatedAttribute &attribute, - GLint startVertex); - gl::Error getConstantBufferRange(const gl::Context *context, - GLintptr offset, - GLsizeiptr size, - const d3d11::Buffer **bufferOut, - UINT *firstConstantOut, - UINT *numConstantsOut); - gl::ErrorOrResult<const d3d11::ShaderResourceView *> getSRV(const gl::Context *context, - DXGI_FORMAT srvFormat); - bool isMapped() const { return mMappedStorage != nullptr; } - gl::Error packPixels(const gl::Context *context, - const gl::FramebufferAttachment &readAttachment, - const PackPixelsParams ¶ms); - size_t getTotalCPUBufferMemoryBytes() const; - - // BufferD3D implementation - size_t getSize() const override; - bool supportsDirectBinding() const override; - gl::Error getData(const gl::Context *context, const uint8_t **outData) override; - void initializeStaticData(const gl::Context *context) override; - void invalidateStaticData(const gl::Context *context) override; - - // BufferImpl implementation - gl::Error setData(const gl::Context *context, - gl::BufferBinding target, - const void *data, - size_t size, - gl::BufferUsage usage) override; - gl::Error setSubData(const gl::Context *context, - gl::BufferBinding target, - const void *data, - size_t size, - size_t offset) override; - gl::Error copySubData(const gl::Context *context, - BufferImpl *source, - GLintptr sourceOffset, - GLintptr destOffset, - GLsizeiptr size) override; - gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) override; - gl::Error mapRange(const gl::Context *context, - size_t offset, - size_t length, - GLbitfield access, - void **mapPtr) override; - gl::Error unmap(const gl::Context *context, GLboolean *result) override; - gl::Error markTransformFeedbackUsage(const gl::Context *context) override; - - // We use two set of dirty events. Static buffers are marked dirty whenever - // data changes, because they must be re-translated. Direct buffers only need to be - // updated when the underlying ID3D11Buffer pointer changes - hopefully far less often. - OnBufferDataDirtyChannel *getStaticBroadcastChannel(); - OnBufferDataDirtyChannel *getDirectBroadcastChannel(); - - private: - class BufferStorage; - class EmulatedIndexedStorage; - class NativeStorage; - class PackStorage; - class SystemMemoryStorage; - - struct ConstantBufferCacheEntry - { - ConstantBufferCacheEntry() : storage(nullptr), lruCount(0) {} - - BufferStorage *storage; - unsigned int lruCount; - }; - - void markBufferUsage(BufferUsage usage); - gl::Error garbageCollection(const gl::Context *context, BufferUsage currentUsage); - gl::ErrorOrResult<NativeStorage *> getStagingStorage(const gl::Context *context); - gl::ErrorOrResult<PackStorage *> getPackStorage(const gl::Context *context); - gl::ErrorOrResult<SystemMemoryStorage *> getSystemMemoryStorage(const gl::Context *context); - - gl::Error updateBufferStorage(const gl::Context *context, - BufferStorage *storage, - size_t sourceOffset, - size_t storageSize); - gl::ErrorOrResult<BufferStorage *> getBufferStorage(const gl::Context *context, - BufferUsage usage); - gl::ErrorOrResult<BufferStorage *> getLatestBufferStorage(const gl::Context *context) const; - - gl::ErrorOrResult<BufferStorage *> getConstantBufferRangeStorage(const gl::Context *context, - GLintptr offset, - GLsizeiptr size); - - BufferStorage *allocateStorage(BufferUsage usage); - void updateDeallocThreshold(BufferUsage usage); - - // Free the storage if we decide it isn't being used very often. - gl::Error checkForDeallocation(const gl::Context *context, BufferUsage usage); - - // For some cases of uniform buffer storage, we can't deallocate system memory storage. - bool canDeallocateSystemMemory() const; - - // Updates data revisions and latest storage. - void onCopyStorage(BufferStorage *dest, BufferStorage *source); - void onStorageUpdate(BufferStorage *updatedStorage); - - Renderer11 *mRenderer; - size_t mSize; - - BufferStorage *mMappedStorage; - - // Buffer storages are sorted by usage. It's important that the latest buffer storage picks - // the lowest usage in the case where two storages are tied on data revision - this ensures - // we never do anything dangerous like map a uniform buffer over a staging or system memory - // copy. - std::array<BufferStorage *, BUFFER_USAGE_COUNT> mBufferStorages; - BufferStorage *mLatestBufferStorage; - - // These two arrays are used to track when to free unused storage. - std::array<unsigned int, BUFFER_USAGE_COUNT> mDeallocThresholds; - std::array<unsigned int, BUFFER_USAGE_COUNT> mIdleness; - - // Cache of D3D11 constant buffer for specific ranges of buffer data. - // This is used to emulate UBO ranges on 11.0 devices. - // Constant buffers are indexed by there start offset. - typedef std::map<GLintptr /*offset*/, ConstantBufferCacheEntry> ConstantBufferCache; - ConstantBufferCache mConstantBufferRangeStoragesCache; - size_t mConstantBufferStorageAdditionalSize; - unsigned int mMaxConstantBufferLruCount; - - OnBufferDataDirtyChannel mStaticBroadcastChannel; - OnBufferDataDirtyChannel mDirectBroadcastChannel; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp deleted file mode 100644 index f9dda0aeb4..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp +++ /dev/null @@ -1,833 +0,0 @@ - -// Copyright (c) 2013 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. -// - -// Clear11.cpp: Framebuffer clear utility class. - -#include "libANGLE/renderer/d3d/d3d11/Clear11.h" - -#include <algorithm> - -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/FramebufferD3D.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "third_party/trace_event/trace_event.h" - -// Precompiled shaders -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11_fl9vs.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewgs.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewvs.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11vs.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/cleardepth11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps1.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps2.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps3.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps4.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps5.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps6.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps7.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps8.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps1.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps2.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps3.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps4.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps5.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps6.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps7.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps8.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps1.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps2.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps3.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps4.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps5.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps6.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps7.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps8.h" - -namespace rx -{ - -namespace -{ -constexpr uint32_t g_ConstantBufferSize = sizeof(RtvDsvClearInfo<float>); -constexpr uint32_t g_VertexSize = sizeof(d3d11::PositionVertex); - -// Updates color, depth and alpha components of cached CB if necessary. -// Returns true if any constants are updated, false otherwise. -template <typename T> -bool UpdateDataCache(RtvDsvClearInfo<T> *dataCache, - const gl::Color<T> &color, - const float *zValue, - const uint32_t numRtvs, - const uint8_t writeMask) -{ - bool cacheDirty = false; - - if (numRtvs > 0) - { - const bool writeRGB = (writeMask & ~D3D11_COLOR_WRITE_ENABLE_ALPHA) != 0; - if (writeRGB && memcmp(&dataCache->r, &color.red, sizeof(T) * 3) != 0) - { - dataCache->r = color.red; - dataCache->g = color.green; - dataCache->b = color.blue; - cacheDirty = true; - } - - const bool writeAlpha = (writeMask & D3D11_COLOR_WRITE_ENABLE_ALPHA) != 0; - if (writeAlpha && (dataCache->a != color.alpha)) - { - dataCache->a = color.alpha; - cacheDirty = true; - } - } - - if (zValue) - { - const float clampedZValue = gl::clamp01(*zValue); - - if (clampedZValue != dataCache->z) - { - dataCache->z = clampedZValue; - cacheDirty = true; - } - } - - return cacheDirty; -} - -bool AllOffsetsAreNonNegative(const std::vector<gl::Offset> &viewportOffsets) -{ - for (size_t i = 0u; i < viewportOffsets.size(); ++i) - { - const auto &offset = viewportOffsets[i]; - if (offset.x < 0 || offset.y < 0) - { - return false; - } - } - return true; -} -} // anonymous namespace - -#define CLEARPS(Index) \ - d3d11::LazyShader<ID3D11PixelShader>(g_PS_Clear##Index, ArraySize(g_PS_Clear##Index), \ - "Clear11 PS " ANGLE_STRINGIFY(Index)) - -Clear11::ShaderManager::ShaderManager() - : mIl9(), - mVs9(g_VS_Clear_FL9, ArraySize(g_VS_Clear_FL9), "Clear11 VS FL9"), - mPsFloat9(g_PS_ClearFloat_FL9, ArraySize(g_PS_ClearFloat_FL9), "Clear11 PS FloatFL9"), - mVs(g_VS_Clear, ArraySize(g_VS_Clear), "Clear11 VS"), - mVsMultiview(g_VS_Multiview_Clear, ArraySize(g_VS_Multiview_Clear), "Clear11 VS Multiview"), - mGsMultiview(g_GS_Multiview_Clear, ArraySize(g_GS_Multiview_Clear), "Clear11 GS Multiview"), - mPsDepth(g_PS_ClearDepth, ArraySize(g_PS_ClearDepth), "Clear11 PS Depth"), - mPsFloat{{CLEARPS(Float1), CLEARPS(Float2), CLEARPS(Float3), CLEARPS(Float4), CLEARPS(Float5), - CLEARPS(Float6), CLEARPS(Float7), CLEARPS(Float8)}}, - mPsUInt{{CLEARPS(Uint1), CLEARPS(Uint2), CLEARPS(Uint3), CLEARPS(Uint4), CLEARPS(Uint5), - CLEARPS(Uint6), CLEARPS(Uint7), CLEARPS(Uint8)}}, - mPsSInt{{CLEARPS(Sint1), CLEARPS(Sint2), CLEARPS(Sint3), CLEARPS(Sint4), CLEARPS(Sint5), - CLEARPS(Sint6), CLEARPS(Sint7), CLEARPS(Sint8)}} -{ -} - -#undef CLEARPS - -Clear11::ShaderManager::~ShaderManager() -{ -} - -gl::Error Clear11::ShaderManager::getShadersAndLayout(Renderer11 *renderer, - const INT clearType, - const uint32_t numRTs, - const bool hasLayeredLayout, - const d3d11::InputLayout **il, - const d3d11::VertexShader **vs, - const d3d11::GeometryShader **gs, - const d3d11::PixelShader **ps) -{ - if (renderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3) - { - ASSERT(clearType == GL_FLOAT); - - ANGLE_TRY(mVs9.resolve(renderer)); - ANGLE_TRY(mPsFloat9.resolve(renderer)); - - if (!mIl9.valid()) - { - const D3D11_INPUT_ELEMENT_DESC ilDesc[] = { - {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}}; - - InputElementArray ilDescArray(ilDesc); - ShaderData vertexShader(g_VS_Clear_FL9); - - ANGLE_TRY(renderer->allocateResource(ilDescArray, &vertexShader, &mIl9)); - } - - *vs = &mVs9.getObj(); - *gs = nullptr; - *il = &mIl9; - *ps = &mPsFloat9.getObj(); - return gl::NoError(); - } - if (!hasLayeredLayout) - { - ANGLE_TRY(mVs.resolve(renderer)); - *vs = &mVs.getObj(); - *gs = nullptr; - } - else - { - // For layered framebuffers we have to use the multi-view versions of the VS and GS. - ANGLE_TRY(mVsMultiview.resolve(renderer)); - ANGLE_TRY(mGsMultiview.resolve(renderer)); - *vs = &mVsMultiview.getObj(); - *gs = &mGsMultiview.getObj(); - } - - *il = nullptr; - - if (numRTs == 0) - { - ANGLE_TRY(mPsDepth.resolve(renderer)); - *ps = &mPsDepth.getObj(); - return gl::NoError(); - } - - switch (clearType) - { - case GL_FLOAT: - ANGLE_TRY(mPsFloat[numRTs - 1].resolve(renderer)); - *ps = &mPsFloat[numRTs - 1].getObj(); - break; - case GL_UNSIGNED_INT: - ANGLE_TRY(mPsUInt[numRTs - 1].resolve(renderer)); - *ps = &mPsUInt[numRTs - 1].getObj(); - break; - case GL_INT: - ANGLE_TRY(mPsSInt[numRTs - 1].resolve(renderer)); - *ps = &mPsSInt[numRTs - 1].getObj(); - break; - default: - UNREACHABLE(); - break; - } - - return gl::NoError(); -} - -Clear11::Clear11(Renderer11 *renderer) - : mRenderer(renderer), - mResourcesInitialized(false), - mScissorEnabledRasterizerState(), - mScissorDisabledRasterizerState(), - mShaderManager(), - mConstantBuffer(), - mVertexBuffer(), - mShaderData({}) -{ -} - -Clear11::~Clear11() -{ -} - -gl::Error Clear11::ensureResourcesInitialized() -{ - if (mResourcesInitialized) - { - return gl::NoError(); - } - - TRACE_EVENT0("gpu.angle", "Clear11::ensureResourcesInitialized"); - - static_assert((sizeof(RtvDsvClearInfo<float>) == sizeof(RtvDsvClearInfo<int>)), - "Size of rx::RtvDsvClearInfo<float> is not equal to rx::RtvDsvClearInfo<int>"); - - static_assert( - (sizeof(RtvDsvClearInfo<float>) == sizeof(RtvDsvClearInfo<uint32_t>)), - "Size of rx::RtvDsvClearInfo<float> is not equal to rx::RtvDsvClearInfo<uint32_t>"); - - static_assert((sizeof(RtvDsvClearInfo<float>) % 16 == 0), - "The size of RtvDsvClearInfo<float> should be a multiple of 16bytes."); - - // Create Rasterizer States - D3D11_RASTERIZER_DESC rsDesc; - rsDesc.FillMode = D3D11_FILL_SOLID; - rsDesc.CullMode = D3D11_CULL_NONE; - rsDesc.FrontCounterClockwise = FALSE; - rsDesc.DepthBias = 0; - rsDesc.DepthBiasClamp = 0.0f; - rsDesc.SlopeScaledDepthBias = 0.0f; - rsDesc.DepthClipEnable = TRUE; - rsDesc.ScissorEnable = FALSE; - rsDesc.MultisampleEnable = FALSE; - rsDesc.AntialiasedLineEnable = FALSE; - - ANGLE_TRY(mRenderer->allocateResource(rsDesc, &mScissorDisabledRasterizerState)); - mScissorDisabledRasterizerState.setDebugName("Clear11 Rasterizer State with scissor disabled"); - - rsDesc.ScissorEnable = TRUE; - ANGLE_TRY(mRenderer->allocateResource(rsDesc, &mScissorEnabledRasterizerState)); - mScissorEnabledRasterizerState.setDebugName("Clear11 Rasterizer State with scissor enabled"); - - // Initialize Depthstencil state with defaults - mDepthStencilStateKey.depthTest = false; - mDepthStencilStateKey.depthMask = false; - mDepthStencilStateKey.depthFunc = GL_ALWAYS; - mDepthStencilStateKey.stencilWritemask = static_cast<GLuint>(-1); - mDepthStencilStateKey.stencilBackWritemask = static_cast<GLuint>(-1); - mDepthStencilStateKey.stencilBackMask = 0; - mDepthStencilStateKey.stencilTest = false; - mDepthStencilStateKey.stencilMask = 0; - mDepthStencilStateKey.stencilFail = GL_REPLACE; - mDepthStencilStateKey.stencilPassDepthFail = GL_REPLACE; - mDepthStencilStateKey.stencilPassDepthPass = GL_REPLACE; - mDepthStencilStateKey.stencilFunc = GL_ALWAYS; - mDepthStencilStateKey.stencilBackFail = GL_REPLACE; - mDepthStencilStateKey.stencilBackPassDepthFail = GL_REPLACE; - mDepthStencilStateKey.stencilBackPassDepthPass = GL_REPLACE; - mDepthStencilStateKey.stencilBackFunc = GL_ALWAYS; - - // Initialize BlendStateKey with defaults - mBlendStateKey.blendState.blend = false; - mBlendStateKey.blendState.sourceBlendRGB = GL_ONE; - mBlendStateKey.blendState.sourceBlendAlpha = GL_ONE; - mBlendStateKey.blendState.destBlendRGB = GL_ZERO; - mBlendStateKey.blendState.destBlendAlpha = GL_ZERO; - mBlendStateKey.blendState.blendEquationRGB = GL_FUNC_ADD; - mBlendStateKey.blendState.blendEquationAlpha = GL_FUNC_ADD; - mBlendStateKey.blendState.sampleAlphaToCoverage = false; - mBlendStateKey.blendState.dither = true; - - mResourcesInitialized = true; - return gl::NoError(); -} - -bool Clear11::useVertexBuffer() const -{ - return (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3); -} - -gl::Error Clear11::ensureConstantBufferCreated() -{ - if (mConstantBuffer.valid()) - { - return gl::NoError(); - } - - // Create constant buffer for color & depth data - - D3D11_BUFFER_DESC bufferDesc; - bufferDesc.ByteWidth = g_ConstantBufferSize; - bufferDesc.Usage = D3D11_USAGE_DYNAMIC; - bufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - bufferDesc.MiscFlags = 0; - bufferDesc.StructureByteStride = 0; - - D3D11_SUBRESOURCE_DATA initialData; - initialData.pSysMem = &mShaderData; - initialData.SysMemPitch = g_ConstantBufferSize; - initialData.SysMemSlicePitch = g_ConstantBufferSize; - - ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &initialData, &mConstantBuffer)); - mConstantBuffer.setDebugName("Clear11 Constant Buffer"); - return gl::NoError(); -} - -gl::Error Clear11::ensureVertexBufferCreated() -{ - ASSERT(useVertexBuffer()); - - if (mVertexBuffer.valid()) - { - return gl::NoError(); - } - - // Create vertex buffer with vertices for a quad covering the entire surface - - static_assert((sizeof(d3d11::PositionVertex) % 16) == 0, - "d3d11::PositionVertex should be a multiple of 16 bytes"); - const d3d11::PositionVertex vbData[6] = {{-1.0f, 1.0f, 0.0f, 1.0f}, {1.0f, -1.0f, 0.0f, 1.0f}, - {-1.0f, -1.0f, 0.0f, 1.0f}, {-1.0f, 1.0f, 0.0f, 1.0f}, - {1.0f, 1.0f, 0.0f, 1.0f}, {1.0f, -1.0f, 0.0f, 1.0f}}; - - const UINT vbSize = sizeof(vbData); - - D3D11_BUFFER_DESC bufferDesc; - bufferDesc.ByteWidth = vbSize; - bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; - bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - bufferDesc.CPUAccessFlags = 0; - bufferDesc.MiscFlags = 0; - bufferDesc.StructureByteStride = 0; - - D3D11_SUBRESOURCE_DATA initialData; - initialData.pSysMem = vbData; - initialData.SysMemPitch = vbSize; - initialData.SysMemSlicePitch = initialData.SysMemPitch; - - ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &initialData, &mVertexBuffer)); - mVertexBuffer.setDebugName("Clear11 Vertex Buffer"); - return gl::NoError(); -} - -gl::Error Clear11::clearFramebuffer(const gl::Context *context, - const ClearParameters &clearParams, - const gl::FramebufferState &fboData) -{ - ANGLE_TRY(ensureResourcesInitialized()); - - // Iterate over the color buffers which require clearing and determine if they can be - // cleared with ID3D11DeviceContext::ClearRenderTargetView or ID3D11DeviceContext1::ClearView. - // This requires: - // 1) The render target is being cleared to a float value (will be cast to integer when clearing - // integer render targets as expected but does not work the other way around) - // 2) The format of the render target has no color channels that are currently masked out. - // Clear the easy-to-clear buffers on the spot and accumulate the ones that require special - // work. - // - // If these conditions are met, and: - // - No scissored clear is needed, then clear using ID3D11DeviceContext::ClearRenderTargetView. - // - A scissored clear is needed then clear using ID3D11DeviceContext1::ClearView if available. - // Otherwise perform a shader based clear. - // - // Also determine if the DSV can be cleared withID3D11DeviceContext::ClearDepthStencilView by - // checking if the stencil write mask covers the entire stencil. - // - // To clear the remaining buffers, a shader based clear is performed: - // - The appropriate ShaderManagers (VS & PS) for the clearType is set - // - A CB containing the clear color and Z values is bound - // - An IL and VB are bound (for FL93 and below) - // - ScissorRect/Raststate/Viewport set as required - // - Blendstate set containing appropriate colorMasks - // - DepthStencilState set with appropriate parameters for a z or stencil clear if required - // - Color and/or Z buffers to be cleared are bound - // - Primitive covering entire clear area is drawn - - gl::Extents framebufferSize; - - const auto *depthStencilAttachment = fboData.getDepthOrStencilAttachment(); - if (depthStencilAttachment != nullptr) - { - framebufferSize = depthStencilAttachment->getSize(); - } - else - { - const gl::FramebufferAttachment *colorAttachment = fboData.getFirstColorAttachment(); - - if (!colorAttachment) - { - UNREACHABLE(); - return gl::InternalError(); - } - - framebufferSize = colorAttachment->getSize(); - } - - const bool isSideBySideFBO = - (fboData.getMultiviewLayout() == GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE); - bool needScissoredClear = false; - std::vector<D3D11_RECT> scissorRects; - if (clearParams.scissorEnabled) - { - const std::vector<gl::Offset> *viewportOffsets = fboData.getViewportOffsets(); - ASSERT(viewportOffsets != nullptr); - ASSERT(AllOffsetsAreNonNegative(*fboData.getViewportOffsets())); - - if (clearParams.scissor.x >= framebufferSize.width || - clearParams.scissor.y >= framebufferSize.height || clearParams.scissor.width == 0 || - clearParams.scissor.height == 0) - { - // The check assumes that the viewport offsets are not negative as according to the - // ANGLE_multiview spec. - // Scissor rect is outside the renderbuffer or is an empty rect. - return gl::NoError(); - } - - if (isSideBySideFBO) - { - // We always have to do a scissor clear for side-by-side framebuffers. - needScissoredClear = true; - } - else - { - // Because the viewport offsets can generate scissor rectangles within the framebuffer's - // bounds, we can do this check only for non-side-by-side framebuffers. - if (clearParams.scissor.x + clearParams.scissor.width <= 0 || - clearParams.scissor.y + clearParams.scissor.height <= 0) - { - // Scissor rect is outside the renderbuffer. - return gl::NoError(); - } - needScissoredClear = - clearParams.scissor.x > 0 || clearParams.scissor.y > 0 || - clearParams.scissor.x + clearParams.scissor.width < framebufferSize.width || - clearParams.scissor.y + clearParams.scissor.height < framebufferSize.height; - } - - if (needScissoredClear) - { - // Apply viewport offsets to compute the final scissor rectangles. This is valid also - // for non-side-by-side framebuffers, because the default viewport offset is {0,0}. - const size_t numViews = viewportOffsets->size(); - scissorRects.reserve(numViews); - for (size_t i = 0u; i < numViews; ++i) - { - const gl::Offset &offset = (*viewportOffsets)[i]; - D3D11_RECT rect; - int x = clearParams.scissor.x + offset.x; - int y = clearParams.scissor.y + offset.y; - rect.left = x; - rect.right = x + clearParams.scissor.width; - rect.top = y; - rect.bottom = y + clearParams.scissor.height; - scissorRects.emplace_back(rect); - } - } - } - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - ID3D11DeviceContext1 *deviceContext1 = mRenderer->getDeviceContext1IfSupported(); - - std::array<ID3D11RenderTargetView *, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT> rtvs; - std::array<uint8_t, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT> rtvMasks = {}; - - uint32_t numRtvs = 0; - const uint8_t colorMask = - gl_d3d11::ConvertColorMask(clearParams.colorMaskRed, clearParams.colorMaskGreen, - clearParams.colorMaskBlue, clearParams.colorMaskAlpha); - - const auto &colorAttachments = fboData.getColorAttachments(); - for (auto colorAttachmentIndex : fboData.getEnabledDrawBuffers()) - { - const gl::FramebufferAttachment &attachment = colorAttachments[colorAttachmentIndex]; - - if (!clearParams.clearColor[colorAttachmentIndex]) - { - continue; - } - - RenderTarget11 *renderTarget = nullptr; - ANGLE_TRY(attachment.getRenderTarget(context, &renderTarget)); - - const gl::InternalFormat &formatInfo = *attachment.getFormat().info; - - if (clearParams.colorType == GL_FLOAT && - !(formatInfo.componentType == GL_FLOAT || - formatInfo.componentType == GL_UNSIGNED_NORMALIZED || - formatInfo.componentType == GL_SIGNED_NORMALIZED)) - { - ERR() << "It is undefined behaviour to clear a render buffer which is not " - "normalized fixed point or floating-point to floating point values (color " - "attachment " - << colorAttachmentIndex << " has internal format " << attachment.getFormat() - << ")."; - } - - if ((formatInfo.redBits == 0 || !clearParams.colorMaskRed) && - (formatInfo.greenBits == 0 || !clearParams.colorMaskGreen) && - (formatInfo.blueBits == 0 || !clearParams.colorMaskBlue) && - (formatInfo.alphaBits == 0 || !clearParams.colorMaskAlpha)) - { - // Every channel either does not exist in the render target or is masked out - continue; - } - - const auto &framebufferRTV = renderTarget->getRenderTargetView(); - ASSERT(framebufferRTV.valid()); - - if ((!(mRenderer->getRenderer11DeviceCaps().supportsClearView) && needScissoredClear) || - clearParams.colorType != GL_FLOAT || - (formatInfo.redBits > 0 && !clearParams.colorMaskRed) || - (formatInfo.greenBits > 0 && !clearParams.colorMaskGreen) || - (formatInfo.blueBits > 0 && !clearParams.colorMaskBlue) || - (formatInfo.alphaBits > 0 && !clearParams.colorMaskAlpha)) - { - rtvs[numRtvs] = framebufferRTV.get(); - rtvMasks[numRtvs] = gl_d3d11::GetColorMask(formatInfo) & colorMask; - numRtvs++; - } - else - { - // ID3D11DeviceContext::ClearRenderTargetView or ID3D11DeviceContext1::ClearView is - // possible - - const auto &nativeFormat = renderTarget->getFormatSet().format(); - - // Check if the actual format has a channel that the internal format does not and - // set them to the default values - float clearValues[4] = { - ((formatInfo.redBits == 0 && nativeFormat.redBits > 0) ? 0.0f - : clearParams.colorF.red), - ((formatInfo.greenBits == 0 && nativeFormat.greenBits > 0) - ? 0.0f - : clearParams.colorF.green), - ((formatInfo.blueBits == 0 && nativeFormat.blueBits > 0) ? 0.0f - : clearParams.colorF.blue), - ((formatInfo.alphaBits == 0 && nativeFormat.alphaBits > 0) - ? 1.0f - : clearParams.colorF.alpha), - }; - - if (formatInfo.alphaBits == 1) - { - // Some drivers do not correctly handle calling Clear() on a format with 1-bit - // alpha. They can incorrectly round all non-zero values up to 1.0f. Note that - // WARP does not do this. We should handle the rounding for them instead. - clearValues[3] = (clearParams.colorF.alpha >= 0.5f) ? 1.0f : 0.0f; - } - - if (needScissoredClear) - { - // We shouldn't reach here if deviceContext1 is unavailable. - ASSERT(deviceContext1); - // There must be at least one scissor rectangle. - ASSERT(!scissorRects.empty()); - deviceContext1->ClearView(framebufferRTV.get(), clearValues, scissorRects.data(), - static_cast<UINT>(scissorRects.size())); - if (mRenderer->getWorkarounds().callClearTwice) - { - deviceContext1->ClearView(framebufferRTV.get(), clearValues, - scissorRects.data(), - static_cast<UINT>(scissorRects.size())); - } - } - else - { - deviceContext->ClearRenderTargetView(framebufferRTV.get(), clearValues); - if (mRenderer->getWorkarounds().callClearTwice) - { - deviceContext->ClearRenderTargetView(framebufferRTV.get(), clearValues); - } - } - } - } - - ID3D11DepthStencilView *dsv = nullptr; - - if (clearParams.clearDepth || clearParams.clearStencil) - { - RenderTarget11 *depthStencilRenderTarget = nullptr; - - ASSERT(depthStencilAttachment != nullptr); - ANGLE_TRY(depthStencilAttachment->getRenderTarget(context, &depthStencilRenderTarget)); - - dsv = depthStencilRenderTarget->getDepthStencilView().get(); - ASSERT(dsv != nullptr); - - const auto &nativeFormat = depthStencilRenderTarget->getFormatSet().format(); - const auto *stencilAttachment = fboData.getStencilAttachment(); - - uint32_t stencilUnmasked = - (stencilAttachment != nullptr) ? (1 << nativeFormat.stencilBits) - 1 : 0; - bool needMaskedStencilClear = - clearParams.clearStencil && - (clearParams.stencilWriteMask & stencilUnmasked) != stencilUnmasked; - - if (!needScissoredClear && !needMaskedStencilClear) - { - const UINT clearFlags = (clearParams.clearDepth ? D3D11_CLEAR_DEPTH : 0) | - (clearParams.clearStencil ? D3D11_CLEAR_STENCIL : 0); - const FLOAT depthClear = gl::clamp01(clearParams.depthValue); - const UINT8 stencilClear = clearParams.stencilValue & 0xFF; - - deviceContext->ClearDepthStencilView(dsv, clearFlags, depthClear, stencilClear); - - dsv = nullptr; - } - } - - if (numRtvs == 0 && dsv == nullptr) - { - return gl::NoError(); - } - - // Clear the remaining render targets and depth stencil in one pass by rendering a quad: - // - // IA/VS: Vertices containing position and color members are passed through to the next stage. - // The vertex position has XY coordinates equal to clip extents and a Z component equal to the - // Z clear value. The vertex color contains the clear color. - // - // Rasterizer: Viewport scales the VS output over the entire surface and depending on whether - // or not scissoring is enabled the appropriate scissor rect and rasterizerState with or without - // the scissor test enabled is set as well. - // - // DepthStencilTest: DepthTesting, DepthWrites, StencilMask and StencilWrites will be enabled or - // disabled or set depending on what the input depthStencil clear parameters are. Since the PS - // is not writing out depth or rejecting pixels, this should happen prior to the PS stage. - // - // PS: Will write out the color values passed through from the previous stage to all outputs. - // - // OM: BlendState will perform the required color masking and output to RTV(s). - - // - // ====================================================================================== - // - // Luckily, the gl spec (ES 3.0.2 pg 183) states that the results of clearing a render- - // buffer that is not normalized fixed point or floating point with floating point values - // are undefined so we can just write floats to them and D3D11 will bit cast them to - // integers. - // - // Also, we don't have to worry about attempting to clear a normalized fixed/floating point - // buffer with integer values because there is no gl API call which would allow it, - // glClearBuffer* calls only clear a single renderbuffer at a time which is verified to - // be a compatible clear type. - - ASSERT(numRtvs <= mRenderer->getNativeCaps().maxDrawBuffers); - - // Setup BlendStateKey parameters - mBlendStateKey.blendState.colorMaskRed = clearParams.colorMaskRed; - mBlendStateKey.blendState.colorMaskGreen = clearParams.colorMaskGreen; - mBlendStateKey.blendState.colorMaskBlue = clearParams.colorMaskBlue; - mBlendStateKey.blendState.colorMaskAlpha = clearParams.colorMaskAlpha; - mBlendStateKey.rtvMax = numRtvs; - memcpy(mBlendStateKey.rtvMasks, &rtvMasks[0], sizeof(mBlendStateKey.rtvMasks)); - - // Get BlendState - const d3d11::BlendState *blendState = nullptr; - ANGLE_TRY(mRenderer->getBlendState(mBlendStateKey, &blendState)); - - const d3d11::DepthStencilState *dsState = nullptr; - const float *zValue = nullptr; - - if (dsv) - { - // Setup DepthStencilStateKey - mDepthStencilStateKey.depthTest = clearParams.clearDepth; - mDepthStencilStateKey.depthMask = clearParams.clearDepth; - mDepthStencilStateKey.stencilWritemask = clearParams.stencilWriteMask; - mDepthStencilStateKey.stencilTest = clearParams.clearStencil; - - // Get DepthStencilState - ANGLE_TRY(mRenderer->getDepthStencilState(mDepthStencilStateKey, &dsState)); - zValue = clearParams.clearDepth ? &clearParams.depthValue : nullptr; - } - - bool dirtyCb = false; - - // Compare the input color/z values against the CB cache and update it if necessary - switch (clearParams.colorType) - { - case GL_FLOAT: - dirtyCb = UpdateDataCache(reinterpret_cast<RtvDsvClearInfo<float> *>(&mShaderData), - clearParams.colorF, zValue, numRtvs, colorMask); - break; - case GL_UNSIGNED_INT: - dirtyCb = UpdateDataCache(reinterpret_cast<RtvDsvClearInfo<uint32_t> *>(&mShaderData), - clearParams.colorUI, zValue, numRtvs, colorMask); - break; - case GL_INT: - dirtyCb = UpdateDataCache(reinterpret_cast<RtvDsvClearInfo<int> *>(&mShaderData), - clearParams.colorI, zValue, numRtvs, colorMask); - break; - default: - UNREACHABLE(); - break; - } - - ANGLE_TRY(ensureConstantBufferCreated()); - - if (dirtyCb) - { - // Update the constant buffer with the updated cache contents - // TODO(Shahmeer): Consider using UpdateSubresource1 D3D11_COPY_DISCARD where possible. - D3D11_MAPPED_SUBRESOURCE mappedResource; - HRESULT result = deviceContext->Map(mConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, - &mappedResource); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Clear11: Failed to map CB, " << gl::FmtHR(result); - } - - memcpy(mappedResource.pData, &mShaderData, g_ConstantBufferSize); - deviceContext->Unmap(mConstantBuffer.get(), 0); - } - - auto *stateManager = mRenderer->getStateManager(); - - // Set the viewport to be the same size as the framebuffer. - stateManager->setSimpleViewport(framebufferSize); - - // Apply state - stateManager->setSimpleBlendState(blendState); - - const UINT stencilValue = clearParams.stencilValue & 0xFF; - stateManager->setDepthStencilState(dsState, stencilValue); - - if (needScissoredClear) - { - stateManager->setRasterizerState(&mScissorEnabledRasterizerState); - } - else - { - stateManager->setRasterizerState(&mScissorDisabledRasterizerState); - } - - // Get Shaders - const d3d11::VertexShader *vs = nullptr; - const d3d11::GeometryShader *gs = nullptr; - const d3d11::InputLayout *il = nullptr; - const d3d11::PixelShader *ps = nullptr; - const bool hasLayeredLayout = - (fboData.getMultiviewLayout() == GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE); - ANGLE_TRY(mShaderManager.getShadersAndLayout(mRenderer, clearParams.colorType, numRtvs, - hasLayeredLayout, &il, &vs, &gs, &ps)); - - // Apply Shaders - stateManager->setDrawShaders(vs, gs, ps); - stateManager->setPixelConstantBuffer(0, &mConstantBuffer); - - // Bind IL & VB if needed - stateManager->setIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0); - stateManager->setInputLayout(il); - - if (useVertexBuffer()) - { - ANGLE_TRY(ensureVertexBufferCreated()); - stateManager->setSingleVertexBuffer(&mVertexBuffer, g_VertexSize, 0); - } - else - { - stateManager->setSingleVertexBuffer(nullptr, 0, 0); - } - - stateManager->setPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - - // Apply render targets - stateManager->setRenderTargets(&rtvs[0], numRtvs, dsv); - - // If scissors are necessary to be applied, then the number of clears is the number of scissor - // rects. If no scissors are necessary, then a single full-size clear is enough. - size_t necessaryNumClears = needScissoredClear ? scissorRects.size() : 1u; - for (size_t i = 0u; i < necessaryNumClears; ++i) - { - if (needScissoredClear) - { - ASSERT(i < scissorRects.size()); - stateManager->setScissorRectD3D(scissorRects[i]); - } - // Draw the fullscreen quad. - if (!hasLayeredLayout || isSideBySideFBO) - { - deviceContext->Draw(6, 0); - } - else - { - ASSERT(hasLayeredLayout); - deviceContext->DrawInstanced(6, static_cast<UINT>(fboData.getNumViews()), 0, 0); - } - } - - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h deleted file mode 100644 index a09812c42b..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h +++ /dev/null @@ -1,100 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// Clear11.h: Framebuffer clear utility class. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_ - -#include <map> -#include <vector> - -#include "libANGLE/angletypes.h" -#include "libANGLE/Error.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -namespace rx -{ -class Renderer11; -class RenderTarget11; -struct ClearParameters; - -template <typename T> -struct RtvDsvClearInfo -{ - T r, g, b, a; - float z; - float c1padding[3]; -}; - -class Clear11 : angle::NonCopyable -{ - public: - explicit Clear11(Renderer11 *renderer); - ~Clear11(); - - // Clears the framebuffer with the supplied clear parameters, assumes that the framebuffer is currently applied. - gl::Error clearFramebuffer(const gl::Context *context, - const ClearParameters &clearParams, - const gl::FramebufferState &fboData); - - private: - class ShaderManager final : angle::NonCopyable - { - public: - ShaderManager(); - ~ShaderManager(); - gl::Error getShadersAndLayout(Renderer11 *renderer, - const INT clearType, - const uint32_t numRTs, - const bool hasLayeredLayout, - const d3d11::InputLayout **il, - const d3d11::VertexShader **vs, - const d3d11::GeometryShader **gs, - const d3d11::PixelShader **ps); - - private: - constexpr static size_t kNumShaders = D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; - - d3d11::InputLayout mIl9; - d3d11::LazyShader<ID3D11VertexShader> mVs9; - d3d11::LazyShader<ID3D11PixelShader> mPsFloat9; - d3d11::LazyShader<ID3D11VertexShader> mVs; - d3d11::LazyShader<ID3D11VertexShader> mVsMultiview; - d3d11::LazyShader<ID3D11GeometryShader> mGsMultiview; - d3d11::LazyShader<ID3D11PixelShader> mPsDepth; - std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsFloat; - std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsUInt; - std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsSInt; - }; - - bool useVertexBuffer() const; - gl::Error ensureConstantBufferCreated(); - gl::Error ensureVertexBufferCreated(); - gl::Error ensureResourcesInitialized(); - - Renderer11 *mRenderer; - bool mResourcesInitialized; - - // States - d3d11::RasterizerState mScissorEnabledRasterizerState; - d3d11::RasterizerState mScissorDisabledRasterizerState; - gl::DepthStencilState mDepthStencilStateKey; - d3d11::BlendStateKey mBlendStateKey; - - // Shaders and shader resources - ShaderManager mShaderManager; - d3d11::Buffer mConstantBuffer; - d3d11::Buffer mVertexBuffer; - - // Buffer data and draw parameters - RtvDsvClearInfo<float> mShaderData; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp deleted file mode 100644 index b79dd3603a..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp +++ /dev/null @@ -1,405 +0,0 @@ -// -// Copyright 2016 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. -// -// Context11: -// D3D11-specific functionality associated with a GL Context. -// - -#include "libANGLE/renderer/d3d/d3d11/Context11.h" - -#include "common/string_utils.h" -#include "libANGLE/Context.h" -#include "libANGLE/MemoryProgramCache.h" -#include "libANGLE/renderer/d3d/CompilerD3D.h" -#include "libANGLE/renderer/d3d/ProgramD3D.h" -#include "libANGLE/renderer/d3d/RenderbufferD3D.h" -#include "libANGLE/renderer/d3d/SamplerD3D.h" -#include "libANGLE/renderer/d3d/ShaderD3D.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" -#include "libANGLE/renderer/d3d/d3d11/Buffer11.h" -#include "libANGLE/renderer/d3d/d3d11/Fence11.h" -#include "libANGLE/renderer/d3d/d3d11/Framebuffer11.h" -#include "libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/StateManager11.h" -#include "libANGLE/renderer/d3d/d3d11/TransformFeedback11.h" -#include "libANGLE/renderer/d3d/d3d11/VertexArray11.h" - -namespace rx -{ - -Context11::Context11(const gl::ContextState &state, Renderer11 *renderer) - : ContextImpl(state), mRenderer(renderer) -{ -} - -Context11::~Context11() -{ -} - -gl::Error Context11::initialize() -{ - return gl::NoError(); -} - -CompilerImpl *Context11::createCompiler() -{ - if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3) - { - return new CompilerD3D(SH_HLSL_4_0_FL9_3_OUTPUT); - } - else - { - return new CompilerD3D(SH_HLSL_4_1_OUTPUT); - } -} - -ShaderImpl *Context11::createShader(const gl::ShaderState &data) -{ - return new ShaderD3D(data, mRenderer->getWorkarounds(), mRenderer->getNativeExtensions()); -} - -ProgramImpl *Context11::createProgram(const gl::ProgramState &data) -{ - return new ProgramD3D(data, mRenderer); -} - -FramebufferImpl *Context11::createFramebuffer(const gl::FramebufferState &data) -{ - return new Framebuffer11(data, mRenderer); -} - -TextureImpl *Context11::createTexture(const gl::TextureState &state) -{ - switch (state.getTarget()) - { - case GL_TEXTURE_2D: - return new TextureD3D_2D(state, mRenderer); - case GL_TEXTURE_CUBE_MAP: - return new TextureD3D_Cube(state, mRenderer); - case GL_TEXTURE_3D: - return new TextureD3D_3D(state, mRenderer); - case GL_TEXTURE_2D_ARRAY: - return new TextureD3D_2DArray(state, mRenderer); - case GL_TEXTURE_EXTERNAL_OES: - return new TextureD3D_External(state, mRenderer); - case GL_TEXTURE_2D_MULTISAMPLE: - return new TextureD3D_2DMultisample(state, mRenderer); - break; - default: - UNREACHABLE(); - } - - return nullptr; -} - -RenderbufferImpl *Context11::createRenderbuffer() -{ - return new RenderbufferD3D(mRenderer); -} - -BufferImpl *Context11::createBuffer(const gl::BufferState &state) -{ - Buffer11 *buffer = new Buffer11(state, mRenderer); - mRenderer->onBufferCreate(buffer); - return buffer; -} - -VertexArrayImpl *Context11::createVertexArray(const gl::VertexArrayState &data) -{ - return new VertexArray11(data); -} - -QueryImpl *Context11::createQuery(GLenum type) -{ - return new Query11(mRenderer, type); -} - -FenceNVImpl *Context11::createFenceNV() -{ - return new FenceNV11(mRenderer); -} - -SyncImpl *Context11::createSync() -{ - return new Sync11(mRenderer); -} - -TransformFeedbackImpl *Context11::createTransformFeedback(const gl::TransformFeedbackState &state) -{ - return new TransformFeedback11(state, mRenderer); -} - -SamplerImpl *Context11::createSampler(const gl::SamplerState &state) -{ - return new SamplerD3D(state); -} - -ProgramPipelineImpl *Context11::createProgramPipeline(const gl::ProgramPipelineState &data) -{ - return new ProgramPipeline11(data); -} - -std::vector<PathImpl *> Context11::createPaths(GLsizei) -{ - return std::vector<PathImpl *>(); -} - -gl::Error Context11::flush(const gl::Context *context) -{ - return mRenderer->flush(); -} - -gl::Error Context11::finish(const gl::Context *context) -{ - return mRenderer->finish(); -} - -gl::Error Context11::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count) -{ - ANGLE_TRY(prepareForDrawCall(context, mode)); - return mRenderer->drawArrays(context, mode, first, count, 0); -} - -gl::Error Context11::drawArraysInstanced(const gl::Context *context, - GLenum mode, - GLint first, - GLsizei count, - GLsizei instanceCount) -{ - ANGLE_TRY(prepareForDrawCall(context, mode)); - return mRenderer->drawArrays(context, mode, first, count, instanceCount); -} - -gl::Error Context11::drawElements(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices) -{ - ANGLE_TRY(prepareForDrawCall(context, mode)); - return mRenderer->drawElements(context, mode, count, type, indices, 0); -} - -gl::Error Context11::drawElementsInstanced(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices, - GLsizei instances) -{ - ANGLE_TRY(prepareForDrawCall(context, mode)); - return mRenderer->drawElements(context, mode, count, type, indices, instances); -} - -gl::Error Context11::drawRangeElements(const gl::Context *context, - GLenum mode, - GLuint start, - GLuint end, - GLsizei count, - GLenum type, - const void *indices) -{ - ANGLE_TRY(prepareForDrawCall(context, mode)); - return mRenderer->drawElements(context, mode, count, type, indices, 0); -} - -gl::Error Context11::drawArraysIndirect(const gl::Context *context, - GLenum mode, - const void *indirect) -{ - ANGLE_TRY(prepareForDrawCall(context, mode)); - return mRenderer->drawArraysIndirect(context, mode, indirect); -} - -gl::Error Context11::drawElementsIndirect(const gl::Context *context, - GLenum mode, - GLenum type, - const void *indirect) -{ - ANGLE_TRY(prepareForDrawCall(context, mode)); - return mRenderer->drawElementsIndirect(context, mode, type, indirect); -} - -GLenum Context11::getResetStatus() -{ - return mRenderer->getResetStatus(); -} - -std::string Context11::getVendorString() const -{ - return mRenderer->getVendorString(); -} - -std::string Context11::getRendererDescription() const -{ - return mRenderer->getRendererDescription(); -} - -void Context11::insertEventMarker(GLsizei length, const char *marker) -{ - auto optionalString = angle::WidenString(static_cast<size_t>(length), marker); - if (optionalString.valid()) - { - mRenderer->getAnnotator()->setMarker(optionalString.value().data()); - } -} - -void Context11::pushGroupMarker(GLsizei length, const char *marker) -{ - auto optionalString = angle::WidenString(static_cast<size_t>(length), marker); - if (optionalString.valid()) - { - mRenderer->getAnnotator()->beginEvent(optionalString.value().data()); - } -} - -void Context11::popGroupMarker() -{ - mRenderer->getAnnotator()->endEvent(); -} - -void Context11::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message) -{ - // Fall through to the EXT_debug_marker functions - pushGroupMarker(length, message); -} - -void Context11::popDebugGroup() -{ - // Fall through to the EXT_debug_marker functions - popGroupMarker(); -} - -void Context11::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits) -{ - mRenderer->getStateManager()->syncState(context, dirtyBits); -} - -GLint Context11::getGPUDisjoint() -{ - return mRenderer->getGPUDisjoint(); -} - -GLint64 Context11::getTimestamp() -{ - return mRenderer->getTimestamp(); -} - -void Context11::onMakeCurrent(const gl::Context *context) -{ - ANGLE_SWALLOW_ERR(mRenderer->getStateManager()->onMakeCurrent(context)); -} - -const gl::Caps &Context11::getNativeCaps() const -{ - return mRenderer->getNativeCaps(); -} - -const gl::TextureCapsMap &Context11::getNativeTextureCaps() const -{ - return mRenderer->getNativeTextureCaps(); -} - -const gl::Extensions &Context11::getNativeExtensions() const -{ - return mRenderer->getNativeExtensions(); -} - -const gl::Limitations &Context11::getNativeLimitations() const -{ - return mRenderer->getNativeLimitations(); -} - -gl::Error Context11::dispatchCompute(const gl::Context *context, - GLuint numGroupsX, - GLuint numGroupsY, - GLuint numGroupsZ) -{ - return mRenderer->dispatchCompute(context, numGroupsX, numGroupsY, numGroupsZ); -} - -gl::Error Context11::triggerDrawCallProgramRecompilation(const gl::Context *context, - GLenum drawMode) -{ - const auto &glState = context->getGLState(); - const auto *va11 = GetImplAs<VertexArray11>(glState.getVertexArray()); - const auto *drawFBO = glState.getDrawFramebuffer(); - gl::Program *program = glState.getProgram(); - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program); - - programD3D->updateCachedInputLayout(va11->getCurrentStateSerial(), glState); - programD3D->updateCachedOutputLayout(context, drawFBO); - - bool recompileVS = !programD3D->hasVertexExecutableForCachedInputLayout(); - bool recompileGS = !programD3D->hasGeometryExecutableForPrimitiveType(drawMode); - bool recompilePS = !programD3D->hasPixelExecutableForCachedOutputLayout(); - - if (!recompileVS && !recompileGS && !recompilePS) - { - return gl::NoError(); - } - - // Load the compiler if necessary and recompile the programs. - ANGLE_TRY(mRenderer->ensureHLSLCompilerInitialized()); - - gl::InfoLog infoLog; - - if (recompileVS) - { - ShaderExecutableD3D *vertexExe = nullptr; - ANGLE_TRY(programD3D->getVertexExecutableForCachedInputLayout(&vertexExe, &infoLog)); - if (!programD3D->hasVertexExecutableForCachedInputLayout()) - { - ASSERT(infoLog.getLength() > 0); - ERR() << "Dynamic recompilation error log: " << infoLog.str(); - return gl::InternalError() - << "Error compiling dynamic vertex executable:" << infoLog.str(); - } - } - - if (recompileGS) - { - ShaderExecutableD3D *geometryExe = nullptr; - ANGLE_TRY(programD3D->getGeometryExecutableForPrimitiveType(context, drawMode, &geometryExe, - &infoLog)); - if (!programD3D->hasGeometryExecutableForPrimitiveType(drawMode)) - { - ASSERT(infoLog.getLength() > 0); - ERR() << "Dynamic recompilation error log: " << infoLog.str(); - return gl::InternalError() - << "Error compiling dynamic geometry executable:" << infoLog.str(); - } - } - - if (recompilePS) - { - ShaderExecutableD3D *pixelExe = nullptr; - ANGLE_TRY(programD3D->getPixelExecutableForCachedOutputLayout(&pixelExe, &infoLog)); - if (!programD3D->hasPixelExecutableForCachedOutputLayout()) - { - ASSERT(infoLog.getLength() > 0); - ERR() << "Dynamic recompilation error log: " << infoLog.str(); - return gl::InternalError() - << "Error compiling dynamic pixel executable:" << infoLog.str(); - } - } - - // Refresh the program cache entry. - if (mMemoryProgramCache) - { - mMemoryProgramCache->updateProgram(context, program); - } - - return gl::NoError(); -} - -gl::Error Context11::prepareForDrawCall(const gl::Context *context, GLenum drawMode) -{ - ANGLE_TRY(mRenderer->getStateManager()->updateState(context, drawMode)); - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h deleted file mode 100644 index dd99111b19..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h +++ /dev/null @@ -1,155 +0,0 @@ -// -// Copyright 2016 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. -// -// Context11: -// D3D11-specific functionality associated with a GL Context. -// - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_CONTEXT11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_CONTEXT11_H_ - -#include "libANGLE/renderer/ContextImpl.h" - -namespace rx -{ -class Renderer11; - -class Context11 : public ContextImpl -{ - public: - Context11(const gl::ContextState &state, Renderer11 *renderer); - ~Context11() override; - - gl::Error initialize() override; - - // Shader creation - CompilerImpl *createCompiler() override; - ShaderImpl *createShader(const gl::ShaderState &data) override; - ProgramImpl *createProgram(const gl::ProgramState &data) override; - - // Framebuffer creation - FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override; - - // Texture creation - TextureImpl *createTexture(const gl::TextureState &state) override; - - // Renderbuffer creation - RenderbufferImpl *createRenderbuffer() override; - - // Buffer creation - BufferImpl *createBuffer(const gl::BufferState &state) override; - - // Vertex Array creation - VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override; - - // Query and Fence creation - QueryImpl *createQuery(GLenum type) override; - FenceNVImpl *createFenceNV() override; - SyncImpl *createSync() override; - - // Transform Feedback creation - TransformFeedbackImpl *createTransformFeedback( - const gl::TransformFeedbackState &state) override; - - // Sampler object creation - SamplerImpl *createSampler(const gl::SamplerState &state) override; - - // Program Pipeline object creation - ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override; - - // Path object creation. - std::vector<PathImpl *> createPaths(GLsizei) override; - - // Flush and finish. - gl::Error flush(const gl::Context *context) override; - gl::Error finish(const gl::Context *context) override; - - // Drawing methods. - gl::Error drawArrays(const gl::Context *context, - GLenum mode, - GLint first, - GLsizei count) override; - gl::Error drawArraysInstanced(const gl::Context *context, - GLenum mode, - GLint first, - GLsizei count, - GLsizei instanceCount) override; - - gl::Error drawElements(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices) override; - gl::Error drawElementsInstanced(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices, - GLsizei instances) override; - gl::Error drawRangeElements(const gl::Context *context, - GLenum mode, - GLuint start, - GLuint end, - GLsizei count, - GLenum type, - const void *indices) override; - gl::Error drawArraysIndirect(const gl::Context *context, - GLenum mode, - const void *indirect) override; - gl::Error drawElementsIndirect(const gl::Context *context, - GLenum mode, - GLenum type, - const void *indirect) override; - - // Device loss - GLenum getResetStatus() override; - - // Vendor and description strings. - std::string getVendorString() const override; - std::string getRendererDescription() const override; - - // EXT_debug_marker - void insertEventMarker(GLsizei length, const char *marker) override; - void pushGroupMarker(GLsizei length, const char *marker) override; - void popGroupMarker() override; - - // KHR_debug - void pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message) override; - void popDebugGroup() override; - - // State sync with dirty bits. - void syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits) override; - - // Disjoint timer queries - GLint getGPUDisjoint() override; - GLint64 getTimestamp() override; - - // Context switching - void onMakeCurrent(const gl::Context *context) override; - - // Caps queries - const gl::Caps &getNativeCaps() const override; - const gl::TextureCapsMap &getNativeTextureCaps() const override; - const gl::Extensions &getNativeExtensions() const override; - const gl::Limitations &getNativeLimitations() const override; - - Renderer11 *getRenderer() const { return mRenderer; } - - gl::Error dispatchCompute(const gl::Context *context, - GLuint numGroupsX, - GLuint numGroupsY, - GLuint numGroupsZ) override; - - gl::Error triggerDrawCallProgramRecompilation(const gl::Context *context, GLenum drawMode); - - private: - gl::Error prepareForDrawCall(const gl::Context *context, GLenum drawMode); - - Renderer11 *mRenderer; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_CONTEXT11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp deleted file mode 100644 index 1e70363e11..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// -// Copyright 2015 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. -// -// DebugAnnotator11.cpp: D3D11 helpers for adding trace annotations. -// - -#include "libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h" - -#include "common/debug.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -namespace rx -{ - -DebugAnnotator11::DebugAnnotator11() - : mInitialized(false), - mD3d11Module(nullptr), - mUserDefinedAnnotation(nullptr) -{ - // D3D11 devices can't be created during DllMain. - // We defer device creation until the object is actually used. -} - -DebugAnnotator11::~DebugAnnotator11() -{ - if (mInitialized) - { - SafeRelease(mUserDefinedAnnotation); - -#if !defined(ANGLE_ENABLE_WINDOWS_STORE) - FreeLibrary(mD3d11Module); -#endif // !ANGLE_ENABLE_WINDOWS_STORE - } -} - -void DebugAnnotator11::beginEvent(const wchar_t *eventName) -{ - initializeDevice(); - - if (mUserDefinedAnnotation != nullptr) - { - mUserDefinedAnnotation->BeginEvent(eventName); - } -} - -void DebugAnnotator11::endEvent() -{ - initializeDevice(); - - if (mUserDefinedAnnotation != nullptr) - { - mUserDefinedAnnotation->EndEvent(); - } -} - -void DebugAnnotator11::setMarker(const wchar_t *markerName) -{ - initializeDevice(); - - if (mUserDefinedAnnotation != nullptr) - { - mUserDefinedAnnotation->SetMarker(markerName); - } -} - -bool DebugAnnotator11::getStatus() -{ -#if defined(ANGLE_ENABLE_WINDOWS_STORE) - static_assert(NTDDI_VERSION >= NTDDI_WIN10, "GetStatus only works on Win10 and above"); - initializeDevice(); - - if (mUserDefinedAnnotation != nullptr) - { - return !!(mUserDefinedAnnotation->GetStatus()); - } - - return true; // Default if initializeDevice() failed -#else - // We can't detect GetStatus() on desktop ANGLE builds so always return true. - return true; -#endif // ANGLE_ENABLE_WINDOWS_STORE -} - -void DebugAnnotator11::initializeDevice() -{ - if (!mInitialized) - { -#if !defined(ANGLE_ENABLE_WINDOWS_STORE) - mD3d11Module = LoadLibrary(TEXT("d3d11.dll")); - ASSERT(mD3d11Module); - - PFN_D3D11_CREATE_DEVICE D3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE)GetProcAddress(mD3d11Module, "D3D11CreateDevice"); - ASSERT(D3D11CreateDevice != nullptr); -#endif // !ANGLE_ENABLE_WINDOWS_STORE - - ID3D11Device *device = nullptr; - ID3D11DeviceContext *context = nullptr; - - HRESULT hr = E_FAIL; - - // Create a D3D_DRIVER_TYPE_NULL device, which is much cheaper than other types of device. - hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_NULL, nullptr, 0, nullptr, 0, - D3D11_SDK_VERSION, &device, nullptr, &context); - ASSERT(SUCCEEDED(hr)); - if (SUCCEEDED(hr)) - { - mUserDefinedAnnotation = d3d11::DynamicCastComObject<ID3DUserDefinedAnnotation>(context); - ASSERT(mUserDefinedAnnotation != nullptr); - mInitialized = true; - } - - SafeRelease(device); - SafeRelease(context); - } -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h deleted file mode 100644 index 62662c49ae..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// Copyright 2015 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. -// -// DebugAnnotator11.h: D3D11 helpers for adding trace annotations. -// - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_DEBUGANNOTATOR11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_DEBUGANNOTATOR11_H_ - -#include "libANGLE/LoggingAnnotator.h" - -namespace rx -{ - -class DebugAnnotator11 : public angle::LoggingAnnotator -{ - public: - DebugAnnotator11(); - ~DebugAnnotator11() override; - void beginEvent(const wchar_t *eventName) override; - void endEvent() override; - void setMarker(const wchar_t *markerName) override; - bool getStatus() override; - - private: - void initializeDevice(); - - bool mInitialized; - HMODULE mD3d11Module; - ID3DUserDefinedAnnotation *mUserDefinedAnnotation; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D11_DEBUGANNOTATOR11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp deleted file mode 100644 index 082f28d794..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp +++ /dev/null @@ -1,240 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// Fence11.cpp: Defines the rx::FenceNV11 and rx::Sync11 classes which implement -// rx::FenceNVImpl and rx::SyncImpl. - -#include "libANGLE/renderer/d3d/d3d11/Fence11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" - -#include "common/utilities.h" - -namespace rx -{ - -static const int kDeviceLostCheckPeriod = 64; - -// -// Template helpers for set and test operations. -// - -template <class FenceClass> -gl::Error FenceSetHelper(FenceClass *fence) -{ - if (!fence->mQuery) - { - D3D11_QUERY_DESC queryDesc; - queryDesc.Query = D3D11_QUERY_EVENT; - queryDesc.MiscFlags = 0; - - HRESULT result = fence->mRenderer->getDevice()->CreateQuery(&queryDesc, &fence->mQuery); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to create event query, " << gl::FmtHR(result); - } - } - - fence->mRenderer->getDeviceContext()->End(fence->mQuery); - return gl::NoError(); -} - -template <class FenceClass> -gl::Error FenceTestHelper(FenceClass *fence, bool flushCommandBuffer, GLboolean *outFinished) -{ - ASSERT(fence->mQuery); - - UINT getDataFlags = (flushCommandBuffer ? 0 : D3D11_ASYNC_GETDATA_DONOTFLUSH); - HRESULT result = - fence->mRenderer->getDeviceContext()->GetData(fence->mQuery, nullptr, 0, getDataFlags); - - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to get query data, " << gl::FmtHR(result); - } - - ASSERT(result == S_OK || result == S_FALSE); - *outFinished = ((result == S_OK) ? GL_TRUE : GL_FALSE); - return gl::NoError(); -} - -// -// FenceNV11 -// - -FenceNV11::FenceNV11(Renderer11 *renderer) : FenceNVImpl(), mRenderer(renderer), mQuery(nullptr) -{ -} - -FenceNV11::~FenceNV11() -{ - SafeRelease(mQuery); -} - -gl::Error FenceNV11::set(GLenum condition) -{ - return FenceSetHelper(this); -} - -gl::Error FenceNV11::test(GLboolean *outFinished) -{ - return FenceTestHelper(this, true, outFinished); -} - -gl::Error FenceNV11::finish() -{ - GLboolean finished = GL_FALSE; - - int loopCount = 0; - while (finished != GL_TRUE) - { - loopCount++; - ANGLE_TRY(FenceTestHelper(this, true, &finished)); - - if (loopCount % kDeviceLostCheckPeriod == 0 && mRenderer->testDeviceLost()) - { - return gl::OutOfMemory() << "Device was lost while querying result of an event query."; - } - - ScheduleYield(); - } - - return gl::NoError(); -} - -// -// Sync11 -// - -// Important note on accurate timers in Windows: -// -// QueryPerformanceCounter has a few major issues, including being 10x as expensive to call -// as timeGetTime on laptops and "jumping" during certain hardware events. -// -// See the comments at the top of the Chromium source file "chromium/src/base/time/time_win.cc" -// https://code.google.com/p/chromium/codesearch#chromium/src/base/time/time_win.cc -// -// We still opt to use QPC. In the present and moving forward, most newer systems will not suffer -// from buggy implementations. - -Sync11::Sync11(Renderer11 *renderer) : SyncImpl(), mRenderer(renderer), mQuery(nullptr) -{ - LARGE_INTEGER counterFreqency = {}; - BOOL success = QueryPerformanceFrequency(&counterFreqency); - ASSERT(success); - - mCounterFrequency = counterFreqency.QuadPart; -} - -Sync11::~Sync11() -{ - SafeRelease(mQuery); -} - -gl::Error Sync11::set(GLenum condition, GLbitfield flags) -{ - ASSERT(condition == GL_SYNC_GPU_COMMANDS_COMPLETE && flags == 0); - return FenceSetHelper(this); -} - -gl::Error Sync11::clientWait(GLbitfield flags, GLuint64 timeout, GLenum *outResult) -{ - ASSERT(outResult); - - bool flushCommandBuffer = ((flags & GL_SYNC_FLUSH_COMMANDS_BIT) != 0); - - GLboolean result = GL_FALSE; - gl::Error error = FenceTestHelper(this, flushCommandBuffer, &result); - if (error.isError()) - { - *outResult = GL_WAIT_FAILED; - return error; - } - - if (result == GL_TRUE) - { - *outResult = GL_ALREADY_SIGNALED; - return gl::NoError(); - } - - if (timeout == 0) - { - *outResult = GL_TIMEOUT_EXPIRED; - return gl::NoError(); - } - - LARGE_INTEGER currentCounter = {}; - BOOL success = QueryPerformanceCounter(¤tCounter); - ASSERT(success); - - LONGLONG timeoutInSeconds = static_cast<LONGLONG>(timeout / 1000000000ull); - LONGLONG endCounter = currentCounter.QuadPart + mCounterFrequency * timeoutInSeconds; - - // Extremely unlikely, but if mCounterFrequency is large enough, endCounter can wrap - if (endCounter < currentCounter.QuadPart) - { - endCounter = MAXLONGLONG; - } - - int loopCount = 0; - while (currentCounter.QuadPart < endCounter && !result) - { - loopCount++; - ScheduleYield(); - success = QueryPerformanceCounter(¤tCounter); - ASSERT(success); - - error = FenceTestHelper(this, flushCommandBuffer, &result); - if (error.isError()) - { - *outResult = GL_WAIT_FAILED; - return error; - } - - if ((loopCount % kDeviceLostCheckPeriod) == 0 && mRenderer->testDeviceLost()) - { - *outResult = GL_WAIT_FAILED; - return gl::OutOfMemory() << "Device was lost while querying result of an event query."; - } - } - - if (currentCounter.QuadPart >= endCounter) - { - *outResult = GL_TIMEOUT_EXPIRED; - } - else - { - *outResult = GL_CONDITION_SATISFIED; - } - - return gl::NoError(); -} - -gl::Error Sync11::serverWait(GLbitfield flags, GLuint64 timeout) -{ - // Because our API is currently designed to be called from a single thread, we don't need to do - // extra work for a server-side fence. GPU commands issued after the fence is created will - // always be processed after the fence is signaled. - return gl::NoError(); -} - -gl::Error Sync11::getStatus(GLint *outResult) -{ - GLboolean result = GL_FALSE; - gl::Error error = FenceTestHelper(this, false, &result); - if (error.isError()) - { - // The spec does not specify any way to report errors during the status test (e.g. device - // lost) so we report the fence is unblocked in case of error or signaled. - *outResult = GL_SIGNALED; - - return error; - } - - *outResult = (result ? GL_SIGNALED : GL_UNSIGNALED); - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.h deleted file mode 100644 index 4168df5365..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.h +++ /dev/null @@ -1,60 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// Fence11.h: Defines the rx::FenceNV11 and rx::Sync11 classes which implement rx::FenceNVImpl -// and rx::SyncImpl. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_FENCE11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_FENCE11_H_ - -#include "libANGLE/renderer/FenceNVImpl.h" -#include "libANGLE/renderer/SyncImpl.h" - -namespace rx -{ -class Renderer11; - -class FenceNV11 : public FenceNVImpl -{ - public: - explicit FenceNV11(Renderer11 *renderer); - ~FenceNV11() override; - - gl::Error set(GLenum condition) override; - gl::Error test(GLboolean *outFinished) override; - gl::Error finish() override; - - private: - template<class T> friend gl::Error FenceSetHelper(T *fence); - template<class T> friend gl::Error FenceTestHelper(T *fence, bool flushCommandBuffer, GLboolean *outFinished); - - Renderer11 *mRenderer; - ID3D11Query *mQuery; -}; - -class Sync11 : public SyncImpl -{ - public: - explicit Sync11(Renderer11 *renderer); - ~Sync11() override; - - gl::Error set(GLenum condition, GLbitfield flags) override; - gl::Error clientWait(GLbitfield flags, GLuint64 timeout, GLenum *outResult) override; - gl::Error serverWait(GLbitfield flags, GLuint64 timeout) override; - gl::Error getStatus(GLint *outResult) override; - - private: - template<class T> friend gl::Error FenceSetHelper(T *fence); - template<class T> friend gl::Error FenceTestHelper(T *fence, bool flushCommandBuffer, GLboolean *outFinished); - - Renderer11 *mRenderer; - ID3D11Query *mQuery; - LONGLONG mCounterFrequency; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D11_FENCE11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp deleted file mode 100644 index 02326d7b50..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp +++ /dev/null @@ -1,507 +0,0 @@ -// -// 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. -// - -// Framebuffer11.cpp: Implements the Framebuffer11 class. - -#include "libANGLE/renderer/d3d/d3d11/Framebuffer11.h" - -#include "common/bitset_utils.h" -#include "common/debug.h" -#include "libANGLE/Context.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/Texture.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" -#include "libANGLE/renderer/d3d/d3d11/Buffer11.h" -#include "libANGLE/renderer/d3d/d3d11/Clear11.h" -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -using namespace angle; - -namespace rx -{ - -namespace -{ -gl::Error MarkAttachmentsDirty(const gl::Context *context, - const gl::FramebufferAttachment *attachment) -{ - if (attachment->type() == GL_TEXTURE) - { - gl::Texture *texture = attachment->getTexture(); - - TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture); - - TextureStorage *texStorage = nullptr; - ANGLE_TRY(textureD3D->getNativeTexture(context, &texStorage)); - - if (texStorage) - { - TextureStorage11 *texStorage11 = GetAs<TextureStorage11>(texStorage); - ASSERT(texStorage11); - - texStorage11->markLevelDirty(attachment->mipLevel()); - } - } - - return gl::NoError(); -} - -void UpdateCachedRenderTarget(const gl::Context *context, - const gl::FramebufferAttachment *attachment, - RenderTarget11 *&cachedRenderTarget, - OnRenderTargetDirtyBinding *channelBinding) -{ - RenderTarget11 *newRenderTarget = nullptr; - if (attachment) - { - // TODO(jmadill): Don't swallow this error. - gl::Error error = attachment->getRenderTarget(context, &newRenderTarget); - if (error.isError()) - { - ERR() << "Internal rendertarget error: " << error; - } - } - if (newRenderTarget != cachedRenderTarget) - { - OnRenderTargetDirtyChannel *channel = - (newRenderTarget ? newRenderTarget->getBroadcastChannel() : nullptr); - channelBinding->bind(channel); - cachedRenderTarget = newRenderTarget; - } -} -} // anonymous namespace - -Framebuffer11::Framebuffer11(const gl::FramebufferState &data, Renderer11 *renderer) - : FramebufferD3D(data, renderer), - mRenderer(renderer), - mCachedDepthStencilRenderTarget(nullptr), - mDepthStencilRenderTargetDirty(this, gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS) -{ - ASSERT(mRenderer != nullptr); - mCachedColorRenderTargets.fill(nullptr); - for (size_t colorIndex = 0; colorIndex < data.getColorAttachments().size(); ++colorIndex) - { - mColorRenderTargetsDirty.emplace_back(this, colorIndex); - } -} - -Framebuffer11::~Framebuffer11() -{ -} - -gl::Error Framebuffer11::markAttachmentsDirty(const gl::Context *context) const -{ - const auto &colorAttachments = mState.getColorAttachments(); - for (size_t drawBuffer : mState.getEnabledDrawBuffers()) - { - const gl::FramebufferAttachment &colorAttachment = colorAttachments[drawBuffer]; - ASSERT(colorAttachment.isAttached()); - ANGLE_TRY(MarkAttachmentsDirty(context, &colorAttachment)); - } - - const gl::FramebufferAttachment *dsAttachment = mState.getDepthOrStencilAttachment(); - if (dsAttachment) - { - ANGLE_TRY(MarkAttachmentsDirty(context, dsAttachment)); - } - - return gl::NoError(); -} - -gl::Error Framebuffer11::clearImpl(const gl::Context *context, const ClearParameters &clearParams) -{ - Clear11 *clearer = mRenderer->getClearer(); - - const gl::FramebufferAttachment *colorAttachment = mState.getFirstColorAttachment(); - if (clearParams.scissorEnabled == true && colorAttachment != nullptr && - UsePresentPathFast(mRenderer, colorAttachment)) - { - // If the current framebuffer is using the default colorbuffer, and present path fast is - // active, and the scissor rect is enabled, then we should invert the scissor rect - // vertically - ClearParameters presentPathFastClearParams = clearParams; - gl::Extents framebufferSize = colorAttachment->getSize(); - presentPathFastClearParams.scissor.y = framebufferSize.height - - presentPathFastClearParams.scissor.y - - presentPathFastClearParams.scissor.height; - ANGLE_TRY(clearer->clearFramebuffer(context, presentPathFastClearParams, mState)); - } - else - { - ANGLE_TRY(clearer->clearFramebuffer(context, clearParams, mState)); - } - - ANGLE_TRY(markAttachmentsDirty(context)); - - return gl::NoError(); -} - -gl::Error Framebuffer11::invalidate(const gl::Context *context, - size_t count, - const GLenum *attachments) -{ - return invalidateBase(context, count, attachments, false); -} - -gl::Error Framebuffer11::discard(const gl::Context *context, - size_t count, - const GLenum *attachments) -{ - return invalidateBase(context, count, attachments, true); -} - -gl::Error Framebuffer11::invalidateBase(const gl::Context *context, - size_t count, - const GLenum *attachments, - bool useEXTBehavior) const -{ - ID3D11DeviceContext1 *deviceContext1 = mRenderer->getDeviceContext1IfSupported(); - - if (!deviceContext1) - { - // DiscardView() is only supported on ID3D11DeviceContext1 - return gl::NoError(); - } - - bool foundDepth = false; - bool foundStencil = false; - - for (size_t i = 0; i < count; ++i) - { - switch (attachments[i]) - { - // Handle depth and stencil attachments. Defer discarding until later. - case GL_DEPTH_STENCIL_ATTACHMENT: - foundDepth = true; - foundStencil = true; - break; - case GL_DEPTH_EXT: - case GL_DEPTH_ATTACHMENT: - foundDepth = true; - break; - case GL_STENCIL_EXT: - case GL_STENCIL_ATTACHMENT: - foundStencil = true; - break; - default: - { - // Handle color attachments - ASSERT((attachments[i] >= GL_COLOR_ATTACHMENT0 && attachments[i] <= GL_COLOR_ATTACHMENT15) || - (attachments[i] == GL_COLOR)); - - size_t colorIndex = - (attachments[i] == GL_COLOR ? 0u : (attachments[i] - GL_COLOR_ATTACHMENT0)); - const gl::FramebufferAttachment *colorAttachment = - mState.getColorAttachment(colorIndex); - if (colorAttachment) - { - ANGLE_TRY(invalidateAttachment(context, colorAttachment)); - } - break; - } - } - } - - bool discardDepth = false; - bool discardStencil = false; - - // The D3D11 renderer uses the same view for depth and stencil buffers, so we must be careful. - if (useEXTBehavior) - { - // In the extension, if the app discards only one of the depth and stencil attachments, but - // those are backed by the same packed_depth_stencil buffer, then both images become undefined. - discardDepth = foundDepth; - - // Don't bother discarding the stencil buffer if the depth buffer will already do it - discardStencil = foundStencil && (!discardDepth || mState.getDepthAttachment() == nullptr); - } - else - { - // In ES 3.0.4, if a specified attachment has base internal format DEPTH_STENCIL but the - // attachments list does not include DEPTH_STENCIL_ATTACHMENT or both DEPTH_ATTACHMENT and - // STENCIL_ATTACHMENT, then only the specified portion of every pixel in the subregion of pixels - // of the DEPTH_STENCIL buffer may be invalidated, and the other portion must be preserved. - discardDepth = (foundDepth && foundStencil) || - (foundDepth && (mState.getStencilAttachment() == nullptr)); - discardStencil = (foundStencil && (mState.getDepthAttachment() == nullptr)); - } - - if (discardDepth && mState.getDepthAttachment()) - { - ANGLE_TRY(invalidateAttachment(context, mState.getDepthAttachment())); - } - - if (discardStencil && mState.getStencilAttachment()) - { - ANGLE_TRY(invalidateAttachment(context, mState.getStencilAttachment())); - } - - return gl::NoError(); -} - -gl::Error Framebuffer11::invalidateSub(const gl::Context *context, - size_t, - const GLenum *, - const gl::Rectangle &) -{ - // A no-op implementation conforms to the spec, so don't call UNIMPLEMENTED() - return gl::NoError(); -} - -gl::Error Framebuffer11::invalidateAttachment(const gl::Context *context, - const gl::FramebufferAttachment *attachment) const -{ - ID3D11DeviceContext1 *deviceContext1 = mRenderer->getDeviceContext1IfSupported(); - ASSERT(deviceContext1); - ASSERT(attachment && attachment->isAttached()); - - RenderTarget11 *renderTarget = nullptr; - ANGLE_TRY(attachment->getRenderTarget(context, &renderTarget)); - const auto &rtv = renderTarget->getRenderTargetView(); - - if (rtv.valid()) - { - deviceContext1->DiscardView(rtv.get()); - } - - return gl::NoError(); -} - -gl::Error Framebuffer11::readPixelsImpl(const gl::Context *context, - const gl::Rectangle &area, - GLenum format, - GLenum type, - size_t outputPitch, - const gl::PixelPackState &pack, - uint8_t *pixels) -{ - const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment(); - ASSERT(readAttachment); - - gl::Buffer *packBuffer = context->getGLState().getTargetBuffer(gl::BufferBinding::PixelPack); - if (packBuffer != nullptr) - { - Buffer11 *packBufferStorage = GetImplAs<Buffer11>(packBuffer); - PackPixelsParams packParams(area, format, type, static_cast<GLuint>(outputPitch), pack, - packBuffer, reinterpret_cast<ptrdiff_t>(pixels)); - - return packBufferStorage->packPixels(context, *readAttachment, packParams); - } - - return mRenderer->readFromAttachment(context, *readAttachment, area, format, type, - static_cast<GLuint>(outputPitch), pack, pixels); -} - -gl::Error Framebuffer11::blitImpl(const gl::Context *context, - const gl::Rectangle &sourceArea, - const gl::Rectangle &destArea, - const gl::Rectangle *scissor, - bool blitRenderTarget, - bool blitDepth, - bool blitStencil, - GLenum filter, - const gl::Framebuffer *sourceFramebuffer) -{ - if (blitRenderTarget) - { - const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getReadColorbuffer(); - ASSERT(readBuffer); - - RenderTargetD3D *readRenderTarget = nullptr; - ANGLE_TRY(readBuffer->getRenderTarget(context, &readRenderTarget)); - ASSERT(readRenderTarget); - - const auto &colorAttachments = mState.getColorAttachments(); - const auto &drawBufferStates = mState.getDrawBufferStates(); - - for (size_t colorAttachment = 0; colorAttachment < colorAttachments.size(); colorAttachment++) - { - const gl::FramebufferAttachment &drawBuffer = colorAttachments[colorAttachment]; - - if (drawBuffer.isAttached() && - drawBufferStates[colorAttachment] != GL_NONE) - { - RenderTargetD3D *drawRenderTarget = nullptr; - ANGLE_TRY(drawBuffer.getRenderTarget(context, &drawRenderTarget)); - ASSERT(drawRenderTarget); - - const bool invertColorSource = UsePresentPathFast(mRenderer, readBuffer); - gl::Rectangle actualSourceArea = sourceArea; - if (invertColorSource) - { - RenderTarget11 *readRenderTarget11 = GetAs<RenderTarget11>(readRenderTarget); - actualSourceArea.y = readRenderTarget11->getHeight() - sourceArea.y; - actualSourceArea.height = -sourceArea.height; - } - - const bool invertColorDest = UsePresentPathFast(mRenderer, &drawBuffer); - gl::Rectangle actualDestArea = destArea; - if (invertColorDest) - { - RenderTarget11 *drawRenderTarget11 = GetAs<RenderTarget11>(drawRenderTarget); - actualDestArea.y = drawRenderTarget11->getHeight() - destArea.y; - actualDestArea.height = -destArea.height; - } - - ANGLE_TRY(mRenderer->blitRenderbufferRect( - context, actualSourceArea, actualDestArea, readRenderTarget, drawRenderTarget, - filter, scissor, blitRenderTarget, false, false)); - } - } - } - - if (blitDepth || blitStencil) - { - const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getDepthOrStencilbuffer(); - ASSERT(readBuffer); - - RenderTargetD3D *readRenderTarget = nullptr; - ANGLE_TRY(readBuffer->getRenderTarget(context, &readRenderTarget)); - ASSERT(readRenderTarget); - - const gl::FramebufferAttachment *drawBuffer = mState.getDepthOrStencilAttachment(); - ASSERT(drawBuffer); - - RenderTargetD3D *drawRenderTarget = nullptr; - ANGLE_TRY(drawBuffer->getRenderTarget(context, &drawRenderTarget)); - ASSERT(drawRenderTarget); - - ANGLE_TRY(mRenderer->blitRenderbufferRect(context, sourceArea, destArea, readRenderTarget, - drawRenderTarget, filter, scissor, false, - blitDepth, blitStencil)); - } - - ANGLE_TRY(markAttachmentsDirty(context)); - return gl::NoError(); -} - -GLenum Framebuffer11::getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const -{ - RenderTarget11 *renderTarget11 = GetAs<RenderTarget11>(renderTarget); - return renderTarget11->getFormatSet().format().fboImplementationInternalFormat; -} - -void Framebuffer11::updateColorRenderTarget(const gl::Context *context, size_t colorIndex) -{ - UpdateCachedRenderTarget(context, mState.getColorAttachment(colorIndex), - mCachedColorRenderTargets[colorIndex], - &mColorRenderTargetsDirty[colorIndex]); -} - -void Framebuffer11::updateDepthStencilRenderTarget(const gl::Context *context) -{ - UpdateCachedRenderTarget(context, mState.getDepthOrStencilAttachment(), - mCachedDepthStencilRenderTarget, &mDepthStencilRenderTargetDirty); -} - -void Framebuffer11::syncState(const gl::Context *context, - const gl::Framebuffer::DirtyBits &dirtyBits) -{ - const auto &mergedDirtyBits = dirtyBits | mInternalDirtyBits; - mInternalDirtyBits.reset(); - - for (auto dirtyBit : mergedDirtyBits) - { - switch (dirtyBit) - { - case gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT: - case gl::Framebuffer::DIRTY_BIT_STENCIL_ATTACHMENT: - updateDepthStencilRenderTarget(context); - break; - case gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS: - case gl::Framebuffer::DIRTY_BIT_READ_BUFFER: - break; - case gl::Framebuffer::DIRTY_BIT_DEFAULT_WIDTH: - case gl::Framebuffer::DIRTY_BIT_DEFAULT_HEIGHT: - case gl::Framebuffer::DIRTY_BIT_DEFAULT_SAMPLES: - case gl::Framebuffer::DIRTY_BIT_DEFAULT_FIXED_SAMPLE_LOCATIONS: - break; - default: - { - ASSERT(gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 == 0 && - dirtyBit < gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX); - size_t colorIndex = - static_cast<size_t>(dirtyBit - gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0); - updateColorRenderTarget(context, colorIndex); - break; - } - } - } - - // We should not have dirtied any additional state during our sync. - ASSERT(!mInternalDirtyBits.any()); - - FramebufferD3D::syncState(context, dirtyBits); - - // Call this last to allow the state manager to take advantage of the cached render targets. - mRenderer->getStateManager()->invalidateRenderTarget(); - - // Call this to syncViewport for framebuffer default parameters. - if (mState.getDefaultWidth() != 0 || mState.getDefaultHeight() != 0) - { - mRenderer->getStateManager()->invalidateViewport(context); - } -} - -void Framebuffer11::signal(size_t channelID, const gl::Context *context) -{ - if (channelID == gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS) - { - // Stencil is redundant in this case. - mInternalDirtyBits.set(gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT); - mCachedDepthStencilRenderTarget = nullptr; - } - else - { - mInternalDirtyBits.set(gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 + channelID); - mCachedColorRenderTargets[channelID] = nullptr; - } - - // Notify the context we need to re-validate the RenderTarget. - // TODO(jmadill): Check that we're the active draw framebuffer. - mRenderer->getStateManager()->invalidateRenderTarget(); -} - -gl::Error Framebuffer11::getSamplePosition(size_t index, GLfloat *xy) const -{ - const gl::FramebufferAttachment *attachment = mState.getFirstNonNullAttachment(); - ASSERT(attachment); - GLsizei sampleCount = attachment->getSamples(); - - d3d11_gl::GetSamplePosition(sampleCount, index, xy); - return gl::NoError(); -} - -bool Framebuffer11::hasAnyInternalDirtyBit() const -{ - return mInternalDirtyBits.any(); -} - -void Framebuffer11::syncInternalState(const gl::Context *context) -{ - syncState(context, gl::Framebuffer::DirtyBits()); -} - -RenderTarget11 *Framebuffer11::getFirstRenderTarget() const -{ - ASSERT(mInternalDirtyBits.none()); - for (auto *renderTarget : mCachedColorRenderTargets) - { - if (renderTarget) - { - return renderTarget; - } - } - - return mCachedDepthStencilRenderTarget; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h deleted file mode 100644 index afdda299b9..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h +++ /dev/null @@ -1,104 +0,0 @@ -// -// 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. -// - -// Framebuffer11.h: Defines the Framebuffer11 class. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_FRAMBUFFER11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_FRAMBUFFER11_H_ - -#include "libANGLE/renderer/d3d/FramebufferD3D.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/signal_utils.h" - -namespace rx -{ -class Renderer11; - -class Framebuffer11 : public FramebufferD3D, public OnRenderTargetDirtyReceiver -{ - public: - Framebuffer11(const gl::FramebufferState &data, Renderer11 *renderer); - ~Framebuffer11() override; - - gl::Error discard(const gl::Context *context, size_t count, const GLenum *attachments) override; - gl::Error invalidate(const gl::Context *context, - size_t count, - const GLenum *attachments) override; - gl::Error invalidateSub(const gl::Context *context, - size_t count, - const GLenum *attachments, - const gl::Rectangle &area) override; - - // Invalidate the cached swizzles of all bound texture attachments. - gl::Error markAttachmentsDirty(const gl::Context *context) const; - - void syncState(const gl::Context *context, - const gl::Framebuffer::DirtyBits &dirtyBits) override; - - const RenderTargetArray &getCachedColorRenderTargets() const - { - return mCachedColorRenderTargets; - } - const RenderTarget11 *getCachedDepthStencilRenderTarget() const - { - return mCachedDepthStencilRenderTarget; - } - - RenderTarget11 *getFirstRenderTarget() const; - - bool hasAnyInternalDirtyBit() const; - void syncInternalState(const gl::Context *context); - - void signal(size_t channelID, const gl::Context *context) override; - - gl::Error getSamplePosition(size_t index, GLfloat *xy) const override; - - private: - gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) override; - - gl::Error readPixelsImpl(const gl::Context *context, - const gl::Rectangle &area, - GLenum format, - GLenum type, - size_t outputPitch, - const gl::PixelPackState &pack, - uint8_t *pixels) override; - - gl::Error blitImpl(const gl::Context *context, - const gl::Rectangle &sourceArea, - const gl::Rectangle &destArea, - const gl::Rectangle *scissor, - bool blitRenderTarget, - bool blitDepth, - bool blitStencil, - GLenum filter, - const gl::Framebuffer *sourceFramebuffer) override; - - gl::Error invalidateBase(const gl::Context *context, - size_t count, - const GLenum *attachments, - bool useEXTBehavior) const; - gl::Error invalidateAttachment(const gl::Context *context, - const gl::FramebufferAttachment *attachment) const; - - GLenum getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const override; - - void updateColorRenderTarget(const gl::Context *context, size_t colorIndex); - void updateDepthStencilRenderTarget(const gl::Context *context); - - Renderer11 *const mRenderer; - RenderTargetArray mCachedColorRenderTargets; - RenderTarget11 *mCachedDepthStencilRenderTarget; - - std::vector<OnRenderTargetDirtyBinding> mColorRenderTargetsDirty; - OnRenderTargetDirtyBinding mDepthStencilRenderTargetDirty; - - gl::Framebuffer::DirtyBits mInternalDirtyBits; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D11_FRAMBUFFER11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp deleted file mode 100644 index bd921f1935..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp +++ /dev/null @@ -1,657 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// Image11.h: Implements the rx::Image11 class, which acts as the interface to -// the actual underlying resources of a Texture - -#include "libANGLE/renderer/d3d/d3d11/Image11.h" - -#include "common/utilities.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" -#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h" - -namespace rx -{ - -Image11::Image11(Renderer11 *renderer) - : mRenderer(renderer), - mDXGIFormat(DXGI_FORMAT_UNKNOWN), - mStagingTexture(), - mStagingSubresource(0), - mRecoverFromStorage(false), - mAssociatedStorage(nullptr), - mAssociatedImageIndex(gl::ImageIndex::MakeInvalid()), - mRecoveredFromStorageCount(0) -{ -} - -Image11::~Image11() -{ - disassociateStorage(); - releaseStagingTexture(); -} - -// static -gl::Error Image11::GenerateMipmap(const gl::Context *context, - Image11 *dest, - Image11 *src, - const Renderer11DeviceCaps &rendererCaps) -{ - ASSERT(src->getDXGIFormat() == dest->getDXGIFormat()); - ASSERT(src->getWidth() == 1 || src->getWidth() / 2 == dest->getWidth()); - ASSERT(src->getHeight() == 1 || src->getHeight() / 2 == dest->getHeight()); - - D3D11_MAPPED_SUBRESOURCE destMapped; - ANGLE_TRY(dest->map(context, D3D11_MAP_WRITE, &destMapped)); - - D3D11_MAPPED_SUBRESOURCE srcMapped; - gl::Error error = src->map(context, D3D11_MAP_READ, &srcMapped); - if (error.isError()) - { - dest->unmap(); - return error; - } - - const uint8_t *sourceData = reinterpret_cast<const uint8_t *>(srcMapped.pData); - uint8_t *destData = reinterpret_cast<uint8_t *>(destMapped.pData); - - auto mipGenerationFunction = - d3d11::Format::Get(src->getInternalFormat(), rendererCaps).format().mipGenerationFunction; - mipGenerationFunction(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, - srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, - destMapped.DepthPitch); - - dest->unmap(); - src->unmap(); - - dest->markDirty(); - - return gl::NoError(); -} - -// static -gl::Error Image11::CopyImage(const gl::Context *context, - Image11 *dest, - Image11 *source, - const gl::Rectangle &sourceRect, - const gl::Offset &destOffset, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - const Renderer11DeviceCaps &rendererCaps) -{ - D3D11_MAPPED_SUBRESOURCE destMapped; - ANGLE_TRY(dest->map(context, D3D11_MAP_WRITE, &destMapped)); - - D3D11_MAPPED_SUBRESOURCE srcMapped; - gl::Error error = source->map(context, D3D11_MAP_READ, &srcMapped); - if (error.isError()) - { - dest->unmap(); - return error; - } - - const auto &sourceFormat = - d3d11::Format::Get(source->getInternalFormat(), rendererCaps).format(); - GLuint sourcePixelBytes = - gl::GetSizedInternalFormatInfo(sourceFormat.fboImplementationInternalFormat).pixelBytes; - - GLenum destUnsizedFormat = gl::GetUnsizedFormat(dest->getInternalFormat()); - const auto &destFormat = d3d11::Format::Get(dest->getInternalFormat(), rendererCaps).format(); - const auto &destFormatInfo = - gl::GetSizedInternalFormatInfo(destFormat.fboImplementationInternalFormat); - GLuint destPixelBytes = destFormatInfo.pixelBytes; - - const uint8_t *sourceData = reinterpret_cast<const uint8_t *>(srcMapped.pData) + - sourceRect.x * sourcePixelBytes + sourceRect.y * srcMapped.RowPitch; - uint8_t *destData = reinterpret_cast<uint8_t *>(destMapped.pData) + - destOffset.x * destPixelBytes + destOffset.y * destMapped.RowPitch; - - CopyImageCHROMIUM(sourceData, srcMapped.RowPitch, sourcePixelBytes, - sourceFormat.colorReadFunction, destData, destMapped.RowPitch, destPixelBytes, - destFormat.colorWriteFunction, destUnsizedFormat, - destFormatInfo.componentType, sourceRect.width, sourceRect.height, - unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha); - - dest->unmap(); - source->unmap(); - - dest->markDirty(); - - return gl::NoError(); -} - -bool Image11::isDirty() const -{ - // If mDirty is true AND mStagingTexture doesn't exist AND mStagingTexture doesn't need to be - // recovered from TextureStorage AND the texture doesn't require init data (i.e. a blank new - // texture will suffice) AND robust resource initialization is not enabled then isDirty should - // still return false. - if (mDirty && !mStagingTexture.valid() && !mRecoverFromStorage) - { - const Renderer11DeviceCaps &deviceCaps = mRenderer->getRenderer11DeviceCaps(); - const auto &formatInfo = d3d11::Format::Get(mInternalFormat, deviceCaps); - if (formatInfo.dataInitializerFunction == nullptr) - { - return false; - } - } - - return mDirty; -} - -gl::Error Image11::copyToStorage(const gl::Context *context, - TextureStorage *storage, - const gl::ImageIndex &index, - const gl::Box ®ion) -{ - TextureStorage11 *storage11 = GetAs<TextureStorage11>(storage); - - // If an app's behavior results in an Image11 copying its data to/from to a TextureStorage - // multiple times, then we should just keep the staging texture around to prevent the copying - // from impacting perf. We allow the Image11 to copy its data to/from TextureStorage once. This - // accounts for an app making a late call to glGenerateMipmap. - bool attemptToReleaseStagingTexture = (mRecoveredFromStorageCount < 2); - - if (attemptToReleaseStagingTexture) - { - // If another image is relying on this Storage for its data, then we must let it recover its - // data before we overwrite it. - ANGLE_TRY(storage11->releaseAssociatedImage(context, index, this)); - } - - const TextureHelper11 *stagingTexture = nullptr; - unsigned int stagingSubresourceIndex = 0; - ANGLE_TRY(getStagingTexture(&stagingTexture, &stagingSubresourceIndex)); - ANGLE_TRY(storage11->updateSubresourceLevel(context, *stagingTexture, stagingSubresourceIndex, - index, region)); - - // Once the image data has been copied into the Storage, we can release it locally. - if (attemptToReleaseStagingTexture) - { - storage11->associateImage(this, index); - releaseStagingTexture(); - mRecoverFromStorage = true; - mAssociatedStorage = storage11; - mAssociatedImageIndex = index; - } - - return gl::NoError(); -} - -void Image11::verifyAssociatedStorageValid(TextureStorage11 *textureStorage) const -{ - ASSERT(mAssociatedStorage == textureStorage); -} - -gl::Error Image11::recoverFromAssociatedStorage(const gl::Context *context) -{ - if (mRecoverFromStorage) - { - ANGLE_TRY(createStagingTexture()); - - mAssociatedStorage->verifyAssociatedImageValid(mAssociatedImageIndex, this); - - // CopySubResource from the Storage to the Staging texture - gl::Box region(0, 0, 0, mWidth, mHeight, mDepth); - ANGLE_TRY(mAssociatedStorage->copySubresourceLevel( - context, mStagingTexture, mStagingSubresource, mAssociatedImageIndex, region)); - mRecoveredFromStorageCount += 1; - - // Reset all the recovery parameters, even if the texture storage association is broken. - disassociateStorage(); - } - - return gl::NoError(); -} - -void Image11::disassociateStorage() -{ - if (mRecoverFromStorage) - { - // Make the texturestorage release the Image11 too - mAssociatedStorage->disassociateImage(mAssociatedImageIndex, this); - - mRecoverFromStorage = false; - mAssociatedStorage = nullptr; - mAssociatedImageIndex = gl::ImageIndex::MakeInvalid(); - } -} - -bool Image11::redefine(GLenum target, - GLenum internalformat, - const gl::Extents &size, - bool forceRelease) -{ - if (mWidth != size.width || mHeight != size.height || mInternalFormat != internalformat || - forceRelease) - { - // End the association with the TextureStorage, since that data will be out of date. - // Also reset mRecoveredFromStorageCount since this Image is getting completely redefined. - disassociateStorage(); - mRecoveredFromStorageCount = 0; - - mWidth = size.width; - mHeight = size.height; - mDepth = size.depth; - mInternalFormat = internalformat; - mTarget = target; - - // compute the d3d format that will be used - const d3d11::Format &formatInfo = - d3d11::Format::Get(internalformat, mRenderer->getRenderer11DeviceCaps()); - mDXGIFormat = formatInfo.texFormat; - mRenderable = (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN); - - releaseStagingTexture(); - mDirty = (formatInfo.dataInitializerFunction != nullptr); - - return true; - } - - return false; -} - -DXGI_FORMAT Image11::getDXGIFormat() const -{ - // this should only happen if the image hasn't been redefined first - // which would be a bug by the caller - ASSERT(mDXGIFormat != DXGI_FORMAT_UNKNOWN); - - return mDXGIFormat; -} - -// Store the pixel rectangle designated by xoffset,yoffset,width,height with pixels stored as -// format/type at input -// into the target pixel rectangle. -gl::Error Image11::loadData(const gl::Context *context, - const gl::Box &area, - const gl::PixelUnpackState &unpack, - GLenum type, - const void *input, - bool applySkipImages) -{ - const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(mInternalFormat); - GLuint inputRowPitch = 0; - ANGLE_TRY_RESULT( - formatInfo.computeRowPitch(type, area.width, unpack.alignment, unpack.rowLength), - inputRowPitch); - GLuint inputDepthPitch = 0; - ANGLE_TRY_RESULT(formatInfo.computeDepthPitch(area.height, unpack.imageHeight, inputRowPitch), - inputDepthPitch); - GLuint inputSkipBytes = 0; - ANGLE_TRY_RESULT( - formatInfo.computeSkipBytes(inputRowPitch, inputDepthPitch, unpack, applySkipImages), - inputSkipBytes); - - const d3d11::DXGIFormatSize &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(mDXGIFormat); - GLuint outputPixelSize = dxgiFormatInfo.pixelBytes; - - const d3d11::Format &d3dFormatInfo = - d3d11::Format::Get(mInternalFormat, mRenderer->getRenderer11DeviceCaps()); - LoadImageFunction loadFunction = d3dFormatInfo.getLoadFunctions()(type).loadFunction; - - D3D11_MAPPED_SUBRESOURCE mappedImage; - ANGLE_TRY(map(context, D3D11_MAP_WRITE, &mappedImage)); - - uint8_t *offsetMappedData = (reinterpret_cast<uint8_t *>(mappedImage.pData) + - (area.y * mappedImage.RowPitch + area.x * outputPixelSize + - area.z * mappedImage.DepthPitch)); - loadFunction(area.width, area.height, area.depth, - reinterpret_cast<const uint8_t *>(input) + inputSkipBytes, inputRowPitch, - inputDepthPitch, offsetMappedData, mappedImage.RowPitch, mappedImage.DepthPitch); - - unmap(); - - return gl::NoError(); -} - -gl::Error Image11::loadCompressedData(const gl::Context *context, - const gl::Box &area, - const void *input) -{ - const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(mInternalFormat); - GLsizei inputRowPitch = 0; - ANGLE_TRY_RESULT(formatInfo.computeRowPitch(GL_UNSIGNED_BYTE, area.width, 1, 0), inputRowPitch); - GLsizei inputDepthPitch = 0; - ANGLE_TRY_RESULT(formatInfo.computeDepthPitch(area.height, 0, inputRowPitch), inputDepthPitch); - - const d3d11::DXGIFormatSize &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(mDXGIFormat); - GLuint outputPixelSize = dxgiFormatInfo.pixelBytes; - GLuint outputBlockWidth = dxgiFormatInfo.blockWidth; - GLuint outputBlockHeight = dxgiFormatInfo.blockHeight; - - ASSERT(area.x % outputBlockWidth == 0); - ASSERT(area.y % outputBlockHeight == 0); - - const d3d11::Format &d3dFormatInfo = - d3d11::Format::Get(mInternalFormat, mRenderer->getRenderer11DeviceCaps()); - LoadImageFunction loadFunction = - d3dFormatInfo.getLoadFunctions()(GL_UNSIGNED_BYTE).loadFunction; - - D3D11_MAPPED_SUBRESOURCE mappedImage; - ANGLE_TRY(map(context, D3D11_MAP_WRITE, &mappedImage)); - - uint8_t *offsetMappedData = - reinterpret_cast<uint8_t *>(mappedImage.pData) + - ((area.y / outputBlockHeight) * mappedImage.RowPitch + - (area.x / outputBlockWidth) * outputPixelSize + area.z * mappedImage.DepthPitch); - - loadFunction(area.width, area.height, area.depth, reinterpret_cast<const uint8_t *>(input), - inputRowPitch, inputDepthPitch, offsetMappedData, mappedImage.RowPitch, - mappedImage.DepthPitch); - - unmap(); - - return gl::NoError(); -} - -gl::Error Image11::copyFromTexStorage(const gl::Context *context, - const gl::ImageIndex &imageIndex, - TextureStorage *source) -{ - TextureStorage11 *storage11 = GetAs<TextureStorage11>(source); - - const TextureHelper11 *textureHelper = nullptr; - ANGLE_TRY(storage11->getResource(context, &textureHelper)); - - UINT subresourceIndex = storage11->getSubresourceIndex(imageIndex); - - gl::Box sourceBox(0, 0, 0, mWidth, mHeight, mDepth); - return copyWithoutConversion(gl::Offset(), sourceBox, *textureHelper, subresourceIndex); -} - -gl::Error Image11::copyFromFramebuffer(const gl::Context *context, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *sourceFBO) -{ - const gl::FramebufferAttachment *srcAttachment = sourceFBO->getReadColorbuffer(); - ASSERT(srcAttachment); - - GLenum sourceInternalFormat = srcAttachment->getFormat().info->sizedInternalFormat; - const auto &d3d11Format = - d3d11::Format::Get(sourceInternalFormat, mRenderer->getRenderer11DeviceCaps()); - - if (d3d11Format.texFormat == mDXGIFormat && sourceInternalFormat == mInternalFormat) - { - RenderTarget11 *rt11 = nullptr; - ANGLE_TRY(srcAttachment->getRenderTarget(context, &rt11)); - ASSERT(rt11->getTexture().get()); - - TextureHelper11 textureHelper = rt11->getTexture(); - unsigned int sourceSubResource = rt11->getSubresourceIndex(); - - gl::Box sourceBox(sourceArea.x, sourceArea.y, 0, sourceArea.width, sourceArea.height, 1); - return copyWithoutConversion(destOffset, sourceBox, textureHelper, sourceSubResource); - } - - // This format requires conversion, so we must copy the texture to staging and manually convert - // via readPixels - D3D11_MAPPED_SUBRESOURCE mappedImage; - ANGLE_TRY(map(context, D3D11_MAP_WRITE, &mappedImage)); - - // determine the offset coordinate into the destination buffer - const auto &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(mDXGIFormat); - GLsizei rowOffset = dxgiFormatInfo.pixelBytes * destOffset.x; - - uint8_t *dataOffset = static_cast<uint8_t *>(mappedImage.pData) + - mappedImage.RowPitch * destOffset.y + rowOffset + - destOffset.z * mappedImage.DepthPitch; - - const gl::InternalFormat &destFormatInfo = gl::GetSizedInternalFormatInfo(mInternalFormat); - const auto &destD3D11Format = - d3d11::Format::Get(mInternalFormat, mRenderer->getRenderer11DeviceCaps()); - - auto loadFunction = destD3D11Format.getLoadFunctions()(destFormatInfo.type); - gl::Error error = gl::NoError(); - if (loadFunction.requiresConversion) - { - size_t bufferSize = destFormatInfo.pixelBytes * sourceArea.width * sourceArea.height; - angle::MemoryBuffer *memoryBuffer = nullptr; - error = mRenderer->getScratchMemoryBuffer(bufferSize, &memoryBuffer); - - if (!error.isError()) - { - GLuint memoryBufferRowPitch = destFormatInfo.pixelBytes * sourceArea.width; - - error = mRenderer->readFromAttachment( - context, *srcAttachment, sourceArea, destFormatInfo.format, destFormatInfo.type, - memoryBufferRowPitch, gl::PixelPackState(), memoryBuffer->data()); - - loadFunction.loadFunction(sourceArea.width, sourceArea.height, 1, memoryBuffer->data(), - memoryBufferRowPitch, 0, dataOffset, mappedImage.RowPitch, - mappedImage.DepthPitch); - } - } - else - { - error = mRenderer->readFromAttachment( - context, *srcAttachment, sourceArea, destFormatInfo.format, destFormatInfo.type, - mappedImage.RowPitch, gl::PixelPackState(), dataOffset); - } - - unmap(); - mDirty = true; - - return error; -} - -gl::Error Image11::copyWithoutConversion(const gl::Offset &destOffset, - const gl::Box &sourceArea, - const TextureHelper11 &textureHelper, - UINT sourceSubResource) -{ - // No conversion needed-- use copyback fastpath - const TextureHelper11 *stagingTexture = nullptr; - unsigned int stagingSubresourceIndex = 0; - ANGLE_TRY(getStagingTexture(&stagingTexture, &stagingSubresourceIndex)); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - const gl::Extents &extents = textureHelper.getExtents(); - - D3D11_BOX srcBox; - srcBox.left = sourceArea.x; - srcBox.right = sourceArea.x + sourceArea.width; - srcBox.top = sourceArea.y; - srcBox.bottom = sourceArea.y + sourceArea.height; - srcBox.front = sourceArea.z; - srcBox.back = sourceArea.z + sourceArea.depth; - - if (textureHelper.is2D() && textureHelper.getSampleCount() > 1) - { - D3D11_TEXTURE2D_DESC resolveDesc; - resolveDesc.Width = extents.width; - resolveDesc.Height = extents.height; - resolveDesc.MipLevels = 1; - resolveDesc.ArraySize = 1; - resolveDesc.Format = textureHelper.getFormat(); - resolveDesc.SampleDesc.Count = 1; - resolveDesc.SampleDesc.Quality = 0; - resolveDesc.Usage = D3D11_USAGE_DEFAULT; - resolveDesc.BindFlags = 0; - resolveDesc.CPUAccessFlags = 0; - resolveDesc.MiscFlags = 0; - - d3d11::Texture2D resolveTex; - ANGLE_TRY(mRenderer->allocateResource(resolveDesc, &resolveTex)); - - deviceContext->ResolveSubresource(resolveTex.get(), 0, textureHelper.get(), - sourceSubResource, textureHelper.getFormat()); - - deviceContext->CopySubresourceRegion(stagingTexture->get(), stagingSubresourceIndex, - destOffset.x, destOffset.y, destOffset.z, - resolveTex.get(), 0, &srcBox); - } - else - { - deviceContext->CopySubresourceRegion(stagingTexture->get(), stagingSubresourceIndex, - destOffset.x, destOffset.y, destOffset.z, - textureHelper.get(), sourceSubResource, &srcBox); - } - - mDirty = true; - return gl::NoError(); -} - -gl::Error Image11::getStagingTexture(const TextureHelper11 **outStagingTexture, - unsigned int *outSubresourceIndex) -{ - ANGLE_TRY(createStagingTexture()); - - *outStagingTexture = &mStagingTexture; - *outSubresourceIndex = mStagingSubresource; - return gl::NoError(); -} - -void Image11::releaseStagingTexture() -{ - mStagingTexture.reset(); -} - -gl::Error Image11::createStagingTexture() -{ - if (mStagingTexture.valid()) - { - return gl::NoError(); - } - - ASSERT(mWidth > 0 && mHeight > 0 && mDepth > 0); - - const DXGI_FORMAT dxgiFormat = getDXGIFormat(); - const auto &formatInfo = - d3d11::Format::Get(mInternalFormat, mRenderer->getRenderer11DeviceCaps()); - - int lodOffset = 1; - GLsizei width = mWidth; - GLsizei height = mHeight; - - // adjust size if needed for compressed textures - d3d11::MakeValidSize(false, dxgiFormat, &width, &height, &lodOffset); - - if (mTarget == GL_TEXTURE_3D) - { - D3D11_TEXTURE3D_DESC desc; - desc.Width = width; - desc.Height = height; - desc.Depth = mDepth; - desc.MipLevels = lodOffset + 1; - desc.Format = dxgiFormat; - desc.Usage = D3D11_USAGE_STAGING; - desc.BindFlags = 0; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; - desc.MiscFlags = 0; - - if (formatInfo.dataInitializerFunction != nullptr) - { - std::vector<D3D11_SUBRESOURCE_DATA> initialData; - std::vector<std::vector<BYTE>> textureData; - d3d11::GenerateInitialTextureData(mInternalFormat, mRenderer->getRenderer11DeviceCaps(), - width, height, mDepth, lodOffset + 1, &initialData, - &textureData); - - ANGLE_TRY( - mRenderer->allocateTexture(desc, formatInfo, initialData.data(), &mStagingTexture)); - } - else - { - ANGLE_TRY(mRenderer->allocateTexture(desc, formatInfo, &mStagingTexture)); - } - - mStagingTexture.setDebugName("Image11::StagingTexture3D"); - mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1); - } - else if (mTarget == GL_TEXTURE_2D || mTarget == GL_TEXTURE_2D_ARRAY || - mTarget == GL_TEXTURE_CUBE_MAP) - { - D3D11_TEXTURE2D_DESC desc; - desc.Width = width; - desc.Height = height; - desc.MipLevels = lodOffset + 1; - desc.ArraySize = 1; - desc.Format = dxgiFormat; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_STAGING; - desc.BindFlags = 0; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; - desc.MiscFlags = 0; - - if (formatInfo.dataInitializerFunction != nullptr) - { - std::vector<D3D11_SUBRESOURCE_DATA> initialData; - std::vector<std::vector<BYTE>> textureData; - d3d11::GenerateInitialTextureData(mInternalFormat, mRenderer->getRenderer11DeviceCaps(), - width, height, 1, lodOffset + 1, &initialData, - &textureData); - - ANGLE_TRY( - mRenderer->allocateTexture(desc, formatInfo, initialData.data(), &mStagingTexture)); - } - else - { - ANGLE_TRY(mRenderer->allocateTexture(desc, formatInfo, &mStagingTexture)); - } - - mStagingTexture.setDebugName("Image11::StagingTexture2D"); - mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1); - } - else - { - UNREACHABLE(); - } - - mDirty = false; - return gl::NoError(); -} - -gl::Error Image11::map(const gl::Context *context, D3D11_MAP mapType, D3D11_MAPPED_SUBRESOURCE *map) -{ - // We must recover from the TextureStorage if necessary, even for D3D11_MAP_WRITE. - ANGLE_TRY(recoverFromAssociatedStorage(context)); - - const TextureHelper11 *stagingTexture = nullptr; - unsigned int subresourceIndex = 0; - ANGLE_TRY(getStagingTexture(&stagingTexture, &subresourceIndex)); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - ASSERT(stagingTexture && stagingTexture->valid()); - HRESULT result = deviceContext->Map(stagingTexture->get(), subresourceIndex, mapType, 0, map); - - if (FAILED(result)) - { - // this can fail if the device is removed (from TDR) - if (d3d11::isDeviceLostError(result)) - { - mRenderer->notifyDeviceLost(); - } - return gl::OutOfMemory() << "Failed to map staging texture, " << gl::FmtHR(result); - } - - mDirty = true; - - return gl::NoError(); -} - -void Image11::unmap() -{ - if (mStagingTexture.valid()) - { - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - deviceContext->Unmap(mStagingTexture.get(), mStagingSubresource); - } -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h deleted file mode 100644 index 584d231b37..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h +++ /dev/null @@ -1,112 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// Image11.h: Defines the rx::Image11 class, which acts as the interface to -// the actual underlying resources of a Texture - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_IMAGE11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_IMAGE11_H_ - -#include "common/debug.h" -#include "libANGLE/ImageIndex.h" -#include "libANGLE/renderer/d3d/ImageD3D.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -namespace gl -{ -class Framebuffer; -} - -namespace rx -{ -class Renderer11; -class TextureHelper11; -class TextureStorage11; -struct Renderer11DeviceCaps; - -class Image11 : public ImageD3D -{ - public: - Image11(Renderer11 *renderer); - ~Image11() override; - - static gl::Error GenerateMipmap(const gl::Context *context, - Image11 *dest, - Image11 *src, - const Renderer11DeviceCaps &rendererCaps); - static gl::Error CopyImage(const gl::Context *context, - Image11 *dest, - Image11 *source, - const gl::Rectangle &sourceRect, - const gl::Offset &destOffset, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha, - const Renderer11DeviceCaps &rendererCaps); - - bool isDirty() const override; - - gl::Error copyToStorage(const gl::Context *context, - TextureStorage *storage, - const gl::ImageIndex &index, - const gl::Box ®ion) override; - - bool redefine(GLenum target, GLenum internalformat, const gl::Extents &size, bool forceRelease) override; - - DXGI_FORMAT getDXGIFormat() const; - - gl::Error loadData(const gl::Context *context, - const gl::Box &area, - const gl::PixelUnpackState &unpack, - GLenum type, - const void *input, - bool applySkipImages) override; - gl::Error loadCompressedData(const gl::Context *context, - const gl::Box &area, - const void *input) override; - - gl::Error copyFromTexStorage(const gl::Context *context, - const gl::ImageIndex &imageIndex, - TextureStorage *source) override; - gl::Error copyFromFramebuffer(const gl::Context *context, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) override; - - gl::Error recoverFromAssociatedStorage(const gl::Context *context); - void verifyAssociatedStorageValid(TextureStorage11 *textureStorage) const; - void disassociateStorage(); - - protected: - gl::Error map(const gl::Context *context, D3D11_MAP mapType, D3D11_MAPPED_SUBRESOURCE *map); - void unmap(); - - private: - gl::Error copyWithoutConversion(const gl::Offset &destOffset, - const gl::Box &sourceArea, - const TextureHelper11 &textureHelper, - UINT sourceSubResource); - - gl::Error getStagingTexture(const TextureHelper11 **outStagingTexture, - unsigned int *outSubresourceIndex); - gl::Error createStagingTexture(); - void releaseStagingTexture(); - - Renderer11 *mRenderer; - - DXGI_FORMAT mDXGIFormat; - TextureHelper11 mStagingTexture; - unsigned int mStagingSubresource; - - bool mRecoverFromStorage; - TextureStorage11 *mAssociatedStorage; - gl::ImageIndex mAssociatedImageIndex; - unsigned int mRecoveredFromStorageCount; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D11_IMAGE11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp deleted file mode 100644 index a79fb71f71..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp +++ /dev/null @@ -1,159 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// IndexBuffer11.cpp: Defines the D3D11 IndexBuffer implementation. - -#include "libANGLE/renderer/d3d/d3d11/IndexBuffer11.h" - -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -namespace rx -{ - -IndexBuffer11::IndexBuffer11(Renderer11 *const renderer) - : mRenderer(renderer), mBuffer(), mBufferSize(0), mIndexType(GL_NONE), mDynamicUsage(false) -{ -} - -IndexBuffer11::~IndexBuffer11() -{ -} - -gl::Error IndexBuffer11::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) -{ - mBuffer.reset(); - - updateSerial(); - - if (bufferSize > 0) - { - D3D11_BUFFER_DESC bufferDesc; - bufferDesc.ByteWidth = bufferSize; - bufferDesc.Usage = D3D11_USAGE_DYNAMIC; - bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; - bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - bufferDesc.MiscFlags = 0; - bufferDesc.StructureByteStride = 0; - - ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &mBuffer)); - - if (dynamic) - { - mBuffer.setDebugName("IndexBuffer11 (dynamic)"); - } - else - { - mBuffer.setDebugName("IndexBuffer11 (static)"); - } - } - - mBufferSize = bufferSize; - mIndexType = indexType; - mDynamicUsage = dynamic; - - return gl::NoError(); -} - -gl::Error IndexBuffer11::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory) -{ - if (!mBuffer.valid()) - { - return gl::OutOfMemory() << "Internal index buffer is not initialized."; - } - - // Check for integer overflows and out-out-bounds map requests - if (offset + size < offset || offset + size > mBufferSize) - { - return gl::OutOfMemory() << "Index buffer map range is not inside the buffer."; - } - - ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext(); - - D3D11_MAPPED_SUBRESOURCE mappedResource; - HRESULT result = - dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to map internal index buffer, " << gl::FmtHR(result); - } - - *outMappedMemory = reinterpret_cast<char*>(mappedResource.pData) + offset; - return gl::NoError(); -} - -gl::Error IndexBuffer11::unmapBuffer() -{ - if (!mBuffer.valid()) - { - return gl::OutOfMemory() << "Internal index buffer is not initialized."; - } - - ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext(); - dxContext->Unmap(mBuffer.get(), 0); - return gl::NoError(); -} - -GLenum IndexBuffer11::getIndexType() const -{ - return mIndexType; -} - -unsigned int IndexBuffer11::getBufferSize() const -{ - return mBufferSize; -} - -gl::Error IndexBuffer11::setSize(unsigned int bufferSize, GLenum indexType) -{ - if (bufferSize > mBufferSize || indexType != mIndexType) - { - return initialize(bufferSize, indexType, mDynamicUsage); - } - else - { - return gl::NoError(); - } -} - -gl::Error IndexBuffer11::discard() -{ - if (!mBuffer.valid()) - { - return gl::OutOfMemory() << "Internal index buffer is not initialized."; - } - - ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext(); - - D3D11_MAPPED_SUBRESOURCE mappedResource; - HRESULT result = dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to map internal index buffer, " << gl::FmtHR(result); - } - - dxContext->Unmap(mBuffer.get(), 0); - - return gl::NoError(); -} - -DXGI_FORMAT IndexBuffer11::getIndexFormat() const -{ - switch (mIndexType) - { - case GL_UNSIGNED_BYTE: return DXGI_FORMAT_R16_UINT; - case GL_UNSIGNED_SHORT: return DXGI_FORMAT_R16_UINT; - case GL_UNSIGNED_INT: return DXGI_FORMAT_R32_UINT; - default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN; - } -} - -const d3d11::Buffer &IndexBuffer11::getBuffer() const -{ - return mBuffer; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h deleted file mode 100644 index 7b5d744c02..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h +++ /dev/null @@ -1,50 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// IndexBuffer11.h: Defines the D3D11 IndexBuffer implementation. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_INDEXBUFFER11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_INDEXBUFFER11_H_ - -#include "libANGLE/renderer/d3d/IndexBuffer.h" -#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" - -namespace rx -{ -class Renderer11; - -class IndexBuffer11 : public IndexBuffer -{ - public: - explicit IndexBuffer11(Renderer11 *const renderer); - ~IndexBuffer11() override; - - gl::Error initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) override; - - gl::Error mapBuffer(unsigned int offset, unsigned int size, void **outMappedMemory) override; - gl::Error unmapBuffer() override; - - GLenum getIndexType() const override; - unsigned int getBufferSize() const override; - gl::Error setSize(unsigned int bufferSize, GLenum indexType) override; - - gl::Error discard() override; - - DXGI_FORMAT getIndexFormat() const; - const d3d11::Buffer &getBuffer() const; - - private: - Renderer11 *const mRenderer; - - d3d11::Buffer mBuffer; - unsigned int mBufferSize; - GLenum mIndexType; - bool mDynamicUsage; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_INDEXBUFFER11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp deleted file mode 100644 index a238f97b08..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp +++ /dev/null @@ -1,503 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// InputLayoutCache.cpp: Defines InputLayoutCache, a class that builds and caches -// D3D11 input layouts. - -#include "libANGLE/renderer/d3d/d3d11/InputLayoutCache.h" - -#include "common/bitset_utils.h" -#include "common/utilities.h" -#include "libANGLE/Context.h" -#include "libANGLE/Program.h" -#include "libANGLE/VertexArray.h" -#include "libANGLE/VertexAttribute.h" -#include "libANGLE/renderer/d3d/IndexDataManager.h" -#include "libANGLE/renderer/d3d/ProgramD3D.h" -#include "libANGLE/renderer/d3d/VertexDataManager.h" -#include "libANGLE/renderer/d3d/d3d11/Buffer11.h" -#include "libANGLE/renderer/d3d/d3d11/Context11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h" -#include "libANGLE/renderer/d3d/d3d11/VertexArray11.h" -#include "libANGLE/renderer/d3d/d3d11/VertexBuffer11.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" - -namespace rx -{ - -namespace -{ - -size_t GetReservedBufferCount(bool usesPointSpriteEmulation) -{ - return usesPointSpriteEmulation ? 1 : 0; -} - -GLenum GetGLSLAttributeType(const std::vector<sh::Attribute> &shaderAttributes, size_t index) -{ - // Count matrices differently - for (const sh::Attribute &attrib : shaderAttributes) - { - if (attrib.location == -1) - { - continue; - } - - GLenum transposedType = gl::TransposeMatrixType(attrib.type); - int rows = gl::VariableRowCount(transposedType); - int intIndex = static_cast<int>(index); - - if (intIndex >= attrib.location && intIndex < attrib.location + rows) - { - return transposedType; - } - } - - UNREACHABLE(); - return GL_NONE; -} - -struct PackedAttribute -{ - uint8_t attribType; - uint8_t semanticIndex; - uint8_t vertexFormatType; - uint8_t divisor; -}; - -} // anonymous namespace - -PackedAttributeLayout::PackedAttributeLayout() : numAttributes(0), flags(0), attributeData({}) -{ -} - -PackedAttributeLayout::PackedAttributeLayout(const PackedAttributeLayout &other) = default; - -void PackedAttributeLayout::addAttributeData(GLenum glType, - UINT semanticIndex, - gl::VertexFormatType vertexFormatType, - unsigned int divisor) -{ - gl::AttributeType attribType = gl::GetAttributeType(glType); - - PackedAttribute packedAttrib; - packedAttrib.attribType = static_cast<uint8_t>(attribType); - packedAttrib.semanticIndex = static_cast<uint8_t>(semanticIndex); - packedAttrib.vertexFormatType = static_cast<uint8_t>(vertexFormatType); - packedAttrib.divisor = static_cast<uint8_t>(divisor); - - ASSERT(static_cast<gl::AttributeType>(packedAttrib.attribType) == attribType); - ASSERT(static_cast<UINT>(packedAttrib.semanticIndex) == semanticIndex); - ASSERT(static_cast<gl::VertexFormatType>(packedAttrib.vertexFormatType) == vertexFormatType); - ASSERT(static_cast<unsigned int>(packedAttrib.divisor) == divisor); - - static_assert(sizeof(uint32_t) == sizeof(PackedAttribute), "PackedAttributes must be 32-bits exactly."); - - attributeData[numAttributes++] = gl::bitCast<uint32_t>(packedAttrib); -} - -bool PackedAttributeLayout::operator==(const PackedAttributeLayout &other) const -{ - return (numAttributes == other.numAttributes) && (flags == other.flags) && - (attributeData == other.attributeData); -} - -InputLayoutCache::InputLayoutCache() - : mLayoutCache(kDefaultCacheSize * 2), mPointSpriteVertexBuffer(), mPointSpriteIndexBuffer() -{ -} - -InputLayoutCache::~InputLayoutCache() -{ -} - -void InputLayoutCache::clear() -{ - mLayoutCache.Clear(); - mPointSpriteVertexBuffer.reset(); - mPointSpriteIndexBuffer.reset(); -} - -gl::Error InputLayoutCache::applyVertexBuffers( - const gl::Context *context, - const std::vector<const TranslatedAttribute *> ¤tAttributes, - GLenum mode, - GLint start, - bool isIndexedRendering) -{ - Renderer11 *renderer = GetImplAs<Context11>(context)->getRenderer(); - const gl::State &state = context->getGLState(); - auto *stateManager = renderer->getStateManager(); - gl::Program *program = state.getProgram(); - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program); - - bool programUsesInstancedPointSprites = programD3D->usesPointSize() && programD3D->usesInstancedPointSpriteEmulation(); - bool instancedPointSpritesActive = programUsesInstancedPointSprites && (mode == GL_POINTS); - - // Note that if we use instance emulation, we reserve the first buffer slot. - size_t reservedBuffers = GetReservedBufferCount(programUsesInstancedPointSprites); - - for (size_t attribIndex = 0; attribIndex < (gl::MAX_VERTEX_ATTRIBS - reservedBuffers); - ++attribIndex) - { - ID3D11Buffer *buffer = nullptr; - UINT vertexStride = 0; - UINT vertexOffset = 0; - - if (attribIndex < currentAttributes.size()) - { - const auto &attrib = *currentAttributes[attribIndex]; - Buffer11 *bufferStorage = attrib.storage ? GetAs<Buffer11>(attrib.storage) : nullptr; - - // If indexed pointsprite emulation is active, then we need to take a less efficent code path. - // Emulated indexed pointsprite rendering requires that the vertex buffers match exactly to - // the indices passed by the caller. This could expand or shrink the vertex buffer depending - // on the number of points indicated by the index list or how many duplicates are found on the index list. - if (bufferStorage == nullptr) - { - ASSERT(attrib.vertexBuffer.get()); - buffer = GetAs<VertexBuffer11>(attrib.vertexBuffer.get())->getBuffer().get(); - } - else if (instancedPointSpritesActive && isIndexedRendering) - { - VertexArray11 *vao11 = GetImplAs<VertexArray11>(state.getVertexArray()); - ASSERT(vao11->isCachedIndexInfoValid()); - TranslatedIndexData *indexInfo = vao11->getCachedIndexInfo(); - if (indexInfo->srcIndexData.srcBuffer != nullptr) - { - const uint8_t *bufferData = nullptr; - ANGLE_TRY(indexInfo->srcIndexData.srcBuffer->getData(context, &bufferData)); - ASSERT(bufferData != nullptr); - - ptrdiff_t offset = - reinterpret_cast<ptrdiff_t>(indexInfo->srcIndexData.srcIndices); - indexInfo->srcIndexData.srcBuffer = nullptr; - indexInfo->srcIndexData.srcIndices = bufferData + offset; - } - - ANGLE_TRY_RESULT(bufferStorage->getEmulatedIndexedBuffer( - context, &indexInfo->srcIndexData, attrib, start), - buffer); - } - else - { - ANGLE_TRY_RESULT( - bufferStorage->getBuffer(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK), - buffer); - } - - vertexStride = attrib.stride; - ANGLE_TRY_RESULT(attrib.computeOffset(start), vertexOffset); - } - - size_t bufferIndex = reservedBuffers + attribIndex; - - stateManager->queueVertexBufferChange(bufferIndex, buffer, vertexStride, vertexOffset); - } - - // Instanced PointSprite emulation requires two additional ID3D11Buffers. A vertex buffer needs - // to be created and added to the list of current buffers, strides and offsets collections. - // This buffer contains the vertices for a single PointSprite quad. - // An index buffer also needs to be created and applied because rendering instanced data on - // D3D11 FL9_3 requires DrawIndexedInstanced() to be used. Shaders that contain gl_PointSize and - // used without the GL_POINTS rendering mode require a vertex buffer because some drivers cannot - // handle missing vertex data and will TDR the system. - if (programUsesInstancedPointSprites) - { - const UINT pointSpriteVertexStride = sizeof(float) * 5; - - if (!mPointSpriteVertexBuffer.valid()) - { - static const float pointSpriteVertices[] = - { - // Position // TexCoord - -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, - -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, - 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, - 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, - -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, - 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, - }; - - D3D11_SUBRESOURCE_DATA vertexBufferData = { pointSpriteVertices, 0, 0 }; - D3D11_BUFFER_DESC vertexBufferDesc; - vertexBufferDesc.ByteWidth = sizeof(pointSpriteVertices); - vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - vertexBufferDesc.Usage = D3D11_USAGE_IMMUTABLE; - vertexBufferDesc.CPUAccessFlags = 0; - vertexBufferDesc.MiscFlags = 0; - vertexBufferDesc.StructureByteStride = 0; - - ANGLE_TRY(renderer->allocateResource(vertexBufferDesc, &vertexBufferData, - &mPointSpriteVertexBuffer)); - } - - // Set the stride to 0 if GL_POINTS mode is not being used to instruct the driver to avoid - // indexing into the vertex buffer. - UINT stride = instancedPointSpritesActive ? pointSpriteVertexStride : 0; - stateManager->queueVertexBufferChange(0, mPointSpriteVertexBuffer.get(), stride, 0); - - if (!mPointSpriteIndexBuffer.valid()) - { - // Create an index buffer and set it for pointsprite rendering - static const unsigned short pointSpriteIndices[] = - { - 0, 1, 2, 3, 4, 5, - }; - - D3D11_SUBRESOURCE_DATA indexBufferData = { pointSpriteIndices, 0, 0 }; - D3D11_BUFFER_DESC indexBufferDesc; - indexBufferDesc.ByteWidth = sizeof(pointSpriteIndices); - indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; - indexBufferDesc.Usage = D3D11_USAGE_IMMUTABLE; - indexBufferDesc.CPUAccessFlags = 0; - indexBufferDesc.MiscFlags = 0; - indexBufferDesc.StructureByteStride = 0; - - ANGLE_TRY(renderer->allocateResource(indexBufferDesc, &indexBufferData, - &mPointSpriteIndexBuffer)); - } - - if (instancedPointSpritesActive) - { - // The index buffer is applied here because Instanced PointSprite emulation uses the a - // non-indexed rendering path in ANGLE (DrawArrays). This means that applyIndexBuffer() - // on the renderer will not be called and setting this buffer here ensures that the - // rendering path will contain the correct index buffers. - stateManager->setIndexBuffer(mPointSpriteIndexBuffer.get(), DXGI_FORMAT_R16_UINT, 0); - } - } - - stateManager->applyVertexBufferChanges(); - return gl::NoError(); -} - -gl::Error InputLayoutCache::updateVertexOffsetsForPointSpritesEmulation( - Renderer11 *renderer, - const std::vector<const TranslatedAttribute *> ¤tAttributes, - GLint startVertex, - GLsizei emulatedInstanceId) -{ - auto *stateManager = renderer->getStateManager(); - - size_t reservedBuffers = GetReservedBufferCount(true); - for (size_t attribIndex = 0; attribIndex < currentAttributes.size(); ++attribIndex) - { - const auto &attrib = *currentAttributes[attribIndex]; - size_t bufferIndex = reservedBuffers + attribIndex; - - if (attrib.divisor > 0) - { - unsigned int offset = 0; - ANGLE_TRY_RESULT(attrib.computeOffset(startVertex), offset); - offset += (attrib.stride * (emulatedInstanceId / attrib.divisor)); - stateManager->queueVertexOffsetChange(bufferIndex, offset); - } - } - - stateManager->applyVertexBufferChanges(); - return gl::NoError(); -} - -gl::Error InputLayoutCache::updateInputLayout( - Renderer11 *renderer, - const gl::State &state, - const std::vector<const TranslatedAttribute *> ¤tAttributes, - GLenum mode, - const AttribIndexArray &sortedSemanticIndices, - const DrawCallVertexParams &vertexParams) -{ - gl::Program *program = state.getProgram(); - const auto &shaderAttributes = program->getAttributes(); - PackedAttributeLayout layout; - - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program); - bool programUsesInstancedPointSprites = - programD3D->usesPointSize() && programD3D->usesInstancedPointSpriteEmulation(); - bool instancedPointSpritesActive = programUsesInstancedPointSprites && (mode == GL_POINTS); - - if (programUsesInstancedPointSprites) - { - layout.flags |= PackedAttributeLayout::FLAG_USES_INSTANCED_SPRITES; - } - - if (instancedPointSpritesActive) - { - layout.flags |= PackedAttributeLayout::FLAG_INSTANCED_SPRITES_ACTIVE; - } - - if (vertexParams.instances() > 0) - { - layout.flags |= PackedAttributeLayout::FLAG_INSTANCED_RENDERING_ACTIVE; - } - - const auto &attribs = state.getVertexArray()->getVertexAttributes(); - const auto &bindings = state.getVertexArray()->getVertexBindings(); - const auto &locationToSemantic = programD3D->getAttribLocationToD3DSemantics(); - int divisorMultiplier = program->usesMultiview() ? program->getNumViews() : 1; - - for (size_t attribIndex : program->getActiveAttribLocationsMask()) - { - // Record the type of the associated vertex shader vector in our key - // This will prevent mismatched vertex shaders from using the same input layout - GLenum glslElementType = GetGLSLAttributeType(shaderAttributes, attribIndex); - - const auto &attrib = attribs[attribIndex]; - const auto &binding = bindings[attrib.bindingIndex]; - int d3dSemantic = locationToSemantic[attribIndex]; - - const auto ¤tValue = - state.getVertexAttribCurrentValue(static_cast<unsigned int>(attribIndex)); - gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, currentValue.Type); - - layout.addAttributeData(glslElementType, d3dSemantic, vertexFormatType, - binding.getDivisor() * divisorMultiplier); - } - - const d3d11::InputLayout *inputLayout = nullptr; - if (layout.numAttributes > 0 || layout.flags != 0) - { - auto it = mLayoutCache.Get(layout); - if (it != mLayoutCache.end()) - { - inputLayout = &it->second; - } - else - { - angle::TrimCache(mLayoutCache.max_size() / 2, kGCLimit, "input layout", &mLayoutCache); - - d3d11::InputLayout newInputLayout; - ANGLE_TRY(createInputLayout(renderer, sortedSemanticIndices, currentAttributes, mode, - program, vertexParams, &newInputLayout)); - - auto insertIt = mLayoutCache.Put(layout, std::move(newInputLayout)); - inputLayout = &insertIt->second; - } - } - - renderer->getStateManager()->setInputLayout(inputLayout); - return gl::NoError(); -} - -gl::Error InputLayoutCache::createInputLayout( - Renderer11 *renderer, - const AttribIndexArray &sortedSemanticIndices, - const std::vector<const TranslatedAttribute *> ¤tAttributes, - GLenum mode, - gl::Program *program, - const DrawCallVertexParams &vertexParams, - d3d11::InputLayout *inputLayoutOut) -{ - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program); - auto featureLevel = renderer->getRenderer11DeviceCaps().featureLevel; - - bool programUsesInstancedPointSprites = - programD3D->usesPointSize() && programD3D->usesInstancedPointSpriteEmulation(); - - unsigned int inputElementCount = 0; - std::array<D3D11_INPUT_ELEMENT_DESC, gl::MAX_VERTEX_ATTRIBS> inputElements; - - for (size_t attribIndex = 0; attribIndex < currentAttributes.size(); ++attribIndex) - { - const auto &attrib = *currentAttributes[attribIndex]; - const int sortedIndex = sortedSemanticIndices[attribIndex]; - - D3D11_INPUT_CLASSIFICATION inputClass = - attrib.divisor > 0 ? D3D11_INPUT_PER_INSTANCE_DATA : D3D11_INPUT_PER_VERTEX_DATA; - - const auto &vertexFormatType = - gl::GetVertexFormatType(*attrib.attribute, attrib.currentValueType); - const auto &vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormatType, featureLevel); - - auto *inputElement = &inputElements[inputElementCount]; - - inputElement->SemanticName = "TEXCOORD"; - inputElement->SemanticIndex = sortedIndex; - inputElement->Format = vertexFormatInfo.nativeFormat; - inputElement->InputSlot = static_cast<UINT>(attribIndex); - inputElement->AlignedByteOffset = 0; - inputElement->InputSlotClass = inputClass; - inputElement->InstanceDataStepRate = attrib.divisor; - - inputElementCount++; - } - - // Instanced PointSprite emulation requires additional entries in the - // inputlayout to support the vertices that make up the pointsprite quad. - // We do this even if mode != GL_POINTS, since the shader signature has these inputs, and the - // input layout must match the shader - if (programUsesInstancedPointSprites) - { - // On 9_3, we must ensure that slot 0 contains non-instanced data. - // If slot 0 currently contains instanced data then we swap it with a non-instanced element. - // Note that instancing is only available on 9_3 via ANGLE_instanced_arrays, since 9_3 - // doesn't support OpenGL ES 3.0. - // As per the spec for ANGLE_instanced_arrays, not all attributes can be instanced - // simultaneously, so a non-instanced element must exist. - - GLsizei numIndicesPerInstance = 0; - if (vertexParams.instances() > 0) - { - // This may trigger an evaluation of the index range. - numIndicesPerInstance = vertexParams.vertexCount(); - } - - for (size_t elementIndex = 0; elementIndex < inputElementCount; ++elementIndex) - { - // If rendering points and instanced pointsprite emulation is being used, the - // inputClass is required to be configured as per instance data - if (mode == GL_POINTS) - { - inputElements[elementIndex].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA; - inputElements[elementIndex].InstanceDataStepRate = 1; - if (numIndicesPerInstance > 0 && currentAttributes[elementIndex]->divisor > 0) - { - inputElements[elementIndex].InstanceDataStepRate = numIndicesPerInstance; - } - } - inputElements[elementIndex].InputSlot++; - } - - inputElements[inputElementCount].SemanticName = "SPRITEPOSITION"; - inputElements[inputElementCount].SemanticIndex = 0; - inputElements[inputElementCount].Format = DXGI_FORMAT_R32G32B32_FLOAT; - inputElements[inputElementCount].InputSlot = 0; - inputElements[inputElementCount].AlignedByteOffset = 0; - inputElements[inputElementCount].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; - inputElements[inputElementCount].InstanceDataStepRate = 0; - inputElementCount++; - - inputElements[inputElementCount].SemanticName = "SPRITETEXCOORD"; - inputElements[inputElementCount].SemanticIndex = 0; - inputElements[inputElementCount].Format = DXGI_FORMAT_R32G32_FLOAT; - inputElements[inputElementCount].InputSlot = 0; - inputElements[inputElementCount].AlignedByteOffset = sizeof(float) * 3; - inputElements[inputElementCount].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; - inputElements[inputElementCount].InstanceDataStepRate = 0; - inputElementCount++; - } - - ShaderExecutableD3D *shader = nullptr; - ANGLE_TRY(programD3D->getVertexExecutableForCachedInputLayout(&shader, nullptr)); - - ShaderExecutableD3D *shader11 = GetAs<ShaderExecutable11>(shader); - - InputElementArray inputElementArray(inputElements.data(), inputElementCount); - ShaderData vertexShaderData(shader11->getFunction(), shader11->getLength()); - - ANGLE_TRY(renderer->allocateResource(inputElementArray, &vertexShaderData, inputLayoutOut)); - return gl::NoError(); -} - -void InputLayoutCache::setCacheSize(size_t newCacheSize) -{ - // Forces a reset of the cache. - LayoutCache newCache(newCacheSize); - mLayoutCache.Swap(newCache); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h deleted file mode 100644 index 8d7c7dd0f0..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h +++ /dev/null @@ -1,135 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// InputLayoutCache.h: Defines InputLayoutCache, a class that builds and caches -// D3D11 input layouts. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_ - -#include <GLES2/gl2.h> - -#include <cstddef> - -#include <array> -#include <map> - -#include "common/angleutils.h" -#include "libANGLE/Constants.h" -#include "libANGLE/Error.h" -#include "libANGLE/SizedMRUCache.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" - -namespace rx -{ -class DrawCallVertexParams; -struct PackedAttributeLayout -{ - PackedAttributeLayout(); - PackedAttributeLayout(const PackedAttributeLayout &other); - - void addAttributeData(GLenum glType, - UINT semanticIndex, - gl::VertexFormatType vertexFormatType, - unsigned int divisor); - - bool operator==(const PackedAttributeLayout &other) const; - - enum Flags - { - FLAG_USES_INSTANCED_SPRITES = 0x1, - FLAG_INSTANCED_SPRITES_ACTIVE = 0x2, - FLAG_INSTANCED_RENDERING_ACTIVE = 0x4, - }; - - uint32_t numAttributes; - uint32_t flags; - std::array<uint32_t, gl::MAX_VERTEX_ATTRIBS> attributeData; -}; -} // namespace rx - -namespace std -{ -template <> -struct hash<rx::PackedAttributeLayout> -{ - size_t operator()(const rx::PackedAttributeLayout &value) const - { - return angle::ComputeGenericHash(value); - } -}; -} // namespace std - -namespace gl -{ -class Program; -} // namespace gl - -namespace rx -{ -struct TranslatedAttribute; -struct TranslatedIndexData; -struct SourceIndexData; -class ProgramD3D; -class Renderer11; - -class InputLayoutCache : angle::NonCopyable -{ - public: - InputLayoutCache(); - ~InputLayoutCache(); - - void clear(); - - gl::Error applyVertexBuffers(const gl::Context *context, - const std::vector<const TranslatedAttribute *> ¤tAttributes, - GLenum mode, - GLint start, - bool isIndexedRendering); - - gl::Error updateVertexOffsetsForPointSpritesEmulation( - Renderer11 *renderer, - const std::vector<const TranslatedAttribute *> ¤tAttributes, - GLint startVertex, - GLsizei emulatedInstanceId); - - // Useful for testing - void setCacheSize(size_t newCacheSize); - - gl::Error updateInputLayout(Renderer11 *renderer, - const gl::State &state, - const std::vector<const TranslatedAttribute *> ¤tAttributes, - GLenum mode, - const AttribIndexArray &sortedSemanticIndices, - const DrawCallVertexParams &vertexParams); - - private: - gl::Error createInputLayout(Renderer11 *renderer, - const AttribIndexArray &sortedSemanticIndices, - const std::vector<const TranslatedAttribute *> ¤tAttributes, - GLenum mode, - gl::Program *program, - const DrawCallVertexParams &vertexParams, - d3d11::InputLayout *inputLayoutOut); - - // Starting cache size. - static constexpr size_t kDefaultCacheSize = 1024; - - // The cache tries to clean up this many states at once. - static constexpr size_t kGCLimit = 128; - - using LayoutCache = angle::base::HashingMRUCache<PackedAttributeLayout, d3d11::InputLayout>; - LayoutCache mLayoutCache; - - d3d11::Buffer mPointSpriteVertexBuffer; - d3d11::Buffer mPointSpriteIndexBuffer; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/NativeWindow11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/NativeWindow11.h deleted file mode 100644 index ab234d4450..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/NativeWindow11.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// NativeWindow11.h: Defines NativeWindow11, a class for managing and performing operations on an -// EGLNativeWindowType for the D3D11 renderer. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_NATIVEWINDOW11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_NATIVEWINDOW11_H_ - -#include "common/debug.h" -#include "common/platform.h" - -#include "libANGLE/Config.h" -#include "libANGLE/renderer/d3d/NativeWindowD3D.h" - -namespace rx -{ - -class NativeWindow11 : public NativeWindowD3D -{ - public: - NativeWindow11(EGLNativeWindowType window) : NativeWindowD3D(window) {} - - virtual HRESULT createSwapChain(ID3D11Device *device, - IDXGIFactory *factory, - DXGI_FORMAT format, - UINT width, - UINT height, - UINT samples, - IDXGISwapChain **swapChain) = 0; - virtual void commitChange() = 0; -}; -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_NATIVEWINDOW11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp deleted file mode 100644 index 7d7ecb0976..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp +++ /dev/null @@ -1,258 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// PixelTransfer11.cpp: -// Implementation for buffer-to-texture and texture-to-buffer copies. -// Used to implement pixel transfers from unpack and to pack buffers. -// - -#include "libANGLE/renderer/d3d/d3d11/PixelTransfer11.h" - -#include "libANGLE/Buffer.h" -#include "libANGLE/Context.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/d3d11/Buffer11.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" -#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h" -#include "libANGLE/Texture.h" - -// Precompiled shaders -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h" - -namespace rx -{ - -PixelTransfer11::PixelTransfer11(Renderer11 *renderer) - : mRenderer(renderer), - mResourcesLoaded(false), - mBufferToTextureVS(), - mBufferToTextureGS(), - mParamsConstantBuffer(), - mCopyRasterizerState(), - mCopyDepthStencilState() -{ -} - -PixelTransfer11::~PixelTransfer11() -{ -} - -gl::Error PixelTransfer11::loadResources() -{ - if (mResourcesLoaded) - { - return gl::NoError(); - } - - D3D11_RASTERIZER_DESC rasterDesc; - rasterDesc.FillMode = D3D11_FILL_SOLID; - rasterDesc.CullMode = D3D11_CULL_NONE; - rasterDesc.FrontCounterClockwise = FALSE; - rasterDesc.DepthBias = 0; - rasterDesc.SlopeScaledDepthBias = 0.0f; - rasterDesc.DepthBiasClamp = 0.0f; - rasterDesc.DepthClipEnable = TRUE; - rasterDesc.ScissorEnable = FALSE; - rasterDesc.MultisampleEnable = FALSE; - rasterDesc.AntialiasedLineEnable = FALSE; - - ANGLE_TRY(mRenderer->allocateResource(rasterDesc, &mCopyRasterizerState)); - - D3D11_DEPTH_STENCIL_DESC depthStencilDesc; - depthStencilDesc.DepthEnable = true; - depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - depthStencilDesc.DepthFunc = D3D11_COMPARISON_ALWAYS; - depthStencilDesc.StencilEnable = FALSE; - depthStencilDesc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK; - depthStencilDesc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; - depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - - ANGLE_TRY(mRenderer->allocateResource(depthStencilDesc, &mCopyDepthStencilState)); - - D3D11_BUFFER_DESC constantBufferDesc = { 0 }; - constantBufferDesc.ByteWidth = roundUp<UINT>(sizeof(CopyShaderParams), 32u); - constantBufferDesc.Usage = D3D11_USAGE_DYNAMIC; - constantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - constantBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - constantBufferDesc.MiscFlags = 0; - constantBufferDesc.StructureByteStride = 0; - - ANGLE_TRY(mRenderer->allocateResource(constantBufferDesc, &mParamsConstantBuffer)); - mParamsConstantBuffer.setDebugName("PixelTransfer11 constant buffer"); - - // init shaders - ANGLE_TRY(mRenderer->allocateResource(ShaderData(g_VS_BufferToTexture), &mBufferToTextureVS)); - mBufferToTextureVS.setDebugName("BufferToTexture VS"); - - ANGLE_TRY(mRenderer->allocateResource(ShaderData(g_GS_BufferToTexture), &mBufferToTextureGS)); - mBufferToTextureGS.setDebugName("BufferToTexture GS"); - - ANGLE_TRY(buildShaderMap()); - - StructZero(&mParamsData); - - mResourcesLoaded = true; - - return gl::NoError(); -} - -void PixelTransfer11::setBufferToTextureCopyParams(const gl::Box &destArea, const gl::Extents &destSize, GLenum internalFormat, - const gl::PixelUnpackState &unpack, unsigned int offset, CopyShaderParams *parametersOut) -{ - StructZero(parametersOut); - - float texelCenterX = 0.5f / static_cast<float>(destSize.width - 1); - float texelCenterY = 0.5f / static_cast<float>(destSize.height - 1); - - unsigned int bytesPerPixel = gl::GetSizedInternalFormatInfo(internalFormat).pixelBytes; - unsigned int alignmentBytes = static_cast<unsigned int>(unpack.alignment); - unsigned int alignmentPixels = (alignmentBytes <= bytesPerPixel ? 1 : alignmentBytes / bytesPerPixel); - - parametersOut->FirstPixelOffset = offset / bytesPerPixel; - parametersOut->PixelsPerRow = static_cast<unsigned int>((unpack.rowLength > 0) ? unpack.rowLength : destArea.width); - parametersOut->RowStride = roundUp(parametersOut->PixelsPerRow, alignmentPixels); - parametersOut->RowsPerSlice = static_cast<unsigned int>(destArea.height); - parametersOut->PositionOffset[0] = texelCenterX + (destArea.x / float(destSize.width)) * 2.0f - 1.0f; - parametersOut->PositionOffset[1] = texelCenterY + ((destSize.height - destArea.y - 1) / float(destSize.height)) * 2.0f - 1.0f; - parametersOut->PositionScale[0] = 2.0f / static_cast<float>(destSize.width); - parametersOut->PositionScale[1] = -2.0f / static_cast<float>(destSize.height); - parametersOut->FirstSlice = destArea.z; -} - -gl::Error PixelTransfer11::copyBufferToTexture(const gl::Context *context, - const gl::PixelUnpackState &unpack, - unsigned int offset, - RenderTargetD3D *destRenderTarget, - GLenum destinationFormat, - GLenum sourcePixelsType, - const gl::Box &destArea) -{ - ANGLE_TRY(loadResources()); - - gl::Extents destSize = destRenderTarget->getExtents(); - - ASSERT(destArea.x >= 0 && destArea.x + destArea.width <= destSize.width && - destArea.y >= 0 && destArea.y + destArea.height <= destSize.height && - destArea.z >= 0 && destArea.z + destArea.depth <= destSize.depth ); - - const gl::Buffer &sourceBuffer = - *context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack); - - ASSERT(mRenderer->supportsFastCopyBufferToTexture(destinationFormat)); - - const d3d11::PixelShader *pixelShader = findBufferToTexturePS(destinationFormat); - ASSERT(pixelShader); - - // The SRV must be in the proper read format, which may be different from the destination format - // EG: for half float data, we can load full precision floats with implicit conversion - GLenum unsizedFormat = gl::GetUnsizedFormat(destinationFormat); - const gl::InternalFormat &sourceglFormatInfo = - gl::GetInternalFormatInfo(unsizedFormat, sourcePixelsType); - - const d3d11::Format &sourceFormatInfo = d3d11::Format::Get( - sourceglFormatInfo.sizedInternalFormat, mRenderer->getRenderer11DeviceCaps()); - DXGI_FORMAT srvFormat = sourceFormatInfo.srvFormat; - ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN); - Buffer11 *bufferStorage11 = GetAs<Buffer11>(sourceBuffer.getImplementation()); - const d3d11::ShaderResourceView *bufferSRV = nullptr; - ANGLE_TRY_RESULT(bufferStorage11->getSRV(context, srvFormat), bufferSRV); - ASSERT(bufferSRV != nullptr); - - const d3d11::RenderTargetView &textureRTV = - GetAs<RenderTarget11>(destRenderTarget)->getRenderTargetView(); - ASSERT(textureRTV.valid()); - - CopyShaderParams shaderParams; - setBufferToTextureCopyParams(destArea, destSize, sourceglFormatInfo.sizedInternalFormat, unpack, - offset, &shaderParams); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - // Are we doing a 2D or 3D copy? - const auto *geometryShader = ((destSize.depth > 1) ? &mBufferToTextureGS : nullptr); - StateManager11 *stateManager = mRenderer->getStateManager(); - - stateManager->setDrawShaders(&mBufferToTextureVS, geometryShader, pixelShader); - stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, bufferSRV); - stateManager->setInputLayout(nullptr); - stateManager->setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST); - - stateManager->setSingleVertexBuffer(nullptr, 0, 0); - stateManager->setSimpleBlendState(nullptr); - stateManager->setDepthStencilState(&mCopyDepthStencilState, 0xFFFFFFFF); - stateManager->setRasterizerState(&mCopyRasterizerState); - - stateManager->setRenderTarget(textureRTV.get(), nullptr); - - if (!StructEquals(mParamsData, shaderParams)) - { - d3d11::SetBufferData(deviceContext, mParamsConstantBuffer.get(), shaderParams); - mParamsData = shaderParams; - } - - stateManager->setVertexConstantBuffer(0, &mParamsConstantBuffer); - - // Set the viewport - stateManager->setSimpleViewport(destSize); - - UINT numPixels = (destArea.width * destArea.height * destArea.depth); - deviceContext->Draw(numPixels, 0); - - return gl::NoError(); -} - -gl::Error PixelTransfer11::buildShaderMap() -{ - d3d11::PixelShader bufferToTextureFloat; - d3d11::PixelShader bufferToTextureInt; - d3d11::PixelShader bufferToTextureUint; - - ANGLE_TRY( - mRenderer->allocateResource(ShaderData(g_PS_BufferToTexture_4F), &bufferToTextureFloat)); - ANGLE_TRY( - mRenderer->allocateResource(ShaderData(g_PS_BufferToTexture_4I), &bufferToTextureInt)); - ANGLE_TRY( - mRenderer->allocateResource(ShaderData(g_PS_BufferToTexture_4UI), &bufferToTextureUint)); - - bufferToTextureFloat.setDebugName("BufferToTexture RGBA ps"); - bufferToTextureInt.setDebugName("BufferToTexture RGBA-I ps"); - bufferToTextureUint.setDebugName("BufferToTexture RGBA-UI ps"); - - mBufferToTexturePSMap[GL_FLOAT] = std::move(bufferToTextureFloat); - mBufferToTexturePSMap[GL_INT] = std::move(bufferToTextureInt); - mBufferToTexturePSMap[GL_UNSIGNED_INT] = std::move(bufferToTextureUint); - - return gl::NoError(); -} - -const d3d11::PixelShader *PixelTransfer11::findBufferToTexturePS(GLenum internalFormat) const -{ - GLenum componentType = gl::GetSizedInternalFormatInfo(internalFormat).componentType; - if (componentType == GL_SIGNED_NORMALIZED || componentType == GL_UNSIGNED_NORMALIZED) - { - componentType = GL_FLOAT; - } - - auto shaderMapIt = mBufferToTexturePSMap.find(componentType); - return (shaderMapIt == mBufferToTexturePSMap.end() ? nullptr : &shaderMapIt->second); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h deleted file mode 100644 index a93544247e..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h +++ /dev/null @@ -1,93 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// PixelTransfer11.h: -// Buffer-to-Texture and Texture-to-Buffer data transfers. -// Used to implement pixel unpack and pixel pack buffers in ES3. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_PIXELTRANSFER11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_PIXELTRANSFER11_H_ - -#include <GLES2/gl2.h> - -#include <map> - -#include "common/platform.h" -#include "libANGLE/Error.h" -#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" - -namespace gl -{ - -class Buffer; -struct Box; -struct Extents; -struct PixelUnpackState; - -} - -namespace rx -{ -class Renderer11; -class RenderTargetD3D; - -class PixelTransfer11 -{ - public: - explicit PixelTransfer11(Renderer11 *renderer); - ~PixelTransfer11(); - - // unpack: the source buffer is stored in the unpack state, and buffer strides - // offset: the start of the data within the unpack buffer - // destRenderTarget: individual slice/layer of a target texture - // destinationFormat/sourcePixelsType: determines shaders + shader parameters - // destArea: the sub-section of destRenderTarget to copy to - gl::Error copyBufferToTexture(const gl::Context *context, - const gl::PixelUnpackState &unpack, - unsigned int offset, - RenderTargetD3D *destRenderTarget, - GLenum destinationFormat, - GLenum sourcePixelsType, - const gl::Box &destArea); - - private: - - struct CopyShaderParams - { - unsigned int FirstPixelOffset; - unsigned int PixelsPerRow; - unsigned int RowStride; - unsigned int RowsPerSlice; - float PositionOffset[2]; - float PositionScale[2]; - int TexLocationOffset[2]; - int TexLocationScale[2]; - unsigned int FirstSlice; - }; - - static void setBufferToTextureCopyParams(const gl::Box &destArea, const gl::Extents &destSize, GLenum internalFormat, - const gl::PixelUnpackState &unpack, unsigned int offset, CopyShaderParams *parametersOut); - - gl::Error loadResources(); - gl::Error buildShaderMap(); - const d3d11::PixelShader *findBufferToTexturePS(GLenum internalFormat) const; - - Renderer11 *mRenderer; - - bool mResourcesLoaded; - std::map<GLenum, d3d11::PixelShader> mBufferToTexturePSMap; - d3d11::VertexShader mBufferToTextureVS; - d3d11::GeometryShader mBufferToTextureGS; - d3d11::Buffer mParamsConstantBuffer; - CopyShaderParams mParamsData; - - d3d11::RasterizerState mCopyRasterizerState; - d3d11::DepthStencilState mCopyDepthStencilState; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_PIXELTRANSFER11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.cpp deleted file mode 100644 index c9554431e5..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright 2017 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. -// -// ProgramPipelineNULL.cpp: -// Implements the class methods for ProgramPipeline11. -// - -#include "libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h" - -namespace rx -{ - -ProgramPipeline11::ProgramPipeline11(const gl::ProgramPipelineState &state) - : ProgramPipelineImpl(state) -{ -} - -ProgramPipeline11::~ProgramPipeline11() -{ -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h deleted file mode 100644 index cf838eec05..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright 2017 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. -// -// ProgramPipeline11.h: -// Defines the class interface for ProgramPipeline11, implementing ProgramPipelineImpl. -// - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_PROGRAMPIPELINE11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_PROGRAMPIPELINE11_H_ - -#include "libANGLE/renderer/ProgramPipelineImpl.h" - -namespace rx -{ - -class ProgramPipeline11 : public ProgramPipelineImpl -{ - public: - ProgramPipeline11(const gl::ProgramPipelineState &state); - ~ProgramPipeline11() override; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_PROGRAMPIPELINE11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp deleted file mode 100644 index 66b9476e7f..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp +++ /dev/null @@ -1,375 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// Query11.cpp: Defines the rx::Query11 class which implements rx::QueryImpl. - -#include "libANGLE/renderer/d3d/d3d11/Query11.h" - -#include <GLES2/gl2ext.h> - -#include "common/utilities.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -namespace -{ - -GLuint64 MergeQueryResults(GLenum type, GLuint64 currentResult, GLuint64 newResult) -{ - switch (type) - { - case GL_ANY_SAMPLES_PASSED: - case GL_ANY_SAMPLES_PASSED_CONSERVATIVE: - return (currentResult == GL_TRUE || newResult == GL_TRUE) ? GL_TRUE : GL_FALSE; - - case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: - return currentResult + newResult; - - case GL_TIME_ELAPSED_EXT: - return currentResult + newResult; - - case GL_TIMESTAMP_EXT: - return newResult; - - case GL_COMMANDS_COMPLETED_CHROMIUM: - return newResult; - - default: - UNREACHABLE(); - return 0; - } -} - -} // anonymous namespace - -namespace rx -{ - -Query11::QueryState::QueryState() : query(), beginTimestamp(), endTimestamp(), finished(false) -{ -} - -Query11::QueryState::~QueryState() -{ -} - -Query11::Query11(Renderer11 *renderer, GLenum type) - : QueryImpl(type), mResult(0), mResultSum(0), mRenderer(renderer) -{ - mActiveQuery = std::unique_ptr<QueryState>(new QueryState()); -} - -Query11::~Query11() -{ - mRenderer->getStateManager()->onDeleteQueryObject(this); -} - -gl::Error Query11::begin() -{ - mResultSum = 0; - mRenderer->getStateManager()->onBeginQuery(this); - return resume(); -} - -gl::Error Query11::end() -{ - return pause(); -} - -gl::Error Query11::queryCounter() -{ - // This doesn't do anything for D3D11 as we don't support timestamps - ASSERT(getType() == GL_TIMESTAMP_EXT); - mResultSum = 0; - mPendingQueries.push_back(std::unique_ptr<QueryState>(new QueryState())); - return gl::NoError(); -} - -template <typename T> -gl::Error Query11::getResultBase(T *params) -{ - ASSERT(!mActiveQuery->query.valid()); - ANGLE_TRY(flush(true)); - ASSERT(mPendingQueries.empty()); - *params = static_cast<T>(mResultSum); - - return gl::NoError(); -} - -gl::Error Query11::getResult(GLint *params) -{ - return getResultBase(params); -} - -gl::Error Query11::getResult(GLuint *params) -{ - return getResultBase(params); -} - -gl::Error Query11::getResult(GLint64 *params) -{ - return getResultBase(params); -} - -gl::Error Query11::getResult(GLuint64 *params) -{ - return getResultBase(params); -} - -gl::Error Query11::isResultAvailable(bool *available) -{ - ANGLE_TRY(flush(false)); - - *available = mPendingQueries.empty(); - return gl::NoError(); -} - -gl::Error Query11::pause() -{ - if (mActiveQuery->query.valid()) - { - ID3D11DeviceContext *context = mRenderer->getDeviceContext(); - GLenum queryType = getType(); - - // If we are doing time elapsed query the end timestamp - if (queryType == GL_TIME_ELAPSED_EXT) - { - context->End(mActiveQuery->endTimestamp.get()); - } - - context->End(mActiveQuery->query.get()); - - mPendingQueries.push_back(std::move(mActiveQuery)); - mActiveQuery = std::unique_ptr<QueryState>(new QueryState()); - } - - return flush(false); -} - -gl::Error Query11::resume() -{ - if (!mActiveQuery->query.valid()) - { - ANGLE_TRY(flush(false)); - - GLenum queryType = getType(); - D3D11_QUERY d3dQueryType = gl_d3d11::ConvertQueryType(queryType); - - D3D11_QUERY_DESC queryDesc; - queryDesc.Query = d3dQueryType; - queryDesc.MiscFlags = 0; - - ANGLE_TRY(mRenderer->allocateResource(queryDesc, &mActiveQuery->query)); - - // If we are doing time elapsed we also need a query to actually query the timestamp - if (queryType == GL_TIME_ELAPSED_EXT) - { - D3D11_QUERY_DESC desc; - desc.Query = D3D11_QUERY_TIMESTAMP; - desc.MiscFlags = 0; - - ANGLE_TRY(mRenderer->allocateResource(desc, &mActiveQuery->beginTimestamp)); - ANGLE_TRY(mRenderer->allocateResource(desc, &mActiveQuery->endTimestamp)); - } - - ID3D11DeviceContext *context = mRenderer->getDeviceContext(); - - if (d3dQueryType != D3D11_QUERY_EVENT) - { - context->Begin(mActiveQuery->query.get()); - } - - // If we are doing time elapsed, query the begin timestamp - if (queryType == GL_TIME_ELAPSED_EXT) - { - context->End(mActiveQuery->beginTimestamp.get()); - } - } - - return gl::NoError(); -} - -gl::Error Query11::flush(bool force) -{ - while (!mPendingQueries.empty()) - { - QueryState *query = mPendingQueries.front().get(); - - do - { - ANGLE_TRY(testQuery(query)); - if (!query->finished && !force) - { - return gl::NoError(); - } - } while (!query->finished); - - mResultSum = MergeQueryResults(getType(), mResultSum, mResult); - mPendingQueries.pop_front(); - } - - return gl::NoError(); -} - -gl::Error Query11::testQuery(QueryState *queryState) -{ - if (!queryState->finished) - { - ID3D11DeviceContext *context = mRenderer->getDeviceContext(); - switch (getType()) - { - case GL_ANY_SAMPLES_PASSED_EXT: - case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: - { - ASSERT(queryState->query.valid()); - UINT64 numPixels = 0; - HRESULT result = - context->GetData(queryState->query.get(), &numPixels, sizeof(numPixels), 0); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to get the data of an internal query, " << gl::FmtHR(result); - } - - if (result == S_OK) - { - queryState->finished = true; - mResult = (numPixels > 0) ? GL_TRUE : GL_FALSE; - } - } - break; - - case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: - { - ASSERT(queryState->query.valid()); - D3D11_QUERY_DATA_SO_STATISTICS soStats = {0}; - HRESULT result = - context->GetData(queryState->query.get(), &soStats, sizeof(soStats), 0); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to get the data of an internal query, " << gl::FmtHR(result); - } - - if (result == S_OK) - { - queryState->finished = true; - mResult = static_cast<GLuint64>(soStats.NumPrimitivesWritten); - } - } - break; - - case GL_TIME_ELAPSED_EXT: - { - ASSERT(queryState->query.valid()); - ASSERT(queryState->beginTimestamp.valid()); - ASSERT(queryState->endTimestamp.valid()); - D3D11_QUERY_DATA_TIMESTAMP_DISJOINT timeStats = {0}; - HRESULT result = - context->GetData(queryState->query.get(), &timeStats, sizeof(timeStats), 0); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to get the data of an internal query, " << gl::FmtHR(result); - } - - if (result == S_OK) - { - UINT64 beginTime = 0; - HRESULT beginRes = context->GetData(queryState->beginTimestamp.get(), - &beginTime, sizeof(UINT64), 0); - if (FAILED(beginRes)) - { - return gl::OutOfMemory() << "Failed to get the data of an internal query, " - << gl::FmtHR(beginRes); - } - UINT64 endTime = 0; - HRESULT endRes = context->GetData(queryState->endTimestamp.get(), &endTime, - sizeof(UINT64), 0); - if (FAILED(endRes)) - { - return gl::OutOfMemory() << "Failed to get the data of an internal query, " - << gl::FmtHR(endRes); - } - - if (beginRes == S_OK && endRes == S_OK) - { - queryState->finished = true; - if (timeStats.Disjoint) - { - mRenderer->setGPUDisjoint(); - } - static_assert(sizeof(UINT64) == sizeof(unsigned long long), - "D3D UINT64 isn't 64 bits"); - - angle::CheckedNumeric<UINT64> checkedTime(endTime); - checkedTime -= beginTime; - checkedTime *= 1000000000ull; - checkedTime /= timeStats.Frequency; - if (checkedTime.IsValid()) - { - mResult = checkedTime.ValueOrDie(); - } - else - { - mResult = std::numeric_limits<GLuint64>::max() / timeStats.Frequency; - // If an overflow does somehow occur, there is no way the elapsed time - // is accurate, so we generate a disjoint event - mRenderer->setGPUDisjoint(); - } - } - } - } - break; - - case GL_TIMESTAMP_EXT: - { - // D3D11 doesn't support GL timestamp queries as D3D timestamps are not guaranteed - // to have any sort of continuity outside of a disjoint timestamp query block, which - // GL depends on - ASSERT(!queryState->query.valid()); - mResult = 0; - queryState->finished = true; - } - break; - - case GL_COMMANDS_COMPLETED_CHROMIUM: - { - ASSERT(queryState->query.valid()); - BOOL completed = 0; - HRESULT result = - context->GetData(queryState->query.get(), &completed, sizeof(completed), 0); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to get the data of an internal query, " << gl::FmtHR(result); - } - - if (result == S_OK) - { - queryState->finished = true; - ASSERT(completed == TRUE); - mResult = (completed == TRUE) ? GL_TRUE : GL_FALSE; - } - } - break; - - default: - UNREACHABLE(); - break; - } - - if (!queryState->finished && mRenderer->testDeviceLost()) - { - mRenderer->notifyDeviceLost(); - return gl::OutOfMemory() << "Failed to test get query result, device is lost."; - } - } - - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h deleted file mode 100644 index a88a8892aa..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h +++ /dev/null @@ -1,68 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// Query11.h: Defines the rx::Query11 class which implements rx::QueryImpl. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_QUERY11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_QUERY11_H_ - -#include <deque> - -#include "libANGLE/renderer/QueryImpl.h" -#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" - -namespace rx -{ -class Renderer11; - -class Query11 : public QueryImpl -{ - public: - Query11(Renderer11 *renderer, GLenum type); - ~Query11() override; - - gl::Error begin() override; - gl::Error end() override; - gl::Error queryCounter() override; - gl::Error getResult(GLint *params) override; - gl::Error getResult(GLuint *params) override; - gl::Error getResult(GLint64 *params) override; - gl::Error getResult(GLuint64 *params) override; - gl::Error isResultAvailable(bool *available) override; - - gl::Error pause(); - gl::Error resume(); - - private: - struct QueryState final : private angle::NonCopyable - { - QueryState(); - ~QueryState(); - - d3d11::Query query; - d3d11::Query beginTimestamp; - d3d11::Query endTimestamp; - bool finished; - }; - - gl::Error flush(bool force); - gl::Error testQuery(QueryState *queryState); - - template <typename T> - gl::Error getResultBase(T *params); - - GLuint64 mResult; - GLuint64 mResultSum; - - Renderer11 *mRenderer; - - std::unique_ptr<QueryState> mActiveQuery; - std::deque<std::unique_ptr<QueryState>> mPendingQueries; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D11_QUERY11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp deleted file mode 100644 index 5b85196c2e..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp +++ /dev/null @@ -1,273 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// RenderStateCache.cpp: Defines rx::RenderStateCache, a cache of Direct3D render -// state objects. - -#include "libANGLE/renderer/d3d/d3d11/RenderStateCache.h" - -#include <float.h> - -#include "common/debug.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/renderer/d3d/FramebufferD3D.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" - -namespace rx -{ -using namespace gl_d3d11; - -RenderStateCache::RenderStateCache() - : mBlendStateCache(kMaxStates), - mRasterizerStateCache(kMaxStates), - mDepthStencilStateCache(kMaxStates), - mSamplerStateCache(kMaxStates) -{ -} - -RenderStateCache::~RenderStateCache() -{ -} - -void RenderStateCache::clear() -{ - mBlendStateCache.Clear(); - mRasterizerStateCache.Clear(); - mDepthStencilStateCache.Clear(); - mSamplerStateCache.Clear(); -} - -// static -d3d11::BlendStateKey RenderStateCache::GetBlendStateKey(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::BlendState &blendState) -{ - d3d11::BlendStateKey key; - FramebufferD3D *framebufferD3D = GetImplAs<FramebufferD3D>(framebuffer); - const gl::AttachmentList &colorbuffers = framebufferD3D->getColorAttachmentsForRender(context); - const UINT8 blendStateMask = - gl_d3d11::ConvertColorMask(blendState.colorMaskRed, blendState.colorMaskGreen, - blendState.colorMaskBlue, blendState.colorMaskAlpha); - - key.blendState = blendState; - - for (size_t i = 0; i < colorbuffers.size(); i++) - { - const gl::FramebufferAttachment *attachment = colorbuffers[i]; - - if (attachment) - { - key.rtvMax = static_cast<uint32_t>(i) + 1; - key.rtvMasks[i] = - (gl_d3d11::GetColorMask(*attachment->getFormat().info)) & blendStateMask; - } - } - - return key; -} - -gl::Error RenderStateCache::getBlendState(Renderer11 *renderer, - const d3d11::BlendStateKey &key, - const d3d11::BlendState **outBlendState) -{ - auto keyIter = mBlendStateCache.Get(key); - if (keyIter != mBlendStateCache.end()) - { - *outBlendState = &keyIter->second; - return gl::NoError(); - } - - TrimCache(kMaxStates, kGCLimit, "blend state", &mBlendStateCache); - - // Create a new blend state and insert it into the cache - D3D11_BLEND_DESC blendDesc; - D3D11_RENDER_TARGET_BLEND_DESC &rtDesc0 = blendDesc.RenderTarget[0]; - const gl::BlendState &blendState = key.blendState; - - blendDesc.AlphaToCoverageEnable = blendState.sampleAlphaToCoverage; - blendDesc.IndependentBlendEnable = key.rtvMax > 1 ? TRUE : FALSE; - - rtDesc0 = {}; - - if (blendState.blend) - { - rtDesc0.BlendEnable = true; - rtDesc0.SrcBlend = gl_d3d11::ConvertBlendFunc(blendState.sourceBlendRGB, false); - rtDesc0.DestBlend = gl_d3d11::ConvertBlendFunc(blendState.destBlendRGB, false); - rtDesc0.BlendOp = gl_d3d11::ConvertBlendOp(blendState.blendEquationRGB); - rtDesc0.SrcBlendAlpha = gl_d3d11::ConvertBlendFunc(blendState.sourceBlendAlpha, true); - rtDesc0.DestBlendAlpha = gl_d3d11::ConvertBlendFunc(blendState.destBlendAlpha, true); - rtDesc0.BlendOpAlpha = gl_d3d11::ConvertBlendOp(blendState.blendEquationAlpha); - } - - rtDesc0.RenderTargetWriteMask = key.rtvMasks[0]; - - for (unsigned int i = 1; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++) - { - blendDesc.RenderTarget[i] = rtDesc0; - blendDesc.RenderTarget[i].RenderTargetWriteMask = key.rtvMasks[i]; - } - - d3d11::BlendState d3dBlendState; - ANGLE_TRY(renderer->allocateResource(blendDesc, &d3dBlendState)); - const auto &iter = mBlendStateCache.Put(key, std::move(d3dBlendState)); - - *outBlendState = &iter->second; - - return gl::NoError(); -} - -gl::Error RenderStateCache::getRasterizerState(Renderer11 *renderer, - const gl::RasterizerState &rasterState, - bool scissorEnabled, - ID3D11RasterizerState **outRasterizerState) -{ - d3d11::RasterizerStateKey key; - key.rasterizerState = rasterState; - key.scissorEnabled = scissorEnabled ? 1 : 0; - - auto keyIter = mRasterizerStateCache.Get(key); - if (keyIter != mRasterizerStateCache.end()) - { - *outRasterizerState = keyIter->second.get(); - return gl::NoError(); - } - - TrimCache(kMaxStates, kGCLimit, "rasterizer state", &mRasterizerStateCache); - - D3D11_CULL_MODE cullMode = - gl_d3d11::ConvertCullMode(rasterState.cullFace, rasterState.cullMode); - - // Disable culling if drawing points - if (rasterState.pointDrawMode) - { - cullMode = D3D11_CULL_NONE; - } - - D3D11_RASTERIZER_DESC rasterDesc; - rasterDesc.FillMode = D3D11_FILL_SOLID; - rasterDesc.CullMode = cullMode; - rasterDesc.FrontCounterClockwise = (rasterState.frontFace == GL_CCW) ? FALSE : TRUE; - rasterDesc.DepthBiasClamp = 0.0f; // MSDN documentation of DepthBiasClamp implies a value of - // zero will preform no clamping, must be tested though. - rasterDesc.DepthClipEnable = TRUE; - rasterDesc.ScissorEnable = scissorEnabled ? TRUE : FALSE; - rasterDesc.MultisampleEnable = rasterState.multiSample; - rasterDesc.AntialiasedLineEnable = FALSE; - - if (rasterState.polygonOffsetFill) - { - rasterDesc.SlopeScaledDepthBias = rasterState.polygonOffsetFactor; - rasterDesc.DepthBias = (INT)rasterState.polygonOffsetUnits; - } - else - { - rasterDesc.SlopeScaledDepthBias = 0.0f; - rasterDesc.DepthBias = 0; - } - - d3d11::RasterizerState dx11RasterizerState; - ANGLE_TRY(renderer->allocateResource(rasterDesc, &dx11RasterizerState)); - *outRasterizerState = dx11RasterizerState.get(); - mRasterizerStateCache.Put(key, std::move(dx11RasterizerState)); - - return gl::NoError(); -} - -gl::Error RenderStateCache::getDepthStencilState(Renderer11 *renderer, - const gl::DepthStencilState &glState, - const d3d11::DepthStencilState **outDSState) -{ - auto keyIter = mDepthStencilStateCache.Get(glState); - if (keyIter != mDepthStencilStateCache.end()) - { - *outDSState = &keyIter->second; - return gl::NoError(); - } - - TrimCache(kMaxStates, kGCLimit, "depth stencil state", &mDepthStencilStateCache); - - D3D11_DEPTH_STENCIL_DESC dsDesc = {0}; - dsDesc.DepthEnable = glState.depthTest ? TRUE : FALSE; - dsDesc.DepthWriteMask = ConvertDepthMask(glState.depthMask); - dsDesc.DepthFunc = ConvertComparison(glState.depthFunc); - dsDesc.StencilEnable = glState.stencilTest ? TRUE : FALSE; - dsDesc.StencilReadMask = ConvertStencilMask(glState.stencilMask); - dsDesc.StencilWriteMask = ConvertStencilMask(glState.stencilWritemask); - dsDesc.FrontFace.StencilFailOp = ConvertStencilOp(glState.stencilFail); - dsDesc.FrontFace.StencilDepthFailOp = ConvertStencilOp(glState.stencilPassDepthFail); - dsDesc.FrontFace.StencilPassOp = ConvertStencilOp(glState.stencilPassDepthPass); - dsDesc.FrontFace.StencilFunc = ConvertComparison(glState.stencilFunc); - dsDesc.BackFace.StencilFailOp = ConvertStencilOp(glState.stencilBackFail); - dsDesc.BackFace.StencilDepthFailOp = ConvertStencilOp(glState.stencilBackPassDepthFail); - dsDesc.BackFace.StencilPassOp = ConvertStencilOp(glState.stencilBackPassDepthPass); - dsDesc.BackFace.StencilFunc = ConvertComparison(glState.stencilBackFunc); - - d3d11::DepthStencilState dx11DepthStencilState; - ANGLE_TRY(renderer->allocateResource(dsDesc, &dx11DepthStencilState)); - const auto &iter = mDepthStencilStateCache.Put(glState, std::move(dx11DepthStencilState)); - - *outDSState = &iter->second; - - return gl::NoError(); -} - -gl::Error RenderStateCache::getSamplerState(Renderer11 *renderer, - const gl::SamplerState &samplerState, - ID3D11SamplerState **outSamplerState) -{ - auto keyIter = mSamplerStateCache.Get(samplerState); - if (keyIter != mSamplerStateCache.end()) - { - *outSamplerState = keyIter->second.get(); - return gl::NoError(); - } - - TrimCache(kMaxStates, kGCLimit, "sampler state", &mSamplerStateCache); - - const auto &featureLevel = renderer->getRenderer11DeviceCaps().featureLevel; - - D3D11_SAMPLER_DESC samplerDesc; - samplerDesc.Filter = - gl_d3d11::ConvertFilter(samplerState.minFilter, samplerState.magFilter, - samplerState.maxAnisotropy, samplerState.compareMode); - samplerDesc.AddressU = gl_d3d11::ConvertTextureWrap(samplerState.wrapS); - samplerDesc.AddressV = gl_d3d11::ConvertTextureWrap(samplerState.wrapT); - samplerDesc.AddressW = gl_d3d11::ConvertTextureWrap(samplerState.wrapR); - samplerDesc.MipLODBias = 0; - samplerDesc.MaxAnisotropy = - gl_d3d11::ConvertMaxAnisotropy(samplerState.maxAnisotropy, featureLevel); - samplerDesc.ComparisonFunc = gl_d3d11::ConvertComparison(samplerState.compareFunc); - samplerDesc.BorderColor[0] = 0.0f; - samplerDesc.BorderColor[1] = 0.0f; - samplerDesc.BorderColor[2] = 0.0f; - samplerDesc.BorderColor[3] = 0.0f; - samplerDesc.MinLOD = samplerState.minLod; - samplerDesc.MaxLOD = samplerState.maxLod; - - if (featureLevel <= D3D_FEATURE_LEVEL_9_3) - { - // Check that maxLOD is nearly FLT_MAX (1000.0f is the default), since 9_3 doesn't support - // anything other than FLT_MAX. Note that Feature Level 9_* only supports GL ES 2.0, so the - // consumer of ANGLE can't modify the Max LOD themselves. - ASSERT(samplerState.maxLod >= 999.9f); - - // Now just set MaxLOD to FLT_MAX. Other parts of the renderer (e.g. the non-zero max LOD - // workaround) should take account of this. - samplerDesc.MaxLOD = FLT_MAX; - } - - d3d11::SamplerState dx11SamplerState; - ANGLE_TRY(renderer->allocateResource(samplerDesc, &dx11SamplerState)); - *outSamplerState = dx11SamplerState.get(); - mSamplerStateCache.Put(samplerState, std::move(dx11SamplerState)); - - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h deleted file mode 100644 index 7501e83fc4..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h +++ /dev/null @@ -1,123 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// RenderStateCache.h: Defines rx::RenderStateCache, a cache of Direct3D render -// state objects. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_ - -#include "common/angleutils.h" -#include "libANGLE/Error.h" -#include "libANGLE/SizedMRUCache.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -#include <unordered_map> - -namespace gl -{ -class Framebuffer; -} - -namespace std -{ -template <> -struct hash<rx::d3d11::BlendStateKey> -{ - size_t operator()(const rx::d3d11::BlendStateKey &key) const - { - return angle::ComputeGenericHash(key); - } -}; - -template <> -struct hash<rx::d3d11::RasterizerStateKey> -{ - size_t operator()(const rx::d3d11::RasterizerStateKey &key) const - { - return angle::ComputeGenericHash(key); - } -}; - -template <> -struct hash<gl::DepthStencilState> -{ - size_t operator()(const gl::DepthStencilState &key) const - { - return angle::ComputeGenericHash(key); - } -}; - -template <> -struct hash<gl::SamplerState> -{ - size_t operator()(const gl::SamplerState &key) const { return angle::ComputeGenericHash(key); } -}; -} // namespace std - -namespace rx -{ -class Renderer11; - -class RenderStateCache : angle::NonCopyable -{ - public: - RenderStateCache(); - virtual ~RenderStateCache(); - - void clear(); - - static d3d11::BlendStateKey GetBlendStateKey(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::BlendState &blendState); - gl::Error getBlendState(Renderer11 *renderer, - const d3d11::BlendStateKey &key, - const d3d11::BlendState **outBlendState); - gl::Error getRasterizerState(Renderer11 *renderer, - const gl::RasterizerState &rasterState, - bool scissorEnabled, - ID3D11RasterizerState **outRasterizerState); - gl::Error getDepthStencilState(Renderer11 *renderer, - const gl::DepthStencilState &dsState, - const d3d11::DepthStencilState **outDSState); - gl::Error getSamplerState(Renderer11 *renderer, - const gl::SamplerState &samplerState, - ID3D11SamplerState **outSamplerState); - - private: - // MSDN's documentation of ID3D11Device::CreateBlendState, ID3D11Device::CreateRasterizerState, - // ID3D11Device::CreateDepthStencilState and ID3D11Device::CreateSamplerState claims the maximum - // number of unique states of each type an application can create is 4096 - // TODO(ShahmeerEsmail): Revisit the cache sizes to make sure they are appropriate for most - // scenarios. - static constexpr unsigned int kMaxStates = 4096; - - // The cache tries to clean up this many states at once. - static constexpr unsigned int kGCLimit = 128; - - // Blend state cache - using BlendStateMap = angle::base::HashingMRUCache<d3d11::BlendStateKey, d3d11::BlendState>; - BlendStateMap mBlendStateCache; - - // Rasterizer state cache - using RasterizerStateMap = - angle::base::HashingMRUCache<d3d11::RasterizerStateKey, d3d11::RasterizerState>; - RasterizerStateMap mRasterizerStateCache; - - // Depth stencil state cache - using DepthStencilStateMap = - angle::base::HashingMRUCache<gl::DepthStencilState, d3d11::DepthStencilState>; - DepthStencilStateMap mDepthStencilStateCache; - - // Sample state cache - using SamplerStateMap = angle::base::HashingMRUCache<gl::SamplerState, d3d11::SamplerState>; - SamplerStateMap mSamplerStateCache; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp deleted file mode 100644 index 594a382a72..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp +++ /dev/null @@ -1,405 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// RenderTarget11.cpp: Implements a DX11-specific wrapper for ID3D11View pointers -// retained by Renderbuffers. - -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" - -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/SwapChain11.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" - -namespace rx -{ - -namespace -{ -bool GetTextureProperties(ID3D11Resource *resource, unsigned int *mipLevels, unsigned int *samples) -{ - ID3D11Texture1D *texture1D = d3d11::DynamicCastComObject<ID3D11Texture1D>(resource); - if (texture1D) - { - D3D11_TEXTURE1D_DESC texDesc; - texture1D->GetDesc(&texDesc); - SafeRelease(texture1D); - - *mipLevels = texDesc.MipLevels; - *samples = 0; - - return true; - } - - ID3D11Texture2D *texture2D = d3d11::DynamicCastComObject<ID3D11Texture2D>(resource); - if (texture2D) - { - D3D11_TEXTURE2D_DESC texDesc; - texture2D->GetDesc(&texDesc); - SafeRelease(texture2D); - - *mipLevels = texDesc.MipLevels; - *samples = texDesc.SampleDesc.Count > 1 ? texDesc.SampleDesc.Count : 0; - - return true; - } - - ID3D11Texture3D *texture3D = d3d11::DynamicCastComObject<ID3D11Texture3D>(resource); - if (texture3D) - { - D3D11_TEXTURE3D_DESC texDesc; - texture3D->GetDesc(&texDesc); - SafeRelease(texture3D); - - *mipLevels = texDesc.MipLevels; - *samples = 0; - - return true; - } - - return false; -} - -unsigned int GetRTVSubresourceIndex(ID3D11Resource *resource, ID3D11RenderTargetView *view) -{ - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - view->GetDesc(&rtvDesc); - - unsigned int mipSlice = 0; - unsigned int arraySlice = 0; - - switch (rtvDesc.ViewDimension) - { - case D3D11_RTV_DIMENSION_TEXTURE1D: - mipSlice = rtvDesc.Texture1D.MipSlice; - arraySlice = 0; - break; - - case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: - mipSlice = rtvDesc.Texture1DArray.MipSlice; - arraySlice = rtvDesc.Texture1DArray.FirstArraySlice; - break; - - case D3D11_RTV_DIMENSION_TEXTURE2D: - mipSlice = rtvDesc.Texture2D.MipSlice; - arraySlice = 0; - break; - - case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: - mipSlice = rtvDesc.Texture2DArray.MipSlice; - arraySlice = rtvDesc.Texture2DArray.FirstArraySlice; - break; - - case D3D11_RTV_DIMENSION_TEXTURE2DMS: - mipSlice = 0; - arraySlice = 0; - break; - - case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: - mipSlice = 0; - arraySlice = rtvDesc.Texture2DMSArray.FirstArraySlice; - break; - - case D3D11_RTV_DIMENSION_TEXTURE3D: - mipSlice = rtvDesc.Texture3D.MipSlice; - arraySlice = 0; - break; - - case D3D11_RTV_DIMENSION_UNKNOWN: - case D3D11_RTV_DIMENSION_BUFFER: - UNIMPLEMENTED(); - break; - - default: - UNREACHABLE(); - break; - } - - unsigned int mipLevels, samples; - GetTextureProperties(resource, &mipLevels, &samples); - - return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels); -} - -unsigned int GetDSVSubresourceIndex(ID3D11Resource *resource, ID3D11DepthStencilView *view) -{ - D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; - view->GetDesc(&dsvDesc); - - unsigned int mipSlice = 0; - unsigned int arraySlice = 0; - - switch (dsvDesc.ViewDimension) - { - case D3D11_DSV_DIMENSION_TEXTURE1D: - mipSlice = dsvDesc.Texture1D.MipSlice; - arraySlice = 0; - break; - - case D3D11_DSV_DIMENSION_TEXTURE1DARRAY: - mipSlice = dsvDesc.Texture1DArray.MipSlice; - arraySlice = dsvDesc.Texture1DArray.FirstArraySlice; - break; - - case D3D11_DSV_DIMENSION_TEXTURE2D: - mipSlice = dsvDesc.Texture2D.MipSlice; - arraySlice = 0; - break; - - case D3D11_DSV_DIMENSION_TEXTURE2DARRAY: - mipSlice = dsvDesc.Texture2DArray.MipSlice; - arraySlice = dsvDesc.Texture2DArray.FirstArraySlice; - break; - - case D3D11_DSV_DIMENSION_TEXTURE2DMS: - mipSlice = 0; - arraySlice = 0; - break; - - case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY: - mipSlice = 0; - arraySlice = dsvDesc.Texture2DMSArray.FirstArraySlice; - break; - - case D3D11_DSV_DIMENSION_UNKNOWN: - UNIMPLEMENTED(); - break; - - default: - UNREACHABLE(); - break; - } - - unsigned int mipLevels, samples; - GetTextureProperties(resource, &mipLevels, &samples); - - return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels); -} - -GLenum GetSurfaceRTFormat(bool depth, SwapChain11 *swapChain) -{ - return (depth ? swapChain->getDepthBufferInternalFormat() - : swapChain->getRenderTargetInternalFormat()); -} - -const d3d11::Format &GetSurfaceFormatSet(bool depth, SwapChain11 *swapChain, Renderer11 *renderer) -{ - return d3d11::Format::Get(GetSurfaceRTFormat(depth, swapChain), - renderer->getRenderer11DeviceCaps()); -} - -} // anonymous namespace - -RenderTarget11::RenderTarget11(const d3d11::Format &formatSet) : mFormatSet(formatSet) -{ -} - -RenderTarget11::~RenderTarget11() -{ - ASSERT(mBroadcastChannel.empty()); -} - -void RenderTarget11::signalDirty(const gl::Context *context) -{ - mBroadcastChannel.signal(context); - - // Clear the list. We can't do this in the receiver because it would mutate during iteration. - mBroadcastChannel.reset(); -} - -TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv, - const TextureHelper11 &resource, - const d3d11::SharedSRV &srv, - const d3d11::SharedSRV &blitSRV, - GLenum internalFormat, - const d3d11::Format &formatSet, - GLsizei width, - GLsizei height, - GLsizei depth, - GLsizei samples) - : RenderTarget11(formatSet), - mWidth(width), - mHeight(height), - mDepth(depth), - mInternalFormat(internalFormat), - mSamples(samples), - mSubresourceIndex(0), - mTexture(resource), - mRenderTarget(std::move(rtv)), - mDepthStencil(), - mShaderResource(srv.makeCopy()), - mBlitShaderResource(blitSRV.makeCopy()) -{ - if (mRenderTarget.valid() && mTexture.valid()) - { - mSubresourceIndex = GetRTVSubresourceIndex(mTexture.get(), mRenderTarget.get()); - } - ASSERT(mFormatSet.formatID != angle::Format::ID::NONE || mWidth == 0 || mHeight == 0); -} - -TextureRenderTarget11::TextureRenderTarget11(d3d11::DepthStencilView &&dsv, - const TextureHelper11 &resource, - const d3d11::SharedSRV &srv, - GLenum internalFormat, - const d3d11::Format &formatSet, - GLsizei width, - GLsizei height, - GLsizei depth, - GLsizei samples) - : RenderTarget11(formatSet), - mWidth(width), - mHeight(height), - mDepth(depth), - mInternalFormat(internalFormat), - mSamples(samples), - mSubresourceIndex(0), - mTexture(resource), - mRenderTarget(), - mDepthStencil(std::move(dsv)), - mShaderResource(srv.makeCopy()), - mBlitShaderResource() -{ - if (mDepthStencil.valid() && mTexture.valid()) - { - mSubresourceIndex = GetDSVSubresourceIndex(mTexture.get(), mDepthStencil.get()); - } - ASSERT(mFormatSet.formatID != angle::Format::ID::NONE || mWidth == 0 || mHeight == 0); -} - -TextureRenderTarget11::~TextureRenderTarget11() -{ -} - -const TextureHelper11 &TextureRenderTarget11::getTexture() const -{ - return mTexture; -} - -const d3d11::RenderTargetView &TextureRenderTarget11::getRenderTargetView() const -{ - return mRenderTarget; -} - -const d3d11::DepthStencilView &TextureRenderTarget11::getDepthStencilView() const -{ - return mDepthStencil; -} - -const d3d11::SharedSRV &TextureRenderTarget11::getShaderResourceView() const -{ - return mShaderResource; -} - -const d3d11::SharedSRV &TextureRenderTarget11::getBlitShaderResourceView() const -{ - return mBlitShaderResource; -} - -GLsizei TextureRenderTarget11::getWidth() const -{ - return mWidth; -} - -GLsizei TextureRenderTarget11::getHeight() const -{ - return mHeight; -} - -GLsizei TextureRenderTarget11::getDepth() const -{ - return mDepth; -} - -GLenum TextureRenderTarget11::getInternalFormat() const -{ - return mInternalFormat; -} - -GLsizei TextureRenderTarget11::getSamples() const -{ - return mSamples; -} - -unsigned int TextureRenderTarget11::getSubresourceIndex() const -{ - return mSubresourceIndex; -} - -SurfaceRenderTarget11::SurfaceRenderTarget11(SwapChain11 *swapChain, - Renderer11 *renderer, - bool depth) - : RenderTarget11(GetSurfaceFormatSet(depth, swapChain, renderer)), - mSwapChain(swapChain), - mDepth(depth) -{ - ASSERT(mSwapChain); -} - -SurfaceRenderTarget11::~SurfaceRenderTarget11() -{ -} - -GLsizei SurfaceRenderTarget11::getWidth() const -{ - return mSwapChain->getWidth(); -} - -GLsizei SurfaceRenderTarget11::getHeight() const -{ - return mSwapChain->getHeight(); -} - -GLsizei SurfaceRenderTarget11::getDepth() const -{ - return 1; -} - -GLenum SurfaceRenderTarget11::getInternalFormat() const -{ - return GetSurfaceRTFormat(mDepth, mSwapChain); -} - -GLsizei SurfaceRenderTarget11::getSamples() const -{ - return mSwapChain->getSamples(); -} - -const TextureHelper11 &SurfaceRenderTarget11::getTexture() const -{ - return (mDepth ? mSwapChain->getDepthStencilTexture() : mSwapChain->getOffscreenTexture()); -} - -const d3d11::RenderTargetView &SurfaceRenderTarget11::getRenderTargetView() const -{ - ASSERT(!mDepth); - return mSwapChain->getRenderTarget(); -} - -const d3d11::DepthStencilView &SurfaceRenderTarget11::getDepthStencilView() const -{ - ASSERT(mDepth); - return mSwapChain->getDepthStencil(); -} - -const d3d11::SharedSRV &SurfaceRenderTarget11::getShaderResourceView() const -{ - return (mDepth ? mSwapChain->getDepthStencilShaderResource() - : mSwapChain->getRenderTargetShaderResource()); -} - -const d3d11::SharedSRV &SurfaceRenderTarget11::getBlitShaderResourceView() const -{ - // The SurfaceRenderTargetView format should always be such that the normal SRV works for blits. - return getShaderResourceView(); -} - -unsigned int SurfaceRenderTarget11::getSubresourceIndex() const -{ - return 0; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h deleted file mode 100644 index db49cac9f5..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h +++ /dev/null @@ -1,131 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// RenderTarget11.h: Defines a DX11-specific wrapper for ID3D11View pointers -// retained by Renderbuffers. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_ - -#include "libANGLE/renderer/d3d/RenderTargetD3D.h" -#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" - -namespace rx -{ -class SwapChain11; -class Renderer11; - -class RenderTarget11 : public RenderTargetD3D -{ - public: - RenderTarget11(const d3d11::Format &formatSet); - ~RenderTarget11() override; - - virtual const TextureHelper11 &getTexture() const = 0; - virtual const d3d11::RenderTargetView &getRenderTargetView() const = 0; - virtual const d3d11::DepthStencilView &getDepthStencilView() const = 0; - virtual const d3d11::SharedSRV &getShaderResourceView() const = 0; - virtual const d3d11::SharedSRV &getBlitShaderResourceView() const = 0; - - virtual unsigned int getSubresourceIndex() const = 0; - - void signalDirty(const gl::Context *context) override; - OnRenderTargetDirtyChannel *getBroadcastChannel() { return &mBroadcastChannel; } - - const d3d11::Format &getFormatSet() const { return mFormatSet; } - - protected: - OnRenderTargetDirtyChannel mBroadcastChannel; - const d3d11::Format &mFormatSet; -}; - -class TextureRenderTarget11 : public RenderTarget11 -{ - public: - // TextureRenderTarget11 takes ownership of any D3D11 resources it is given and will AddRef them - TextureRenderTarget11(d3d11::RenderTargetView &&rtv, - const TextureHelper11 &resource, - const d3d11::SharedSRV &srv, - const d3d11::SharedSRV &blitSRV, - GLenum internalFormat, - const d3d11::Format &formatSet, - GLsizei width, - GLsizei height, - GLsizei depth, - GLsizei samples); - TextureRenderTarget11(d3d11::DepthStencilView &&dsv, - const TextureHelper11 &resource, - const d3d11::SharedSRV &srv, - GLenum internalFormat, - const d3d11::Format &formatSet, - GLsizei width, - GLsizei height, - GLsizei depth, - GLsizei samples); - ~TextureRenderTarget11() override; - - GLsizei getWidth() const override; - GLsizei getHeight() const override; - GLsizei getDepth() const override; - GLenum getInternalFormat() const override; - GLsizei getSamples() const override; - - const TextureHelper11 &getTexture() const override; - const d3d11::RenderTargetView &getRenderTargetView() const override; - const d3d11::DepthStencilView &getDepthStencilView() const override; - const d3d11::SharedSRV &getShaderResourceView() const override; - const d3d11::SharedSRV &getBlitShaderResourceView() const override; - - unsigned int getSubresourceIndex() const override; - - private: - GLsizei mWidth; - GLsizei mHeight; - GLsizei mDepth; - GLenum mInternalFormat; - GLsizei mSamples; - - unsigned int mSubresourceIndex; - TextureHelper11 mTexture; - d3d11::RenderTargetView mRenderTarget; - d3d11::DepthStencilView mDepthStencil; - d3d11::SharedSRV mShaderResource; - - // Shader resource view to use with internal blit shaders. Not set for depth/stencil render - // targets. - d3d11::SharedSRV mBlitShaderResource; -}; - -class SurfaceRenderTarget11 : public RenderTarget11 -{ - public: - SurfaceRenderTarget11(SwapChain11 *swapChain, Renderer11 *renderer, bool depth); - ~SurfaceRenderTarget11() override; - - GLsizei getWidth() const override; - GLsizei getHeight() const override; - GLsizei getDepth() const override; - GLenum getInternalFormat() const override; - GLsizei getSamples() const override; - - const TextureHelper11 &getTexture() const override; - const d3d11::RenderTargetView &getRenderTargetView() const override; - const d3d11::DepthStencilView &getDepthStencilView() const override; - const d3d11::SharedSRV &getShaderResourceView() const override; - const d3d11::SharedSRV &getBlitShaderResourceView() const override; - - unsigned int getSubresourceIndex() const override; - - private: - SwapChain11 *mSwapChain; - bool mDepth; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp deleted file mode 100644 index b0ef9abddc..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp +++ /dev/null @@ -1,4089 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// Renderer11.cpp: Implements a back-end specific class for the D3D11 renderer. - -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" - -#include <EGL/eglext.h> -#include <versionhelpers.h> -#include <sstream> - -#include "common/tls.h" -#include "common/utilities.h" -#include "libANGLE/Buffer.h" -#include "libANGLE/Context.h" -#include "libANGLE/Display.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/Program.h" -#include "libANGLE/State.h" -#include "libANGLE/Surface.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/histogram_macros.h" -#include "libANGLE/renderer/d3d/CompilerD3D.h" -#include "libANGLE/renderer/d3d/DeviceD3D.h" -#include "libANGLE/renderer/d3d/DisplayD3D.h" -#include "libANGLE/renderer/d3d/FramebufferD3D.h" -#include "libANGLE/renderer/d3d/IndexDataManager.h" -#include "libANGLE/renderer/d3d/ProgramD3D.h" -#include "libANGLE/renderer/d3d/RenderbufferD3D.h" -#include "libANGLE/renderer/d3d/ShaderD3D.h" -#include "libANGLE/renderer/d3d/SurfaceD3D.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" -#include "libANGLE/renderer/d3d/VertexDataManager.h" -#include "libANGLE/renderer/d3d/d3d11/Blit11.h" -#include "libANGLE/renderer/d3d/d3d11/Buffer11.h" -#include "libANGLE/renderer/d3d/d3d11/Clear11.h" -#include "libANGLE/renderer/d3d/d3d11/Context11.h" -#include "libANGLE/renderer/d3d/d3d11/Fence11.h" -#include "libANGLE/renderer/d3d/d3d11/Framebuffer11.h" -#include "libANGLE/renderer/d3d/d3d11/Image11.h" -#include "libANGLE/renderer/d3d/d3d11/IndexBuffer11.h" -#include "libANGLE/renderer/d3d/d3d11/PixelTransfer11.h" -#include "libANGLE/renderer/d3d/d3d11/Query11.h" -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" -#include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h" -#include "libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h" -#include "libANGLE/renderer/d3d/d3d11/SwapChain11.h" -#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h" -#include "libANGLE/renderer/d3d/d3d11/TransformFeedback11.h" -#include "libANGLE/renderer/d3d/d3d11/Trim11.h" -#include "libANGLE/renderer/d3d/d3d11/VertexArray11.h" -#include "libANGLE/renderer/d3d/d3d11/VertexBuffer11.h" -#include "libANGLE/renderer/d3d/d3d11/dxgi_support_table.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" -#include "libANGLE/renderer/renderer_utils.h" -#include "third_party/trace_event/trace_event.h" - -#ifdef ANGLE_ENABLE_WINDOWS_STORE -#include "libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h" -#else -#include "libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h" -#endif - -// Include the D3D9 debug annotator header for use by the desktop D3D11 renderer -// because the D3D11 interface method ID3DUserDefinedAnnotation::GetStatus -// doesn't work with the Graphics Diagnostics tools in Visual Studio 2013. -#ifdef ANGLE_ENABLE_D3D9 -#include "libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h" -#endif - -// Enable ANGLE_SKIP_DXGI_1_2_CHECK if there is not a possibility of using cross-process -// HWNDs or the Windows 7 Platform Update (KB2670838) is expected to be installed. -#ifndef ANGLE_SKIP_DXGI_1_2_CHECK -#define ANGLE_SKIP_DXGI_1_2_CHECK 0 -#endif - -namespace rx -{ - -namespace -{ - -enum -{ - MAX_TEXTURE_IMAGE_UNITS_VTF_SM4 = 16 -}; - -enum ANGLEFeatureLevel -{ - ANGLE_FEATURE_LEVEL_INVALID, - ANGLE_FEATURE_LEVEL_9_3, - ANGLE_FEATURE_LEVEL_10_0, - ANGLE_FEATURE_LEVEL_10_1, - ANGLE_FEATURE_LEVEL_11_0, - ANGLE_FEATURE_LEVEL_11_1, - NUM_ANGLE_FEATURE_LEVELS -}; - -ANGLEFeatureLevel GetANGLEFeatureLevel(D3D_FEATURE_LEVEL d3dFeatureLevel) -{ - switch (d3dFeatureLevel) - { - case D3D_FEATURE_LEVEL_9_3: - return ANGLE_FEATURE_LEVEL_9_3; - case D3D_FEATURE_LEVEL_10_0: - return ANGLE_FEATURE_LEVEL_10_0; - case D3D_FEATURE_LEVEL_10_1: - return ANGLE_FEATURE_LEVEL_10_1; - case D3D_FEATURE_LEVEL_11_0: - return ANGLE_FEATURE_LEVEL_11_0; - case D3D_FEATURE_LEVEL_11_1: - return ANGLE_FEATURE_LEVEL_11_1; - default: - return ANGLE_FEATURE_LEVEL_INVALID; - } -} - -void SetLineLoopIndices(GLuint *dest, size_t count) -{ - for (size_t i = 0; i < count; i++) - { - dest[i] = static_cast<GLuint>(i); - } - dest[count] = 0; -} - -template <typename T> -void CopyLineLoopIndices(const void *indices, GLuint *dest, size_t count) -{ - const T *srcPtr = static_cast<const T *>(indices); - for (size_t i = 0; i < count; ++i) - { - dest[i] = static_cast<GLuint>(srcPtr[i]); - } - dest[count] = static_cast<GLuint>(srcPtr[0]); -} - -void SetTriangleFanIndices(GLuint *destPtr, size_t numTris) -{ - for (size_t i = 0; i < numTris; i++) - { - destPtr[i * 3 + 0] = 0; - destPtr[i * 3 + 1] = static_cast<GLuint>(i) + 1; - destPtr[i * 3 + 2] = static_cast<GLuint>(i) + 2; - } -} - -template <typename T> -void CopyLineLoopIndicesWithRestart(const void *indices, - size_t count, - GLenum indexType, - std::vector<GLuint> *bufferOut) -{ - GLuint restartIndex = gl::GetPrimitiveRestartIndex(indexType); - GLuint d3dRestartIndex = static_cast<GLuint>(d3d11::GetPrimitiveRestartIndex()); - const T *srcPtr = static_cast<const T *>(indices); - Optional<GLuint> currentLoopStart; - - bufferOut->clear(); - - for (size_t indexIdx = 0; indexIdx < count; ++indexIdx) - { - GLuint value = static_cast<GLuint>(srcPtr[indexIdx]); - - if (value == restartIndex) - { - if (currentLoopStart.valid()) - { - bufferOut->push_back(currentLoopStart.value()); - bufferOut->push_back(d3dRestartIndex); - currentLoopStart.reset(); - } - } - else - { - bufferOut->push_back(value); - if (!currentLoopStart.valid()) - { - currentLoopStart = value; - } - } - } - - if (currentLoopStart.valid()) - { - bufferOut->push_back(currentLoopStart.value()); - } -} - -void GetLineLoopIndices(const void *indices, - GLenum indexType, - GLuint count, - bool usePrimitiveRestartFixedIndex, - std::vector<GLuint> *bufferOut) -{ - if (indexType != GL_NONE && usePrimitiveRestartFixedIndex) - { - switch (indexType) - { - case GL_UNSIGNED_BYTE: - CopyLineLoopIndicesWithRestart<GLubyte>(indices, count, indexType, bufferOut); - break; - case GL_UNSIGNED_SHORT: - CopyLineLoopIndicesWithRestart<GLushort>(indices, count, indexType, bufferOut); - break; - case GL_UNSIGNED_INT: - CopyLineLoopIndicesWithRestart<GLuint>(indices, count, indexType, bufferOut); - break; - default: - UNREACHABLE(); - break; - } - return; - } - - // For non-primitive-restart draws, the index count is static. - bufferOut->resize(static_cast<size_t>(count) + 1); - - switch (indexType) - { - // Non-indexed draw - case GL_NONE: - SetLineLoopIndices(&(*bufferOut)[0], count); - break; - case GL_UNSIGNED_BYTE: - CopyLineLoopIndices<GLubyte>(indices, &(*bufferOut)[0], count); - break; - case GL_UNSIGNED_SHORT: - CopyLineLoopIndices<GLushort>(indices, &(*bufferOut)[0], count); - break; - case GL_UNSIGNED_INT: - CopyLineLoopIndices<GLuint>(indices, &(*bufferOut)[0], count); - break; - default: - UNREACHABLE(); - break; - } -} - -template <typename T> -void CopyTriangleFanIndices(const void *indices, GLuint *destPtr, size_t numTris) -{ - const T *srcPtr = static_cast<const T *>(indices); - - for (size_t i = 0; i < numTris; i++) - { - destPtr[i * 3 + 0] = static_cast<GLuint>(srcPtr[0]); - destPtr[i * 3 + 1] = static_cast<GLuint>(srcPtr[i + 1]); - destPtr[i * 3 + 2] = static_cast<GLuint>(srcPtr[i + 2]); - } -} - -template <typename T> -void CopyTriangleFanIndicesWithRestart(const void *indices, - GLuint indexCount, - GLenum indexType, - std::vector<GLuint> *bufferOut) -{ - GLuint restartIndex = gl::GetPrimitiveRestartIndex(indexType); - GLuint d3dRestartIndex = gl::GetPrimitiveRestartIndex(GL_UNSIGNED_INT); - const T *srcPtr = static_cast<const T *>(indices); - Optional<GLuint> vertexA; - Optional<GLuint> vertexB; - - bufferOut->clear(); - - for (size_t indexIdx = 0; indexIdx < indexCount; ++indexIdx) - { - GLuint value = static_cast<GLuint>(srcPtr[indexIdx]); - - if (value == restartIndex) - { - bufferOut->push_back(d3dRestartIndex); - vertexA.reset(); - vertexB.reset(); - } - else - { - if (!vertexA.valid()) - { - vertexA = value; - } - else if (!vertexB.valid()) - { - vertexB = value; - } - else - { - bufferOut->push_back(vertexA.value()); - bufferOut->push_back(vertexB.value()); - bufferOut->push_back(value); - vertexB = value; - } - } - } -} - -void GetTriFanIndices(const void *indices, - GLenum indexType, - GLuint count, - bool usePrimitiveRestartFixedIndex, - std::vector<GLuint> *bufferOut) -{ - if (indexType != GL_NONE && usePrimitiveRestartFixedIndex) - { - switch (indexType) - { - case GL_UNSIGNED_BYTE: - CopyTriangleFanIndicesWithRestart<GLubyte>(indices, count, indexType, bufferOut); - break; - case GL_UNSIGNED_SHORT: - CopyTriangleFanIndicesWithRestart<GLushort>(indices, count, indexType, bufferOut); - break; - case GL_UNSIGNED_INT: - CopyTriangleFanIndicesWithRestart<GLuint>(indices, count, indexType, bufferOut); - break; - default: - UNREACHABLE(); - break; - } - return; - } - - // For non-primitive-restart draws, the index count is static. - GLuint numTris = count - 2; - bufferOut->resize(numTris * 3); - - switch (indexType) - { - // Non-indexed draw - case GL_NONE: - SetTriangleFanIndices(&(*bufferOut)[0], numTris); - break; - case GL_UNSIGNED_BYTE: - CopyTriangleFanIndices<GLubyte>(indices, &(*bufferOut)[0], numTris); - break; - case GL_UNSIGNED_SHORT: - CopyTriangleFanIndices<GLushort>(indices, &(*bufferOut)[0], numTris); - break; - case GL_UNSIGNED_INT: - CopyTriangleFanIndices<GLuint>(indices, &(*bufferOut)[0], numTris); - break; - default: - UNREACHABLE(); - break; - } -} - -bool DrawCallNeedsTranslation(const gl::Context *context, GLenum mode) -{ - const auto &glState = context->getGLState(); - const gl::VertexArray *vertexArray = glState.getVertexArray(); - VertexArray11 *vertexArray11 = GetImplAs<VertexArray11>(vertexArray); - // Direct drawing doesn't support dynamic attribute storage since it needs the first and count - // to translate when applyVertexBuffer. GL_LINE_LOOP and GL_TRIANGLE_FAN are not supported - // either since we need to simulate them in D3D. - if (vertexArray11->hasActiveDynamicAttrib(context) || mode == GL_LINE_LOOP || - mode == GL_TRIANGLE_FAN) - { - return true; - } - - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram()); - if (InstancedPointSpritesActive(programD3D, mode)) - { - return true; - } - - return false; -} - -bool IsArrayRTV(ID3D11RenderTargetView *rtv) -{ - D3D11_RENDER_TARGET_VIEW_DESC desc; - rtv->GetDesc(&desc); - if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE1DARRAY && - desc.Texture1DArray.ArraySize > 1) - return true; - if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2DARRAY && - desc.Texture2DArray.ArraySize > 1) - return true; - if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY && - desc.Texture2DMSArray.ArraySize > 1) - return true; - return false; -} - -int GetAdjustedInstanceCount(const gl::Program *program, int instanceCount) -{ - if (!program->usesMultiview()) - { - return instanceCount; - } - if (instanceCount == 0) - { - return program->getNumViews(); - } - return program->getNumViews() * instanceCount; -} - -const uint32_t ScratchMemoryBufferLifetime = 1000; - -void PopulateFormatDeviceCaps(ID3D11Device *device, - DXGI_FORMAT format, - UINT *outSupport, - UINT *outMaxSamples) -{ - if (FAILED(device->CheckFormatSupport(format, outSupport))) - { - *outSupport = 0; - } - - *outMaxSamples = 0; - for (UINT sampleCount = 2; sampleCount <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; sampleCount *= 2) - { - UINT qualityCount = 0; - if (FAILED(device->CheckMultisampleQualityLevels(format, sampleCount, &qualityCount)) || - qualityCount == 0) - { - break; - } - - *outMaxSamples = sampleCount; - } -} - -bool CullsEverything(const gl::State &glState) -{ - return (glState.getRasterizerState().cullFace && - glState.getRasterizerState().cullMode == gl::CullFaceMode::FrontAndBack); -} - -} // anonymous namespace - -Renderer11DeviceCaps::Renderer11DeviceCaps() = default; - -Renderer11::Renderer11(egl::Display *display) - : RendererD3D(display), - mCreateDebugDevice(false), - mStateCache(), - mStateManager(this), - mLastHistogramUpdateTime( - ANGLEPlatformCurrent()->monotonicallyIncreasingTime(ANGLEPlatformCurrent())), - mDebug(nullptr), - mScratchMemoryBuffer(ScratchMemoryBufferLifetime), - mAnnotator(nullptr) -{ - mLineLoopIB = nullptr; - mTriangleFanIB = nullptr; - - mBlit = nullptr; - mPixelTransfer = nullptr; - - mClear = nullptr; - - mTrim = nullptr; - - mRenderer11DeviceCaps.supportsClearView = false; - mRenderer11DeviceCaps.supportsConstantBufferOffsets = false; - mRenderer11DeviceCaps.supportsVpRtIndexWriteFromVertexShader = false; - mRenderer11DeviceCaps.supportsDXGI1_2 = false; - mRenderer11DeviceCaps.B5G6R5support = 0; - mRenderer11DeviceCaps.B4G4R4A4support = 0; - mRenderer11DeviceCaps.B5G5R5A1support = 0; - - mD3d11Module = nullptr; - mDxgiModule = nullptr; - mDCompModule = nullptr; - mCreatedWithDeviceEXT = false; - mEGLDevice = nullptr; - - mDevice = nullptr; - mDeviceContext = nullptr; - mDeviceContext1 = nullptr; - mDeviceContext3 = nullptr; - mDxgiAdapter = nullptr; - mDxgiFactory = nullptr; - - ZeroMemory(&mAdapterDescription, sizeof(mAdapterDescription)); - - if (mDisplay->getPlatform() == EGL_PLATFORM_ANGLE_ANGLE) - { - const auto &attributes = mDisplay->getAttributeMap(); - - EGLint requestedMajorVersion = static_cast<EGLint>( - attributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE)); - EGLint requestedMinorVersion = static_cast<EGLint>( - attributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, EGL_DONT_CARE)); - - if (requestedMajorVersion == EGL_DONT_CARE || requestedMajorVersion >= 11) - { - if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 1) - { - // This could potentially lead to failed context creation if done on a system - // without the platform update which installs DXGI 1.2. Currently, for Chrome users - // D3D11 contexts are only created if the platform update is available, so this - // should not cause any issues. - mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_11_1); - } - if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 0) - { - mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_11_0); - } - } - - if (requestedMajorVersion == EGL_DONT_CARE || requestedMajorVersion >= 10) - { - if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 1) - { - mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_10_1); - } - if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 0) - { - mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_10_0); - } - } - - if (requestedMajorVersion == 9 && requestedMinorVersion == 3) - { - if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 3) - { - mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_9_3); - } -#if defined(ANGLE_ENABLE_WINDOWS_STORE) - if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 2) - { - mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_9_2); - } - if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 1) - { - mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_9_1); - } -#endif - } - - EGLint requestedDeviceType = static_cast<EGLint>(attributes.get( - EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE)); - switch (requestedDeviceType) - { - case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE: - mRequestedDriverType = D3D_DRIVER_TYPE_HARDWARE; - break; - - case EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE: - mRequestedDriverType = D3D_DRIVER_TYPE_WARP; - break; - - case EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE: - mRequestedDriverType = D3D_DRIVER_TYPE_REFERENCE; - break; - - case EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE: - mRequestedDriverType = D3D_DRIVER_TYPE_NULL; - break; - - default: - UNREACHABLE(); - } - - const EGLenum presentPath = static_cast<EGLenum>(attributes.get( - EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE, EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE)); - mPresentPathFastEnabled = (presentPath == EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE); - - mCreateDebugDevice = ShouldUseDebugLayers(attributes); - } - else if (display->getPlatform() == EGL_PLATFORM_DEVICE_EXT) - { - mEGLDevice = GetImplAs<DeviceD3D>(display->getDevice()); - ASSERT(mEGLDevice != nullptr); - mCreatedWithDeviceEXT = true; - - // Also set EGL_PLATFORM_ANGLE_ANGLE variables, in case they're used elsewhere in ANGLE - // mAvailableFeatureLevels defaults to empty - mRequestedDriverType = D3D_DRIVER_TYPE_UNKNOWN; - mPresentPathFastEnabled = false; - } - -// The D3D11 renderer must choose the D3D9 debug annotator because the D3D11 interface -// method ID3DUserDefinedAnnotation::GetStatus on desktop builds doesn't work with the Graphics -// Diagnostics tools in Visual Studio 2013. -// The D3D9 annotator works properly for both D3D11 and D3D9. -// Incorrect status reporting can cause ANGLE to log unnecessary debug events. -#ifdef ANGLE_ENABLE_D3D9 - mAnnotator = new DebugAnnotator9(); -#else - mAnnotator = new DebugAnnotator11(); -#endif - ASSERT(mAnnotator); - gl::InitializeDebugAnnotations(mAnnotator); -} - -Renderer11::~Renderer11() -{ - release(); -} - -#ifndef __d3d11_1_h__ -#define D3D11_MESSAGE_ID_DEVICE_DRAW_RENDERTARGETVIEW_NOT_SET ((D3D11_MESSAGE_ID)3146081) -#endif - -egl::Error Renderer11::initialize() -{ - HRESULT result = S_OK; - - ANGLE_TRY(initializeD3DDevice()); - -#if !defined(ANGLE_ENABLE_WINDOWS_STORE) -#if !ANGLE_SKIP_DXGI_1_2_CHECK - { - TRACE_EVENT0("gpu.angle", "Renderer11::initialize (DXGICheck)"); - // In order to create a swap chain for an HWND owned by another process, DXGI 1.2 is - // required. - // The easiest way to check is to query for a IDXGIDevice2. - bool requireDXGI1_2 = false; - HWND hwnd = WindowFromDC(mDisplay->getNativeDisplayId()); - if (hwnd) - { - DWORD currentProcessId = GetCurrentProcessId(); - DWORD wndProcessId; - GetWindowThreadProcessId(hwnd, &wndProcessId); - requireDXGI1_2 = (currentProcessId != wndProcessId); - } - else - { - requireDXGI1_2 = true; - } - - if (requireDXGI1_2) - { - IDXGIDevice2 *dxgiDevice2 = nullptr; - result = mDevice->QueryInterface(__uuidof(IDXGIDevice2), (void **)&dxgiDevice2); - if (FAILED(result)) - { - return egl::EglNotInitialized(D3D11_INIT_INCOMPATIBLE_DXGI) - << "DXGI 1.2 required to present to HWNDs owned by another process."; - } - SafeRelease(dxgiDevice2); - } - } -#endif -#endif - - { - TRACE_EVENT0("gpu.angle", "Renderer11::initialize (ComQueries)"); - // Cast the DeviceContext to a DeviceContext1 and DeviceContext3. - // This could fail on Windows 7 without the Platform Update. - // Don't error in this case- just don't use mDeviceContext1 or mDeviceContext3. - mDeviceContext1 = d3d11::DynamicCastComObject<ID3D11DeviceContext1>(mDeviceContext); - mDeviceContext3 = d3d11::DynamicCastComObject<ID3D11DeviceContext3>(mDeviceContext); - - IDXGIDevice *dxgiDevice = nullptr; - result = mDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&dxgiDevice); - - if (FAILED(result)) - { - return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR) << "Could not query DXGI device."; - } - - result = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&mDxgiAdapter); - - if (FAILED(result)) - { - return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR) - << "Could not retrieve DXGI adapter"; - } - - SafeRelease(dxgiDevice); - - IDXGIAdapter2 *dxgiAdapter2 = d3d11::DynamicCastComObject<IDXGIAdapter2>(mDxgiAdapter); - - // On D3D_FEATURE_LEVEL_9_*, IDXGIAdapter::GetDesc returns "Software Adapter" for the - // description string. - // If DXGI1.2 is available then IDXGIAdapter2::GetDesc2 can be used to get the actual - // hardware values. - if (mRenderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3 && dxgiAdapter2 != nullptr) - { - DXGI_ADAPTER_DESC2 adapterDesc2 = {}; - result = dxgiAdapter2->GetDesc2(&adapterDesc2); - if (SUCCEEDED(result)) - { - // Copy the contents of the DXGI_ADAPTER_DESC2 into mAdapterDescription (a - // DXGI_ADAPTER_DESC). - memcpy(mAdapterDescription.Description, adapterDesc2.Description, - sizeof(mAdapterDescription.Description)); - mAdapterDescription.VendorId = adapterDesc2.VendorId; - mAdapterDescription.DeviceId = adapterDesc2.DeviceId; - mAdapterDescription.SubSysId = adapterDesc2.SubSysId; - mAdapterDescription.Revision = adapterDesc2.Revision; - mAdapterDescription.DedicatedVideoMemory = adapterDesc2.DedicatedVideoMemory; - mAdapterDescription.DedicatedSystemMemory = adapterDesc2.DedicatedSystemMemory; - mAdapterDescription.SharedSystemMemory = adapterDesc2.SharedSystemMemory; - mAdapterDescription.AdapterLuid = adapterDesc2.AdapterLuid; - } - } - else - { - result = mDxgiAdapter->GetDesc(&mAdapterDescription); - } - - SafeRelease(dxgiAdapter2); - - if (FAILED(result)) - { - return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR) - << "Could not read DXGI adaptor description."; - } - - memset(mDescription, 0, sizeof(mDescription)); - wcstombs(mDescription, mAdapterDescription.Description, sizeof(mDescription) - 1); - - result = mDxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void **)&mDxgiFactory); - - if (!mDxgiFactory || FAILED(result)) - { - return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR) - << "Could not create DXGI factory."; - } - } - - // Disable some spurious D3D11 debug warnings to prevent them from flooding the output log - if (mCreateDebugDevice) - { - TRACE_EVENT0("gpu.angle", "Renderer11::initialize (HideWarnings)"); - ID3D11InfoQueue *infoQueue; - result = mDevice->QueryInterface(__uuidof(ID3D11InfoQueue), (void **)&infoQueue); - - if (SUCCEEDED(result)) - { - D3D11_MESSAGE_ID hideMessages[] = { - D3D11_MESSAGE_ID_DEVICE_DRAW_RENDERTARGETVIEW_NOT_SET}; - - D3D11_INFO_QUEUE_FILTER filter = {}; - filter.DenyList.NumIDs = static_cast<unsigned int>(ArraySize(hideMessages)); - filter.DenyList.pIDList = hideMessages; - - infoQueue->AddStorageFilterEntries(&filter); - SafeRelease(infoQueue); - } - } - -#if !defined(NDEBUG) - mDebug = d3d11::DynamicCastComObject<ID3D11Debug>(mDevice); -#endif - - ANGLE_TRY(initializeDevice()); - - return egl::NoError(); -} - -HRESULT Renderer11::callD3D11CreateDevice(PFN_D3D11_CREATE_DEVICE createDevice, bool debug) -{ - return createDevice( - nullptr, mRequestedDriverType, nullptr, debug ? D3D11_CREATE_DEVICE_DEBUG : 0, - mAvailableFeatureLevels.data(), static_cast<unsigned int>(mAvailableFeatureLevels.size()), - D3D11_SDK_VERSION, &mDevice, &(mRenderer11DeviceCaps.featureLevel), &mDeviceContext); -} - -egl::Error Renderer11::initializeD3DDevice() -{ - HRESULT result = S_OK; - - if (!mCreatedWithDeviceEXT) - { -#if !defined(ANGLE_ENABLE_WINDOWS_STORE) - PFN_D3D11_CREATE_DEVICE D3D11CreateDevice = nullptr; - { - SCOPED_ANGLE_HISTOGRAM_TIMER("GPU.ANGLE.Renderer11InitializeDLLsMS"); - TRACE_EVENT0("gpu.angle", "Renderer11::initialize (Load DLLs)"); - mDxgiModule = LoadLibrary(TEXT("dxgi.dll")); - mD3d11Module = LoadLibrary(TEXT("d3d11.dll")); - mDCompModule = LoadLibrary(TEXT("dcomp.dll")); - - if (mD3d11Module == nullptr || mDxgiModule == nullptr) - { - return egl::EglNotInitialized(D3D11_INIT_MISSING_DEP) - << "Could not load D3D11 or DXGI library."; - } - - // create the D3D11 device - ASSERT(mDevice == nullptr); - D3D11CreateDevice = reinterpret_cast<PFN_D3D11_CREATE_DEVICE>( - GetProcAddress(mD3d11Module, "D3D11CreateDevice")); - - if (D3D11CreateDevice == nullptr) - { - return egl::EglNotInitialized(D3D11_INIT_MISSING_DEP) - << "Could not retrieve D3D11CreateDevice address."; - } - } -#endif - - if (mCreateDebugDevice) - { - TRACE_EVENT0("gpu.angle", "D3D11CreateDevice (Debug)"); - result = callD3D11CreateDevice(D3D11CreateDevice, true); - - if (result == E_INVALIDARG && mAvailableFeatureLevels.size() > 1u && - mAvailableFeatureLevels[0] == D3D_FEATURE_LEVEL_11_1) - { - // On older Windows platforms, D3D11.1 is not supported which returns E_INVALIDARG. - // Try again without passing D3D_FEATURE_LEVEL_11_1 in case we have other feature - // levels to fall back on. - mAvailableFeatureLevels.erase(mAvailableFeatureLevels.begin()); - result = callD3D11CreateDevice(D3D11CreateDevice, true); - } - - if (!mDevice || FAILED(result)) - { - WARN() << "Failed creating Debug D3D11 device - falling back to release runtime."; - } - } - - if (!mDevice || FAILED(result)) - { - SCOPED_ANGLE_HISTOGRAM_TIMER("GPU.ANGLE.D3D11CreateDeviceMS"); - TRACE_EVENT0("gpu.angle", "D3D11CreateDevice"); - - result = callD3D11CreateDevice(D3D11CreateDevice, false); - - if (result == E_INVALIDARG && mAvailableFeatureLevels.size() > 1u && - mAvailableFeatureLevels[0] == D3D_FEATURE_LEVEL_11_1) - { - // On older Windows platforms, D3D11.1 is not supported which returns E_INVALIDARG. - // Try again without passing D3D_FEATURE_LEVEL_11_1 in case we have other feature - // levels to fall back on. - mAvailableFeatureLevels.erase(mAvailableFeatureLevels.begin()); - result = callD3D11CreateDevice(D3D11CreateDevice, false); - } - - // Cleanup done by destructor - if (!mDevice || FAILED(result)) - { - ANGLE_HISTOGRAM_SPARSE_SLOWLY("GPU.ANGLE.D3D11CreateDeviceError", - static_cast<int>(result)); - return egl::EglNotInitialized(D3D11_INIT_CREATEDEVICE_ERROR) - << "Could not create D3D11 device."; - } - } - } - else - { - // We should use the inputted D3D11 device instead - void *device = nullptr; - ANGLE_TRY(mEGLDevice->getDevice(&device)); - - ID3D11Device *d3dDevice = reinterpret_cast<ID3D11Device *>(device); - if (FAILED(d3dDevice->GetDeviceRemovedReason())) - { - return egl::EglNotInitialized() << "Inputted D3D11 device has been lost."; - } - - if (d3dDevice->GetFeatureLevel() < D3D_FEATURE_LEVEL_9_3) - { - return egl::EglNotInitialized() - << "Inputted D3D11 device must be Feature Level 9_3 or greater."; - } - - // The Renderer11 adds a ref to the inputted D3D11 device, like D3D11CreateDevice does. - mDevice = d3dDevice; - mDevice->AddRef(); - mDevice->GetImmediateContext(&mDeviceContext); - mRenderer11DeviceCaps.featureLevel = mDevice->GetFeatureLevel(); - } - - mResourceManager11.setAllocationsInitialized(mCreateDebugDevice); - - d3d11::SetDebugName(mDeviceContext, "DeviceContext"); - - return egl::NoError(); -} - -// do any one-time device initialization -// NOTE: this is also needed after a device lost/reset -// to reset the scene status and ensure the default states are reset. -egl::Error Renderer11::initializeDevice() -{ - SCOPED_ANGLE_HISTOGRAM_TIMER("GPU.ANGLE.Renderer11InitializeDeviceMS"); - TRACE_EVENT0("gpu.angle", "Renderer11::initializeDevice"); - - populateRenderer11DeviceCaps(); - - mStateCache.clear(); - - ASSERT(!mBlit); - mBlit = new Blit11(this); - - ASSERT(!mClear); - mClear = new Clear11(this); - - const auto &attributes = mDisplay->getAttributeMap(); - // If automatic trim is enabled, DXGIDevice3::Trim( ) is called for the application - // automatically when an application is suspended by the OS. This feature is currently - // only supported for Windows Store applications. - EGLint enableAutoTrim = static_cast<EGLint>( - attributes.get(EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_FALSE)); - - if (enableAutoTrim == EGL_TRUE) - { - ASSERT(!mTrim); - mTrim = new Trim11(this); - } - - ASSERT(!mPixelTransfer); - mPixelTransfer = new PixelTransfer11(this); - - const gl::Caps &rendererCaps = getNativeCaps(); - - if (mStateManager.initialize(rendererCaps, getNativeExtensions()).isError()) - { - return egl::EglBadAlloc() << "Error initializing state manager."; - } - - // Gather stats on DXGI and D3D feature level - ANGLE_HISTOGRAM_BOOLEAN("GPU.ANGLE.SupportsDXGI1_2", mRenderer11DeviceCaps.supportsDXGI1_2); - - ANGLEFeatureLevel angleFeatureLevel = GetANGLEFeatureLevel(mRenderer11DeviceCaps.featureLevel); - - // We don't actually request a 11_1 device, because of complications with the platform - // update. Instead we check if the mDeviceContext1 pointer cast succeeded. - // Note: we should support D3D11_0 always, but we aren't guaranteed to be at FL11_0 - // because the app can specify a lower version (such as 9_3) on Display creation. - if (mDeviceContext1 != nullptr) - { - angleFeatureLevel = ANGLE_FEATURE_LEVEL_11_1; - } - - ANGLE_HISTOGRAM_ENUMERATION("GPU.ANGLE.D3D11FeatureLevel", angleFeatureLevel, - NUM_ANGLE_FEATURE_LEVELS); - - return egl::NoError(); -} - -void Renderer11::populateRenderer11DeviceCaps() -{ - HRESULT hr = S_OK; - - LARGE_INTEGER version; - hr = mDxgiAdapter->CheckInterfaceSupport(__uuidof(IDXGIDevice), &version); - if (FAILED(hr)) - { - mRenderer11DeviceCaps.driverVersion.reset(); - ERR() << "Error querying driver version from DXGI Adapter."; - } - else - { - mRenderer11DeviceCaps.driverVersion = version; - } - - if (mDeviceContext1) - { - D3D11_FEATURE_DATA_D3D11_OPTIONS d3d11Options; - HRESULT result = mDevice->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &d3d11Options, - sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS)); - if (SUCCEEDED(result)) - { - mRenderer11DeviceCaps.supportsClearView = (d3d11Options.ClearView != FALSE); - mRenderer11DeviceCaps.supportsConstantBufferOffsets = - (d3d11Options.ConstantBufferOffsetting != FALSE); - } - } - - if (mDeviceContext3) - { - D3D11_FEATURE_DATA_D3D11_OPTIONS3 d3d11Options3; - HRESULT result = mDevice->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS3, &d3d11Options3, - sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS3)); - if (SUCCEEDED(result)) - { - mRenderer11DeviceCaps.supportsVpRtIndexWriteFromVertexShader = - (d3d11Options3.VPAndRTArrayIndexFromAnyShaderFeedingRasterizer == TRUE); - } - } - - mRenderer11DeviceCaps.supportsMultisampledDepthStencilSRVs = - mRenderer11DeviceCaps.featureLevel > D3D_FEATURE_LEVEL_10_0; - - if (getWorkarounds().disableB5G6R5Support) - { - mRenderer11DeviceCaps.B5G6R5support = 0; - mRenderer11DeviceCaps.B5G6R5maxSamples = 0; - } - else - { - PopulateFormatDeviceCaps(mDevice, DXGI_FORMAT_B5G6R5_UNORM, - &mRenderer11DeviceCaps.B5G6R5support, - &mRenderer11DeviceCaps.B5G6R5maxSamples); - } - - PopulateFormatDeviceCaps(mDevice, DXGI_FORMAT_B4G4R4A4_UNORM, - &mRenderer11DeviceCaps.B4G4R4A4support, - &mRenderer11DeviceCaps.B4G4R4A4maxSamples); - PopulateFormatDeviceCaps(mDevice, DXGI_FORMAT_B5G5R5A1_UNORM, - &mRenderer11DeviceCaps.B5G5R5A1support, - &mRenderer11DeviceCaps.B5G5R5A1maxSamples); - - IDXGIAdapter2 *dxgiAdapter2 = d3d11::DynamicCastComObject<IDXGIAdapter2>(mDxgiAdapter); - mRenderer11DeviceCaps.supportsDXGI1_2 = (dxgiAdapter2 != nullptr); - SafeRelease(dxgiAdapter2); -} - -gl::SupportedSampleSet Renderer11::generateSampleSetForEGLConfig( - const gl::TextureCaps &colorBufferFormatCaps, - const gl::TextureCaps &depthStencilBufferFormatCaps) const -{ - gl::SupportedSampleSet sampleCounts; - -#if 0 // Disabling support for multisampling with Qt5 as it's causing a crash in the D3D11 shaders. - - // Generate a new set from the set intersection of sample counts between the color and depth - // format caps. - std::set_intersection(colorBufferFormatCaps.sampleCounts.begin(), - colorBufferFormatCaps.sampleCounts.end(), - depthStencilBufferFormatCaps.sampleCounts.begin(), - depthStencilBufferFormatCaps.sampleCounts.end(), - std::inserter(sampleCounts, sampleCounts.begin())); - - // Format of GL_NONE results in no supported sample counts. - // Add back the color sample counts to the supported sample set. - if (depthStencilBufferFormatCaps.sampleCounts.empty()) - { - sampleCounts = colorBufferFormatCaps.sampleCounts; - } - else if (colorBufferFormatCaps.sampleCounts.empty()) - { - // Likewise, add back the depth sample counts to the supported sample set. - sampleCounts = depthStencilBufferFormatCaps.sampleCounts; - } - -#endif - - // Always support 0 samples - sampleCounts.insert(0); - - return sampleCounts; -} - -egl::ConfigSet Renderer11::generateConfigs() -{ - std::vector<GLenum> colorBufferFormats; - - // 32-bit supported formats - colorBufferFormats.push_back(GL_BGRA8_EXT); - colorBufferFormats.push_back(GL_RGBA8_OES); - - // 24-bit supported formats - colorBufferFormats.push_back(GL_RGB8_OES); - - if (mRenderer11DeviceCaps.featureLevel >= D3D_FEATURE_LEVEL_10_0) - { - // Additional high bit depth formats added in D3D 10.0 - // https://msdn.microsoft.com/en-us/library/windows/desktop/bb173064.aspx - colorBufferFormats.push_back(GL_RGBA16F); - colorBufferFormats.push_back(GL_RGB10_A2); - } - - if (!mPresentPathFastEnabled) - { - // 16-bit supported formats - // These aren't valid D3D11 swapchain formats, so don't expose them as configs - // if present path fast is active - colorBufferFormats.push_back(GL_RGBA4); - colorBufferFormats.push_back(GL_RGB5_A1); - colorBufferFormats.push_back(GL_RGB565); - } - - static const GLenum depthStencilBufferFormats[] = { - GL_NONE, GL_DEPTH24_STENCIL8_OES, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT16, - GL_STENCIL_INDEX8, - }; - - const gl::Caps &rendererCaps = getNativeCaps(); - const gl::TextureCapsMap &rendererTextureCaps = getNativeTextureCaps(); - - const EGLint optimalSurfaceOrientation = - mPresentPathFastEnabled ? 0 : EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE; - - egl::ConfigSet configs; - for (GLenum colorBufferInternalFormat : colorBufferFormats) - { - const gl::TextureCaps &colorBufferFormatCaps = - rendererTextureCaps.get(colorBufferInternalFormat); - if (!colorBufferFormatCaps.renderable) - { - continue; - } - - for (GLenum depthStencilBufferInternalFormat : depthStencilBufferFormats) - { - const gl::TextureCaps &depthStencilBufferFormatCaps = - rendererTextureCaps.get(depthStencilBufferInternalFormat); - if (!depthStencilBufferFormatCaps.renderable && - depthStencilBufferInternalFormat != GL_NONE) - { - continue; - } - - const gl::InternalFormat &colorBufferFormatInfo = - gl::GetSizedInternalFormatInfo(colorBufferInternalFormat); - const gl::InternalFormat &depthStencilBufferFormatInfo = - gl::GetSizedInternalFormatInfo(depthStencilBufferInternalFormat); - const gl::Version &maxVersion = getMaxSupportedESVersion(); - - const gl::SupportedSampleSet sampleCounts = - generateSampleSetForEGLConfig(colorBufferFormatCaps, depthStencilBufferFormatCaps); - - for (GLuint sampleCount : sampleCounts) - { - egl::Config config; - config.renderTargetFormat = colorBufferInternalFormat; - config.depthStencilFormat = depthStencilBufferInternalFormat; - config.bufferSize = colorBufferFormatInfo.pixelBytes * 8; - config.redSize = colorBufferFormatInfo.redBits; - config.greenSize = colorBufferFormatInfo.greenBits; - config.blueSize = colorBufferFormatInfo.blueBits; - config.luminanceSize = colorBufferFormatInfo.luminanceBits; - config.alphaSize = colorBufferFormatInfo.alphaBits; - config.alphaMaskSize = 0; - config.bindToTextureRGB = - ((colorBufferFormatInfo.format == GL_RGB) && (sampleCount <= 1)); - config.bindToTextureRGBA = (((colorBufferFormatInfo.format == GL_RGBA) || - (colorBufferFormatInfo.format == GL_BGRA_EXT)) && - (sampleCount <= 1)); - config.colorBufferType = EGL_RGB_BUFFER; - config.configCaveat = EGL_NONE; - config.configID = static_cast<EGLint>(configs.size() + 1); - - // PresentPathFast may not be conformant - config.conformant = 0; - if (!mPresentPathFastEnabled) - { - // Can only support a conformant ES2 with feature level greater than 10.0. - if (mRenderer11DeviceCaps.featureLevel >= D3D_FEATURE_LEVEL_10_0) - { - config.conformant |= EGL_OPENGL_ES2_BIT; - } - - // We can only support conformant ES3 on FL 10.1+ - if (maxVersion.major >= 3) - { - config.conformant |= EGL_OPENGL_ES3_BIT_KHR; - } - } - - config.depthSize = depthStencilBufferFormatInfo.depthBits; - config.level = 0; - config.matchNativePixmap = EGL_NONE; - config.maxPBufferWidth = rendererCaps.max2DTextureSize; - config.maxPBufferHeight = rendererCaps.max2DTextureSize; - config.maxPBufferPixels = - rendererCaps.max2DTextureSize * rendererCaps.max2DTextureSize; - config.maxSwapInterval = 4; - config.minSwapInterval = 0; - config.nativeRenderable = EGL_FALSE; - config.nativeVisualID = 0; - config.nativeVisualType = EGL_NONE; - - // Can't support ES3 at all without feature level 10.1 - config.renderableType = EGL_OPENGL_ES2_BIT; - if (maxVersion.major >= 3) - { - config.renderableType |= EGL_OPENGL_ES3_BIT_KHR; - } - - config.sampleBuffers = (sampleCount == 0) ? 0 : 1; - config.samples = sampleCount; - config.stencilSize = depthStencilBufferFormatInfo.stencilBits; - config.surfaceType = - EGL_PBUFFER_BIT | EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT; - config.transparentType = EGL_NONE; - config.transparentRedValue = 0; - config.transparentGreenValue = 0; - config.transparentBlueValue = 0; - config.optimalOrientation = optimalSurfaceOrientation; - config.colorComponentType = gl_egl::GLComponentTypeToEGLColorComponentType( - colorBufferFormatInfo.componentType); - - configs.add(config); - } - } - } - - ASSERT(configs.size() > 0); - return configs; -} - -void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const -{ - outExtensions->createContextRobustness = true; - - if (getShareHandleSupport()) - { - outExtensions->d3dShareHandleClientBuffer = true; - outExtensions->surfaceD3DTexture2DShareHandle = true; - } - outExtensions->d3dTextureClientBuffer = true; - - outExtensions->keyedMutex = true; - outExtensions->querySurfacePointer = true; - outExtensions->windowFixedSize = true; - - // If present path fast is active then the surface orientation extension isn't supported - outExtensions->surfaceOrientation = !mPresentPathFastEnabled; - - // D3D11 does not support present with dirty rectangles until DXGI 1.2. - outExtensions->postSubBuffer = mRenderer11DeviceCaps.supportsDXGI1_2; - - outExtensions->deviceQuery = true; - - outExtensions->image = true; - outExtensions->imageBase = true; - outExtensions->glTexture2DImage = true; - outExtensions->glTextureCubemapImage = true; - outExtensions->glRenderbufferImage = true; - - outExtensions->stream = true; - outExtensions->streamConsumerGLTexture = true; - outExtensions->streamConsumerGLTextureYUV = true; - // Not all D3D11 devices support NV12 textures - if (getNV12TextureSupport()) - { - outExtensions->streamProducerD3DTextureNV12 = true; - } - - outExtensions->flexibleSurfaceCompatibility = true; - outExtensions->directComposition = !!mDCompModule; - - // Contexts are virtualized so textures can be shared globally - outExtensions->displayTextureShareGroup = true; - - // getSyncValues requires direct composition. - outExtensions->getSyncValues = outExtensions->directComposition; - - // D3D11 can be used without a swap chain - outExtensions->surfacelessContext = true; - - // All D3D feature levels support robust resource init - outExtensions->robustResourceInitialization = true; -} - -gl::Error Renderer11::flush() -{ - mDeviceContext->Flush(); - return gl::NoError(); -} - -gl::Error Renderer11::finish() -{ - if (!mSyncQuery.valid()) - { - D3D11_QUERY_DESC queryDesc; - queryDesc.Query = D3D11_QUERY_EVENT; - queryDesc.MiscFlags = 0; - - ANGLE_TRY(allocateResource(queryDesc, &mSyncQuery)); - } - - mDeviceContext->End(mSyncQuery.get()); - - HRESULT result = S_OK; - unsigned int attempt = 0; - do - { - unsigned int flushFrequency = 100; - UINT flags = (attempt % flushFrequency == 0) ? 0 : D3D11_ASYNC_GETDATA_DONOTFLUSH; - attempt++; - - result = mDeviceContext->GetData(mSyncQuery.get(), nullptr, 0, flags); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result); - } - - if (result == S_FALSE) - { - // Keep polling, but allow other threads to do something useful first - ScheduleYield(); - } - - if (testDeviceLost()) - { - mDisplay->notifyDeviceLost(); - return gl::OutOfMemory() << "Device was lost while waiting for sync."; - } - } while (result == S_FALSE); - - return gl::NoError(); -} - -bool Renderer11::isValidNativeWindow(EGLNativeWindowType window) const -{ -#ifdef ANGLE_ENABLE_WINDOWS_STORE - return NativeWindow11WinRT::IsValidNativeWindow(window); -#else - return NativeWindow11Win32::IsValidNativeWindow(window); -#endif -} - -NativeWindowD3D *Renderer11::createNativeWindow(EGLNativeWindowType window, - const egl::Config *config, - const egl::AttributeMap &attribs) const -{ -#ifdef ANGLE_ENABLE_WINDOWS_STORE - UNUSED_VARIABLE(attribs); - return new NativeWindow11WinRT(window, config->alphaSize > 0); -#else - return new NativeWindow11Win32( - window, config->alphaSize > 0, - attribs.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE) == EGL_TRUE); -#endif -} - -egl::Error Renderer11::getD3DTextureInfo(const egl::Config *configuration, - IUnknown *d3dTexture, - EGLint *width, - EGLint *height, - GLenum *fboFormat) const -{ - ID3D11Texture2D *texture = d3d11::DynamicCastComObject<ID3D11Texture2D>(d3dTexture); - if (texture == nullptr) - { - return egl::EglBadParameter() << "client buffer is not a ID3D11Texture2D"; - } - - ID3D11Device *textureDevice = nullptr; - texture->GetDevice(&textureDevice); - if (textureDevice != mDevice) - { - SafeRelease(texture); - return egl::EglBadParameter() << "Texture's device does not match."; - } - SafeRelease(textureDevice); - - D3D11_TEXTURE2D_DESC desc = {0}; - texture->GetDesc(&desc); - SafeRelease(texture); - - if (width) - { - *width = static_cast<EGLint>(desc.Width); - } - if (height) - { - *height = static_cast<EGLint>(desc.Height); - } - if (static_cast<EGLint>(desc.SampleDesc.Count) != configuration->samples) - { - // Both the texture and EGL config sample count may not be the same when multi-sampling - // is disabled. The EGL sample count can be 0 but a D3D texture is always 1. Therefore, - // we must only check for a invalid match when the EGL config is non-zero or the texture is - // not one. - if (configuration->samples != 0 || desc.SampleDesc.Count != 1) - { - return egl::EglBadParameter() << "Texture's sample count does not match."; - } - } - // From table egl.restrictions in EGL_ANGLE_d3d_texture_client_buffer. - switch (desc.Format) - { - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_R16G16B16A16_FLOAT: - case DXGI_FORMAT_R32G32B32A32_FLOAT: - break; - - default: - return egl::EglBadParameter() - << "Unknown client buffer texture format: " << desc.Format; - } - - if (fboFormat) - { - const angle::Format &angleFormat = d3d11_angle::GetFormat(desc.Format); - *fboFormat = angleFormat.fboImplementationInternalFormat; - } - - return egl::NoError(); -} - -egl::Error Renderer11::validateShareHandle(const egl::Config *config, - HANDLE shareHandle, - const egl::AttributeMap &attribs) const -{ - if (shareHandle == nullptr) - { - return egl::EglBadParameter() << "NULL share handle."; - } - - ID3D11Resource *tempResource11 = nullptr; - HRESULT result = mDevice->OpenSharedResource(shareHandle, __uuidof(ID3D11Resource), - (void **)&tempResource11); - if (FAILED(result)) - { - return egl::EglBadParameter() << "Failed to open share handle, " << gl::FmtHR(result); - } - - ID3D11Texture2D *texture2D = d3d11::DynamicCastComObject<ID3D11Texture2D>(tempResource11); - SafeRelease(tempResource11); - - if (texture2D == nullptr) - { - return egl::EglBadParameter() - << "Failed to query ID3D11Texture2D object from share handle."; - } - - D3D11_TEXTURE2D_DESC desc = {0}; - texture2D->GetDesc(&desc); - SafeRelease(texture2D); - - EGLint width = attribs.getAsInt(EGL_WIDTH, 0); - EGLint height = attribs.getAsInt(EGL_HEIGHT, 0); - ASSERT(width != 0 && height != 0); - - const d3d11::Format &backbufferFormatInfo = - d3d11::Format::Get(config->renderTargetFormat, getRenderer11DeviceCaps()); - - if (desc.Width != static_cast<UINT>(width) || desc.Height != static_cast<UINT>(height) || - desc.Format != backbufferFormatInfo.texFormat || desc.MipLevels != 1 || desc.ArraySize != 1) - { - return egl::EglBadParameter() << "Invalid texture parameters in share handle texture."; - } - - return egl::NoError(); -} - -SwapChainD3D *Renderer11::createSwapChain(NativeWindowD3D *nativeWindow, - HANDLE shareHandle, - IUnknown *d3dTexture, - GLenum backBufferFormat, - GLenum depthBufferFormat, - EGLint orientation, - EGLint samples) -{ - return new SwapChain11(this, GetAs<NativeWindow11>(nativeWindow), shareHandle, d3dTexture, - backBufferFormat, depthBufferFormat, orientation, samples); -} - -void *Renderer11::getD3DDevice() -{ - return reinterpret_cast<void *>(mDevice); -} - -bool Renderer11::applyPrimitiveType(const gl::State &glState, GLenum mode, GLsizei count) -{ - D3D11_PRIMITIVE_TOPOLOGY primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED; - - GLsizei minCount = 0; - - switch (mode) - { - case GL_POINTS: - { - bool usesPointSize = GetImplAs<ProgramD3D>(glState.getProgram())->usesPointSize(); - - // ProgramBinary assumes non-point rendering if gl_PointSize isn't written, - // which affects varying interpolation. Since the value of gl_PointSize is - // undefined when not written, just skip drawing to avoid unexpected results. - if (!usesPointSize && !glState.isTransformFeedbackActiveUnpaused()) - { - // Notify developers of risking undefined behavior. - WARN() << "Point rendering without writing to gl_PointSize."; - return false; - } - - // If instanced pointsprites are enabled and the shader uses gl_PointSize, the topology - // must be D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST. - if (usesPointSize && getWorkarounds().useInstancedPointSpriteEmulation) - { - primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; - } - else - { - primitiveTopology = D3D11_PRIMITIVE_TOPOLOGY_POINTLIST; - } - minCount = 1; - break; - } - case GL_LINES: - primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_LINELIST; - minCount = 2; - break; - case GL_LINE_LOOP: - primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP; - minCount = 2; - break; - case GL_LINE_STRIP: - primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP; - minCount = 2; - break; - case GL_TRIANGLES: - primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; - minCount = CullsEverything(glState) ? std::numeric_limits<GLsizei>::max() : 3; - break; - case GL_TRIANGLE_STRIP: - primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP; - minCount = CullsEverything(glState) ? std::numeric_limits<GLsizei>::max() : 3; - break; - // emulate fans via rewriting index buffer - case GL_TRIANGLE_FAN: - primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; - minCount = CullsEverything(glState) ? std::numeric_limits<GLsizei>::max() : 3; - break; - default: - UNREACHABLE(); - return false; - } - - mStateManager.setPrimitiveTopology(primitiveTopology); - - return count >= minCount; -} - -gl::Error Renderer11::drawArrays(const gl::Context *context, - GLenum mode, - GLint startVertex, - GLsizei count, - GLsizei instances) -{ - const auto &glState = context->getGLState(); - - if (!applyPrimitiveType(glState, mode, count)) - { - return gl::NoError(); - } - - DrawCallVertexParams vertexParams(startVertex, count, instances); - ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, false)); - - if (glState.isTransformFeedbackActiveUnpaused()) - { - ANGLE_TRY(markTransformFeedbackUsage(context)); - } - - gl::Program *program = glState.getProgram(); - ASSERT(program != nullptr); - GLsizei adjustedInstanceCount = GetAdjustedInstanceCount(program, instances); - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program); - - if (programD3D->usesGeometryShader(mode) && glState.isTransformFeedbackActiveUnpaused()) - { - // Since we use a geometry if-and-only-if we rewrite vertex streams, transform feedback - // won't get the correct output. To work around this, draw with *only* the stream out - // first (no pixel shader) to feed the stream out buffers and then draw again with the - // geometry shader + pixel shader to rasterize the primitives. - mStateManager.setPixelShader(nullptr); - - if (adjustedInstanceCount > 0) - { - mDeviceContext->DrawInstanced(count, adjustedInstanceCount, 0, 0); - } - else - { - mDeviceContext->Draw(count, 0); - } - - rx::ShaderExecutableD3D *pixelExe = nullptr; - ANGLE_TRY(programD3D->getPixelExecutableForCachedOutputLayout(&pixelExe, nullptr)); - - // Skip the draw call if rasterizer discard is enabled (or no fragment shader). - if (!pixelExe || glState.getRasterizerState().rasterizerDiscard) - { - return gl::NoError(); - } - - mStateManager.setPixelShader(&GetAs<ShaderExecutable11>(pixelExe)->getPixelShader()); - - // Retrieve the geometry shader. - rx::ShaderExecutableD3D *geometryExe = nullptr; - ANGLE_TRY(programD3D->getGeometryExecutableForPrimitiveType(context, mode, &geometryExe, - nullptr)); - - mStateManager.setGeometryShader( - &GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader()); - - if (adjustedInstanceCount > 0) - { - mDeviceContext->DrawInstanced(count, adjustedInstanceCount, 0, 0); - } - else - { - mDeviceContext->Draw(count, 0); - } - return gl::NoError(); - } - - if (mode == GL_LINE_LOOP) - { - return drawLineLoop(context, count, GL_NONE, nullptr, 0, adjustedInstanceCount); - } - - if (mode == GL_TRIANGLE_FAN) - { - return drawTriangleFan(context, count, GL_NONE, nullptr, 0, adjustedInstanceCount); - } - - bool useInstancedPointSpriteEmulation = - programD3D->usesPointSize() && getWorkarounds().useInstancedPointSpriteEmulation; - - if (mode != GL_POINTS || !useInstancedPointSpriteEmulation) - { - if (adjustedInstanceCount == 0) - { - mDeviceContext->Draw(count, 0); - } - else - { - mDeviceContext->DrawInstanced(count, adjustedInstanceCount, 0, 0); - } - return gl::NoError(); - } - - // This code should not be reachable by multi-view programs. - ASSERT(program->usesMultiview() == false); - - // If the shader is writing to gl_PointSize, then pointsprites are being rendered. - // Emulating instanced point sprites for FL9_3 requires the topology to be - // D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST and DrawIndexedInstanced is called instead. - if (adjustedInstanceCount == 0) - { - mDeviceContext->DrawIndexedInstanced(6, count, 0, 0, 0); - return gl::NoError(); - } - - // If pointsprite emulation is used with glDrawArraysInstanced then we need to take a less - // efficent code path. Instanced rendering of emulated pointsprites requires a loop to draw each - // batch of points. An offset into the instanced data buffer is calculated and applied on each - // iteration to ensure all instances are rendered correctly. Each instance being rendered - // requires the inputlayout cache to reapply buffers and offsets. - for (GLsizei i = 0; i < instances; i++) - { - ANGLE_TRY(mStateManager.updateVertexOffsetsForPointSpritesEmulation(startVertex, i)); - mDeviceContext->DrawIndexedInstanced(6, count, 0, 0, 0); - } - - // This required by updateVertexOffsets... above but is outside of the loop for speed. - mStateManager.invalidateVertexBuffer(); - return gl::NoError(); -} - -gl::Error Renderer11::drawElements(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices, - GLsizei instances) -{ - const auto &glState = context->getGLState(); - - if (!applyPrimitiveType(glState, mode, count)) - { - return gl::NoError(); - } - - // Transform feedback is not allowed for DrawElements, this error should have been caught at the - // API validation layer. - ASSERT(!glState.isTransformFeedbackActiveUnpaused()); - - const auto &lazyIndexRange = context->getParams<gl::HasIndexRange>(); - - bool usePrimitiveRestartWorkaround = - UsePrimitiveRestartWorkaround(glState.isPrimitiveRestartEnabled(), type); - DrawCallVertexParams vertexParams(!usePrimitiveRestartWorkaround, lazyIndexRange, 0, instances); - - ANGLE_TRY(mStateManager.applyIndexBuffer(context, indices, count, type, lazyIndexRange, - usePrimitiveRestartWorkaround)); - ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, true)); - - int startVertex = static_cast<int>(vertexParams.firstVertex()); - int baseVertex = -startVertex; - - const gl::Program *program = glState.getProgram(); - GLsizei adjustedInstanceCount = GetAdjustedInstanceCount(program, instances); - - if (mode == GL_LINE_LOOP) - { - return drawLineLoop(context, count, type, indices, baseVertex, adjustedInstanceCount); - } - - if (mode == GL_TRIANGLE_FAN) - { - return drawTriangleFan(context, count, type, indices, baseVertex, adjustedInstanceCount); - } - - const ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram()); - - if (mode != GL_POINTS || !programD3D->usesInstancedPointSpriteEmulation()) - { - if (adjustedInstanceCount == 0) - { - mDeviceContext->DrawIndexed(count, 0, baseVertex); - } - else - { - mDeviceContext->DrawIndexedInstanced(count, adjustedInstanceCount, 0, baseVertex, 0); - } - return gl::NoError(); - } - - // This code should not be reachable by multi-view programs. - ASSERT(program->usesMultiview() == false); - - // If the shader is writing to gl_PointSize, then pointsprites are being rendered. - // Emulating instanced point sprites for FL9_3 requires the topology to be - // D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST and DrawIndexedInstanced is called instead. - // - // The count parameter passed to drawElements represents the total number of instances to be - // rendered. Each instance is referenced by the bound index buffer from the the caller. - // - // Indexed pointsprite emulation replicates data for duplicate entries found in the index - // buffer. This is not an efficent rendering mechanism and is only used on downlevel renderers - // that do not support geometry shaders. - if (instances == 0) - { - mDeviceContext->DrawIndexedInstanced(6, count, 0, 0, 0); - return gl::NoError(); - } - - // If pointsprite emulation is used with glDrawElementsInstanced then we need to take a less - // efficent code path. Instanced rendering of emulated pointsprites requires a loop to draw each - // batch of points. An offset into the instanced data buffer is calculated and applied on each - // iteration to ensure all instances are rendered correctly. - GLsizei elementsToRender = vertexParams.vertexCount(); - - // Each instance being rendered requires the inputlayout cache to reapply buffers and offsets. - for (GLsizei i = 0; i < instances; i++) - { - ANGLE_TRY(mStateManager.updateVertexOffsetsForPointSpritesEmulation(startVertex, i)); - mDeviceContext->DrawIndexedInstanced(6, elementsToRender, 0, 0, 0); - } - mStateManager.invalidateVertexBuffer(); - return gl::NoError(); -} - -gl::Error Renderer11::drawArraysIndirect(const gl::Context *context, - GLenum mode, - const void *indirect) -{ - const auto &glState = context->getGLState(); - ASSERT(!glState.isTransformFeedbackActiveUnpaused()); - - if (!applyPrimitiveType(glState, mode, std::numeric_limits<int>::max() - 1)) - { - return gl::NoError(); - } - - gl::Buffer *drawIndirectBuffer = glState.getTargetBuffer(gl::BufferBinding::DrawIndirect); - ASSERT(drawIndirectBuffer); - Buffer11 *storage = GetImplAs<Buffer11>(drawIndirectBuffer); - uintptr_t offset = reinterpret_cast<uintptr_t>(indirect); - - if (!DrawCallNeedsTranslation(context, mode)) - { - DrawCallVertexParams vertexParams(0, 0, 0); - ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, false)); - ID3D11Buffer *buffer = nullptr; - ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_INDIRECT), buffer); - mDeviceContext->DrawInstancedIndirect(buffer, static_cast<unsigned int>(offset)); - return gl::NoError(); - } - - const uint8_t *bufferData = nullptr; - ANGLE_TRY(storage->getData(context, &bufferData)); - ASSERT(bufferData); - const gl::DrawArraysIndirectCommand *args = - reinterpret_cast<const gl::DrawArraysIndirectCommand *>(bufferData + offset); - GLuint count = args->count; - GLuint instances = args->instanceCount; - GLuint first = args->first; - - DrawCallVertexParams vertexParams(first, count, instances); - ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, false)); - - if (mode == GL_LINE_LOOP) - { - return drawLineLoop(context, count, GL_NONE, nullptr, 0, instances); - } - if (mode == GL_TRIANGLE_FAN) - { - return drawTriangleFan(context, count, GL_NONE, nullptr, 0, instances); - } - - mDeviceContext->DrawInstanced(count, instances, 0, 0); - return gl::NoError(); -} - -gl::Error Renderer11::drawElementsIndirect(const gl::Context *context, - GLenum mode, - GLenum type, - const void *indirect) -{ - const auto &glState = context->getGLState(); - ASSERT(!glState.isTransformFeedbackActiveUnpaused()); - - if (!applyPrimitiveType(glState, mode, std::numeric_limits<int>::max() - 1)) - { - return gl::NoError(); - } - - gl::Buffer *drawIndirectBuffer = glState.getTargetBuffer(gl::BufferBinding::DrawIndirect); - ASSERT(drawIndirectBuffer); - Buffer11 *storage = GetImplAs<Buffer11>(drawIndirectBuffer); - uintptr_t offset = reinterpret_cast<uintptr_t>(indirect); - - // TODO(jmadill): Remove the if statement and compute indirect parameters lazily. - bool usePrimitiveRestartWorkaround = - UsePrimitiveRestartWorkaround(glState.isPrimitiveRestartEnabled(), type); - - if (!DrawCallNeedsTranslation(context, mode) && !IsStreamingIndexData(context, type)) - { - ANGLE_TRY(mStateManager.applyIndexBuffer(context, nullptr, 0, type, gl::HasIndexRange(), - usePrimitiveRestartWorkaround)); - DrawCallVertexParams vertexParams(0, 0, 0); - ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, true)); - ID3D11Buffer *buffer = nullptr; - ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_INDIRECT), buffer); - mDeviceContext->DrawIndexedInstancedIndirect(buffer, static_cast<unsigned int>(offset)); - return gl::NoError(); - } - - const uint8_t *bufferData = nullptr; - ANGLE_TRY(storage->getData(context, &bufferData)); - ASSERT(bufferData); - - const gl::DrawElementsIndirectCommand *cmd = - reinterpret_cast<const gl::DrawElementsIndirectCommand *>(bufferData + offset); - GLsizei count = cmd->count; - GLuint instances = cmd->primCount; - GLuint firstIndex = cmd->firstIndex; - GLint baseVertex = cmd->baseVertex; - - // TODO(jmadill): Fix const cast. - const gl::Type &typeInfo = gl::GetTypeInfo(type); - const void *indices = - reinterpret_cast<const void *>(static_cast<uintptr_t>(firstIndex * typeInfo.bytes)); - gl::HasIndexRange lazyIndexRange(const_cast<gl::Context *>(context), count, type, indices); - - ANGLE_TRY(mStateManager.applyIndexBuffer(context, indices, count, type, lazyIndexRange, - usePrimitiveRestartWorkaround)); - - DrawCallVertexParams vertexParams(false, lazyIndexRange, baseVertex, instances); - - ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, true)); - - int baseVertexLocation = -static_cast<int>(lazyIndexRange.getIndexRange().value().start); - - if (mode == GL_LINE_LOOP) - { - return drawLineLoop(context, count, type, indices, baseVertexLocation, instances); - } - - if (mode == GL_TRIANGLE_FAN) - { - return drawTriangleFan(context, count, type, indices, baseVertexLocation, instances); - } - - mDeviceContext->DrawIndexedInstanced(count, instances, 0, baseVertexLocation, 0); - return gl::NoError(); -} - -gl::Error Renderer11::drawLineLoop(const gl::Context *context, - GLsizei count, - GLenum type, - const void *indexPointer, - int baseVertex, - int instances) -{ - const gl::State &glState = context->getGLState(); - gl::VertexArray *vao = glState.getVertexArray(); - gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get(); - - const void *indices = indexPointer; - - // Get the raw indices for an indexed draw - if (type != GL_NONE && elementArrayBuffer) - { - BufferD3D *storage = GetImplAs<BufferD3D>(elementArrayBuffer); - intptr_t offset = reinterpret_cast<intptr_t>(indices); - - const uint8_t *bufferData = nullptr; - ANGLE_TRY(storage->getData(context, &bufferData)); - - indices = bufferData + offset; - } - - if (!mLineLoopIB) - { - mLineLoopIB = new StreamingIndexBufferInterface(this); - gl::Error error = - mLineLoopIB->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_INT); - if (error.isError()) - { - SafeDelete(mLineLoopIB); - return error; - } - } - - // Checked by Renderer11::applyPrimitiveType - ASSERT(count >= 0); - - if (static_cast<unsigned int>(count) + 1 > - (std::numeric_limits<unsigned int>::max() / sizeof(unsigned int))) - { - return gl::OutOfMemory() << "Failed to create a 32-bit looping index buffer for " - "GL_LINE_LOOP, too many indices required."; - } - - GetLineLoopIndices(indices, type, static_cast<GLuint>(count), - glState.isPrimitiveRestartEnabled(), &mScratchIndexDataBuffer); - - unsigned int spaceNeeded = - static_cast<unsigned int>(sizeof(GLuint) * mScratchIndexDataBuffer.size()); - ANGLE_TRY(mLineLoopIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT)); - - void *mappedMemory = nullptr; - unsigned int offset; - ANGLE_TRY(mLineLoopIB->mapBuffer(spaceNeeded, &mappedMemory, &offset)); - - // Copy over the converted index data. - memcpy(mappedMemory, &mScratchIndexDataBuffer[0], - sizeof(GLuint) * mScratchIndexDataBuffer.size()); - - ANGLE_TRY(mLineLoopIB->unmapBuffer()); - - IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(mLineLoopIB->getIndexBuffer()); - const d3d11::Buffer &d3dIndexBuffer = indexBuffer->getBuffer(); - DXGI_FORMAT indexFormat = indexBuffer->getIndexFormat(); - - mStateManager.setIndexBuffer(d3dIndexBuffer.get(), indexFormat, offset); - - UINT indexCount = static_cast<UINT>(mScratchIndexDataBuffer.size()); - - if (instances > 0) - { - mDeviceContext->DrawIndexedInstanced(indexCount, instances, 0, baseVertex, 0); - } - else - { - mDeviceContext->DrawIndexed(indexCount, 0, baseVertex); - } - - return gl::NoError(); -} - -gl::Error Renderer11::drawTriangleFan(const gl::Context *context, - GLsizei count, - GLenum type, - const void *indices, - int baseVertex, - int instances) -{ - const gl::State &glState = context->getGLState(); - gl::VertexArray *vao = glState.getVertexArray(); - gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get(); - - const void *indexPointer = indices; - - // Get the raw indices for an indexed draw - if (type != GL_NONE && elementArrayBuffer) - { - BufferD3D *storage = GetImplAs<BufferD3D>(elementArrayBuffer); - intptr_t offset = reinterpret_cast<intptr_t>(indices); - - const uint8_t *bufferData = nullptr; - ANGLE_TRY(storage->getData(context, &bufferData)); - - indexPointer = bufferData + offset; - } - - if (!mTriangleFanIB) - { - mTriangleFanIB = new StreamingIndexBufferInterface(this); - gl::Error error = - mTriangleFanIB->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_INT); - if (error.isError()) - { - SafeDelete(mTriangleFanIB); - return error; - } - } - - // Checked by Renderer11::applyPrimitiveType - ASSERT(count >= 3); - - const GLuint numTris = count - 2; - - if (numTris > (std::numeric_limits<unsigned int>::max() / (sizeof(unsigned int) * 3))) - { - return gl::OutOfMemory() << "Failed to create a scratch index buffer for GL_TRIANGLE_FAN, " - "too many indices required."; - } - - GetTriFanIndices(indexPointer, type, count, glState.isPrimitiveRestartEnabled(), - &mScratchIndexDataBuffer); - - const unsigned int spaceNeeded = - static_cast<unsigned int>(mScratchIndexDataBuffer.size() * sizeof(unsigned int)); - ANGLE_TRY(mTriangleFanIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT)); - - void *mappedMemory = nullptr; - unsigned int offset; - ANGLE_TRY(mTriangleFanIB->mapBuffer(spaceNeeded, &mappedMemory, &offset)); - - memcpy(mappedMemory, &mScratchIndexDataBuffer[0], spaceNeeded); - - ANGLE_TRY(mTriangleFanIB->unmapBuffer()); - - IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(mTriangleFanIB->getIndexBuffer()); - const d3d11::Buffer &d3dIndexBuffer = indexBuffer->getBuffer(); - DXGI_FORMAT indexFormat = indexBuffer->getIndexFormat(); - - mStateManager.setIndexBuffer(d3dIndexBuffer.get(), indexFormat, offset); - - UINT indexCount = static_cast<UINT>(mScratchIndexDataBuffer.size()); - - if (instances > 0) - { - mDeviceContext->DrawIndexedInstanced(indexCount, instances, 0, baseVertex, 0); - } - else - { - mDeviceContext->DrawIndexed(indexCount, 0, baseVertex); - } - - return gl::NoError(); -} - -void Renderer11::releaseDeviceResources() -{ - mStateManager.deinitialize(); - mStateCache.clear(); - - SafeDelete(mLineLoopIB); - SafeDelete(mTriangleFanIB); - SafeDelete(mBlit); - SafeDelete(mClear); - SafeDelete(mTrim); - SafeDelete(mPixelTransfer); - - mSyncQuery.reset(); - - mCachedResolveTexture.reset(); -} - -// set notify to true to broadcast a message to all contexts of the device loss -bool Renderer11::testDeviceLost() -{ - bool isLost = false; - - if (!mDevice) - { - return true; - } - - // GetRemovedReason is used to test if the device is removed - HRESULT result = mDevice->GetDeviceRemovedReason(); - isLost = d3d11::isDeviceLostError(result); - - if (isLost) - { - ERR() << "The D3D11 device was removed, " << gl::FmtHR(result); - } - - return isLost; -} - -bool Renderer11::testDeviceResettable() -{ - // determine if the device is resettable by creating a dummy device - PFN_D3D11_CREATE_DEVICE D3D11CreateDevice = - (PFN_D3D11_CREATE_DEVICE)GetProcAddress(mD3d11Module, "D3D11CreateDevice"); - - if (D3D11CreateDevice == nullptr) - { - return false; - } - - ID3D11Device *dummyDevice; - D3D_FEATURE_LEVEL dummyFeatureLevel; - ID3D11DeviceContext *dummyContext; - UINT flags = (mCreateDebugDevice ? D3D11_CREATE_DEVICE_DEBUG : 0); - - ASSERT(mRequestedDriverType != D3D_DRIVER_TYPE_UNKNOWN); - HRESULT result = D3D11CreateDevice( - nullptr, mRequestedDriverType, nullptr, flags, mAvailableFeatureLevels.data(), - static_cast<unsigned int>(mAvailableFeatureLevels.size()), D3D11_SDK_VERSION, &dummyDevice, - &dummyFeatureLevel, &dummyContext); - - if (!mDevice || FAILED(result)) - { - return false; - } - - SafeRelease(dummyContext); - SafeRelease(dummyDevice); - - return true; -} - -void Renderer11::release() -{ - RendererD3D::cleanup(); - - mScratchMemoryBuffer.clear(); - - if (mAnnotator != nullptr) - { - gl::UninitializeDebugAnnotations(); - SafeDelete(mAnnotator); - } - - releaseDeviceResources(); - - if (!mCreatedWithDeviceEXT) - { - // Only delete the device if the Renderer11 owns it - // Otherwise we should keep it around in case we try to reinitialize the renderer later - SafeDelete(mEGLDevice); - } - - SafeRelease(mDxgiFactory); - SafeRelease(mDxgiAdapter); - - SafeRelease(mDeviceContext3); - SafeRelease(mDeviceContext1); - - if (mDeviceContext) - { - mDeviceContext->ClearState(); - mDeviceContext->Flush(); - SafeRelease(mDeviceContext); - } - - SafeRelease(mDevice); - SafeRelease(mDebug); - - if (mD3d11Module) - { - FreeLibrary(mD3d11Module); - mD3d11Module = nullptr; - } - - if (mDxgiModule) - { - FreeLibrary(mDxgiModule); - mDxgiModule = nullptr; - } - - if (mDCompModule) - { - FreeLibrary(mDCompModule); - mDCompModule = nullptr; - } - - mCompiler.release(); - - mSupportsShareHandles.reset(); -} - -bool Renderer11::resetDevice() -{ - // recreate everything - release(); - egl::Error result = initialize(); - - if (result.isError()) - { - ERR() << "Could not reinitialize D3D11 device: " << result; - return false; - } - - return true; -} - -std::string Renderer11::getRendererDescription() const -{ - std::ostringstream rendererString; - - rendererString << mDescription; - rendererString << " Direct3D11"; - - rendererString << " vs_" << getMajorShaderModel() << "_" << getMinorShaderModel() - << getShaderModelSuffix(); - rendererString << " ps_" << getMajorShaderModel() << "_" << getMinorShaderModel() - << getShaderModelSuffix(); - - return rendererString.str(); -} - -DeviceIdentifier Renderer11::getAdapterIdentifier() const -{ - // Don't use the AdapterLuid here, since that doesn't persist across reboot. - DeviceIdentifier deviceIdentifier = {0}; - deviceIdentifier.VendorId = mAdapterDescription.VendorId; - deviceIdentifier.DeviceId = mAdapterDescription.DeviceId; - deviceIdentifier.SubSysId = mAdapterDescription.SubSysId; - deviceIdentifier.Revision = mAdapterDescription.Revision; - deviceIdentifier.FeatureLevel = static_cast<UINT>(mRenderer11DeviceCaps.featureLevel); - - return deviceIdentifier; -} - -unsigned int Renderer11::getReservedVertexUniformVectors() const -{ - // Driver uniforms are stored in a separate constant buffer - return d3d11_gl::GetReservedVertexUniformVectors(mRenderer11DeviceCaps.featureLevel); -} - -unsigned int Renderer11::getReservedFragmentUniformVectors() const -{ - // Driver uniforms are stored in a separate constant buffer - return d3d11_gl::GetReservedFragmentUniformVectors(mRenderer11DeviceCaps.featureLevel); -} - -unsigned int Renderer11::getReservedVertexUniformBuffers() const -{ - // we reserve one buffer for the application uniforms, and one for driver uniforms - return 2; -} - -unsigned int Renderer11::getReservedFragmentUniformBuffers() const -{ - // we reserve one buffer for the application uniforms, and one for driver uniforms - return 2; -} - -d3d11::ANGLED3D11DeviceType Renderer11::getDeviceType() const -{ - if (mCreatedWithDeviceEXT) - { - return d3d11::GetDeviceType(mDevice); - } - - if ((mRequestedDriverType == D3D_DRIVER_TYPE_SOFTWARE) || - (mRequestedDriverType == D3D_DRIVER_TYPE_REFERENCE) || - (mRequestedDriverType == D3D_DRIVER_TYPE_NULL)) - { - return d3d11::ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL; - } - - if (mRequestedDriverType == D3D_DRIVER_TYPE_WARP) - { - return d3d11::ANGLE_D3D11_DEVICE_TYPE_WARP; - } - - return d3d11::ANGLE_D3D11_DEVICE_TYPE_HARDWARE; -} - -bool Renderer11::getShareHandleSupport() const -{ - if (mSupportsShareHandles.valid()) - { - return mSupportsShareHandles.value(); - } - - // We only currently support share handles with BGRA surfaces, because - // chrome needs BGRA. Once chrome fixes this, we should always support them. - if (!getNativeExtensions().textureFormatBGRA8888) - { - mSupportsShareHandles = false; - return false; - } - - // PIX doesn't seem to support using share handles, so disable them. - if (gl::DebugAnnotationsActive()) - { - mSupportsShareHandles = false; - return false; - } - - // Qt: we don't care about the 9_3 limitation -#if 0 - // Also disable share handles on Feature Level 9_3, since it doesn't support share handles on - // RGBA8 textures/swapchains. - if (mRenderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3) - { - mSupportsShareHandles = false; - return false; - } -#endif - - // Find out which type of D3D11 device the Renderer11 is using - d3d11::ANGLED3D11DeviceType deviceType = getDeviceType(); - if (deviceType == d3d11::ANGLE_D3D11_DEVICE_TYPE_UNKNOWN) - { - mSupportsShareHandles = false; - return false; - } - - if (deviceType == d3d11::ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL) - { - // Software/Reference/NULL devices don't support share handles - mSupportsShareHandles = false; - return false; - } - - if (deviceType == d3d11::ANGLE_D3D11_DEVICE_TYPE_WARP) - { -#ifndef ANGLE_ENABLE_WINDOWS_STORE - if (!IsWindows8OrGreater()) - { - // WARP on Windows 7 doesn't support shared handles - mSupportsShareHandles = false; - return false; - } -#endif // ANGLE_ENABLE_WINDOWS_STORE - - // WARP on Windows 8.0+ supports shared handles when shared with another WARP device - // TODO: allow applications to query for HARDWARE or WARP-specific share handles, - // to prevent them trying to use a WARP share handle with an a HW device (or - // vice-versa) - // e.g. by creating EGL_D3D11_[HARDWARE/WARP]_DEVICE_SHARE_HANDLE_ANGLE - mSupportsShareHandles = true; - return true; - } - - ASSERT(mCreatedWithDeviceEXT || mRequestedDriverType == D3D_DRIVER_TYPE_HARDWARE); - mSupportsShareHandles = true; - return true; -} - -bool Renderer11::getNV12TextureSupport() const -{ - HRESULT result; - UINT formatSupport; - result = mDevice->CheckFormatSupport(DXGI_FORMAT_NV12, &formatSupport); - if (result == E_FAIL) - { - return false; - } - return (formatSupport & D3D11_FORMAT_SUPPORT_TEXTURE2D) != 0; -} - -int Renderer11::getMajorShaderModel() const -{ - switch (mRenderer11DeviceCaps.featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_SHADER_MAJOR_VERSION; // 5 - case D3D_FEATURE_LEVEL_10_1: - return D3D10_1_SHADER_MAJOR_VERSION; // 4 - case D3D_FEATURE_LEVEL_10_0: - return D3D10_SHADER_MAJOR_VERSION; // 4 - case D3D_FEATURE_LEVEL_9_3: - return D3D10_SHADER_MAJOR_VERSION; // 4 - default: - UNREACHABLE(); - return 0; - } -} - -int Renderer11::getMinorShaderModel() const -{ - switch (mRenderer11DeviceCaps.featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_SHADER_MINOR_VERSION; // 0 - case D3D_FEATURE_LEVEL_10_1: - return D3D10_1_SHADER_MINOR_VERSION; // 1 - case D3D_FEATURE_LEVEL_10_0: - return D3D10_SHADER_MINOR_VERSION; // 0 - case D3D_FEATURE_LEVEL_9_3: - return D3D10_SHADER_MINOR_VERSION; // 0 - default: - UNREACHABLE(); - return 0; - } -} - -std::string Renderer11::getShaderModelSuffix() const -{ - switch (mRenderer11DeviceCaps.featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return ""; - case D3D_FEATURE_LEVEL_10_1: - return ""; - case D3D_FEATURE_LEVEL_10_0: - return ""; - case D3D_FEATURE_LEVEL_9_3: - return "_level_9_3"; - default: - UNREACHABLE(); - return ""; - } -} - -const angle::WorkaroundsD3D &RendererD3D::getWorkarounds() const -{ - if (!mWorkaroundsInitialized) - { - mWorkarounds = generateWorkarounds(); - mWorkaroundsInitialized = true; - } - - return mWorkarounds; -} - -gl::Error Renderer11::copyImageInternal(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - RenderTargetD3D *destRenderTarget) -{ - const gl::FramebufferAttachment *colorAttachment = framebuffer->getReadColorbuffer(); - ASSERT(colorAttachment); - - RenderTarget11 *sourceRenderTarget = nullptr; - ANGLE_TRY(colorAttachment->getRenderTarget(context, &sourceRenderTarget)); - ASSERT(sourceRenderTarget); - - const d3d11::SharedSRV &source = sourceRenderTarget->getBlitShaderResourceView(); - ASSERT(source.valid()); - - const d3d11::RenderTargetView &dest = - GetAs<RenderTarget11>(destRenderTarget)->getRenderTargetView(); - ASSERT(dest.valid()); - - gl::Box sourceArea(sourceRect.x, sourceRect.y, 0, sourceRect.width, sourceRect.height, 1); - gl::Extents sourceSize(sourceRenderTarget->getWidth(), sourceRenderTarget->getHeight(), 1); - - const bool invertSource = UsePresentPathFast(this, colorAttachment); - if (invertSource) - { - sourceArea.y = sourceSize.height - sourceRect.y; - sourceArea.height = -sourceArea.height; - } - - gl::Box destArea(destOffset.x, destOffset.y, 0, sourceRect.width, sourceRect.height, 1); - gl::Extents destSize(destRenderTarget->getWidth(), destRenderTarget->getHeight(), 1); - - // Use nearest filtering because source and destination are the same size for the direct copy. - // Convert to the unsized format before calling copyTexture. - GLenum sourceFormat = colorAttachment->getFormat().info->format; - ANGLE_TRY(mBlit->copyTexture(context, source, sourceArea, sourceSize, sourceFormat, dest, - destArea, destSize, nullptr, gl::GetUnsizedFormat(destFormat), - GL_NEAREST, false, false, false)); - - return gl::NoError(); -} - -gl::Error Renderer11::copyImage2D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) -{ - TextureStorage11_2D *storage11 = GetAs<TextureStorage11_2D>(storage); - ASSERT(storage11); - - gl::ImageIndex index = gl::ImageIndex::Make2D(level); - RenderTargetD3D *destRenderTarget = nullptr; - ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget)); - ASSERT(destRenderTarget); - - ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset, - destRenderTarget)); - - storage11->markLevelDirty(level); - - return gl::NoError(); -} - -gl::Error Renderer11::copyImageCube(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum target, - GLint level) -{ - TextureStorage11_Cube *storage11 = GetAs<TextureStorage11_Cube>(storage); - ASSERT(storage11); - - gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level); - RenderTargetD3D *destRenderTarget = nullptr; - ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget)); - ASSERT(destRenderTarget); - - ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset, - destRenderTarget)); - - storage11->markLevelDirty(level); - - return gl::NoError(); -} - -gl::Error Renderer11::copyImage3D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) -{ - TextureStorage11_3D *storage11 = GetAs<TextureStorage11_3D>(storage); - ASSERT(storage11); - - gl::ImageIndex index = gl::ImageIndex::Make3D(level, destOffset.z); - RenderTargetD3D *destRenderTarget = nullptr; - ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget)); - ASSERT(destRenderTarget); - - ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset, - destRenderTarget)); - - storage11->markLevelDirty(level); - - return gl::NoError(); -} - -gl::Error Renderer11::copyImage2DArray(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) -{ - TextureStorage11_2DArray *storage11 = GetAs<TextureStorage11_2DArray>(storage); - ASSERT(storage11); - - gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, destOffset.z); - RenderTargetD3D *destRenderTarget = nullptr; - ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget)); - ASSERT(destRenderTarget); - - ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset, - destRenderTarget)); - storage11->markLevelDirty(level); - - return gl::NoError(); -} - -gl::Error Renderer11::copyTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum destTarget, - GLint destLevel, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) -{ - TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source); - - TextureStorage *sourceStorage = nullptr; - ANGLE_TRY(sourceD3D->getNativeTexture(context, &sourceStorage)); - - TextureStorage11_2D *sourceStorage11 = GetAs<TextureStorage11_2D>(sourceStorage); - ASSERT(sourceStorage11); - - TextureStorage11 *destStorage11 = GetAs<TextureStorage11>(storage); - ASSERT(destStorage11); - - // Check for fast path where a CopySubresourceRegion can be used. - if (unpackPremultiplyAlpha == unpackUnmultiplyAlpha && !unpackFlipY && - source->getFormat(GL_TEXTURE_2D, sourceLevel).info->format == destFormat && - sourceStorage11->getFormatSet().texFormat == destStorage11->getFormatSet().texFormat) - { - const TextureHelper11 *sourceResource = nullptr; - ANGLE_TRY(sourceStorage11->getResource(context, &sourceResource)); - - gl::ImageIndex sourceIndex = gl::ImageIndex::Make2D(sourceLevel); - UINT sourceSubresource = sourceStorage11->getSubresourceIndex(sourceIndex); - - const TextureHelper11 *destResource = nullptr; - ANGLE_TRY(destStorage11->getResource(context, &destResource)); - - gl::ImageIndex destIndex = gl::ImageIndex::MakeGeneric(destTarget, destLevel); - UINT destSubresource = destStorage11->getSubresourceIndex(destIndex); - - D3D11_BOX sourceBox{ - static_cast<UINT>(sourceRect.x), - static_cast<UINT>(sourceRect.y), - 0u, - static_cast<UINT>(sourceRect.x + sourceRect.width), - static_cast<UINT>(sourceRect.y + sourceRect.height), - 1u, - }; - - mDeviceContext->CopySubresourceRegion(destResource->get(), destSubresource, destOffset.x, - destOffset.y, destOffset.z, sourceResource->get(), - sourceSubresource, &sourceBox); - } - else - { - const d3d11::SharedSRV *sourceSRV = nullptr; - ANGLE_TRY(sourceStorage11->getSRVLevels(context, sourceLevel, sourceLevel, &sourceSRV)); - - gl::ImageIndex destIndex = gl::ImageIndex::MakeGeneric(destTarget, destLevel); - RenderTargetD3D *destRenderTargetD3D = nullptr; - ANGLE_TRY(destStorage11->getRenderTarget(context, destIndex, &destRenderTargetD3D)); - - RenderTarget11 *destRenderTarget11 = GetAs<RenderTarget11>(destRenderTargetD3D); - - const d3d11::RenderTargetView &destRTV = destRenderTarget11->getRenderTargetView(); - ASSERT(destRTV.valid()); - - gl::Box sourceArea(sourceRect.x, sourceRect.y, 0, sourceRect.width, sourceRect.height, 1); - gl::Extents sourceSize( - static_cast<int>(source->getWidth(source->getTarget(), sourceLevel)), - static_cast<int>(source->getHeight(source->getTarget(), sourceLevel)), 1); - if (unpackFlipY) - { - sourceArea.y += sourceArea.height; - sourceArea.height = -sourceArea.height; - } - - gl::Box destArea(destOffset.x, destOffset.y, 0, sourceRect.width, sourceRect.height, 1); - gl::Extents destSize(destRenderTarget11->getWidth(), destRenderTarget11->getHeight(), 1); - - // Use nearest filtering because source and destination are the same size for the direct - // copy - GLenum sourceFormat = source->getFormat(GL_TEXTURE_2D, sourceLevel).info->format; - ANGLE_TRY(mBlit->copyTexture(context, *sourceSRV, sourceArea, sourceSize, sourceFormat, - destRTV, destArea, destSize, nullptr, destFormat, GL_NEAREST, - false, unpackPremultiplyAlpha, unpackUnmultiplyAlpha)); - } - - destStorage11->markLevelDirty(destLevel); - - return gl::NoError(); -} - -gl::Error Renderer11::copyCompressedTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - TextureStorage *storage, - GLint destLevel) -{ - TextureStorage11_2D *destStorage11 = GetAs<TextureStorage11_2D>(storage); - ASSERT(destStorage11); - - const TextureHelper11 *destResource = nullptr; - ANGLE_TRY(destStorage11->getResource(context, &destResource)); - - gl::ImageIndex destIndex = gl::ImageIndex::Make2D(destLevel); - UINT destSubresource = destStorage11->getSubresourceIndex(destIndex); - - TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source); - ASSERT(sourceD3D); - - TextureStorage *sourceStorage = nullptr; - ANGLE_TRY(sourceD3D->getNativeTexture(context, &sourceStorage)); - - TextureStorage11_2D *sourceStorage11 = GetAs<TextureStorage11_2D>(sourceStorage); - ASSERT(sourceStorage11); - - const TextureHelper11 *sourceResource = nullptr; - ANGLE_TRY(sourceStorage11->getResource(context, &sourceResource)); - - gl::ImageIndex sourceIndex = gl::ImageIndex::Make2D(sourceLevel); - UINT sourceSubresource = sourceStorage11->getSubresourceIndex(sourceIndex); - - mDeviceContext->CopySubresourceRegion(destResource->get(), destSubresource, 0, 0, 0, - sourceResource->get(), sourceSubresource, nullptr); - - return gl::NoError(); -} - -gl::Error Renderer11::createRenderTarget(int width, - int height, - GLenum format, - GLsizei samples, - RenderTargetD3D **outRT) -{ - const d3d11::Format &formatInfo = d3d11::Format::Get(format, mRenderer11DeviceCaps); - - const gl::TextureCaps &textureCaps = getNativeTextureCaps().get(format); - GLuint supportedSamples = textureCaps.getNearestSamples(samples); - - if (width > 0 && height > 0) - { - // Create texture resource - D3D11_TEXTURE2D_DESC desc; - desc.Width = width; - desc.Height = height; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = formatInfo.texFormat; - desc.SampleDesc.Count = (supportedSamples == 0) ? 1 : supportedSamples; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.CPUAccessFlags = 0; - desc.MiscFlags = 0; - - // If a rendertarget or depthstencil format exists for this texture format, - // we'll flag it to allow binding that way. Shader resource views are a little - // more complicated. - bool bindRTV = false, bindDSV = false, bindSRV = false; - bindRTV = (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN); - bindDSV = (formatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN); - bindSRV = (formatInfo.srvFormat != DXGI_FORMAT_UNKNOWN); - - bool isMultisampledDepthStencil = bindDSV && desc.SampleDesc.Count > 1; - if (isMultisampledDepthStencil && - !mRenderer11DeviceCaps.supportsMultisampledDepthStencilSRVs) - { - bindSRV = false; - } - - desc.BindFlags = (bindRTV ? D3D11_BIND_RENDER_TARGET : 0) | - (bindDSV ? D3D11_BIND_DEPTH_STENCIL : 0) | - (bindSRV ? D3D11_BIND_SHADER_RESOURCE : 0); - - // The format must be either an RTV or a DSV - ASSERT(bindRTV != bindDSV); - - TextureHelper11 texture; - ANGLE_TRY(allocateTexture(desc, formatInfo, &texture)); - - d3d11::SharedSRV srv; - d3d11::SharedSRV blitSRV; - if (bindSRV) - { - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = formatInfo.srvFormat; - srvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_SRV_DIMENSION_TEXTURE2D - : D3D11_SRV_DIMENSION_TEXTURE2DMS; - srvDesc.Texture2D.MostDetailedMip = 0; - srvDesc.Texture2D.MipLevels = 1; - - ANGLE_TRY(allocateResource(srvDesc, texture.get(), &srv)); - - if (formatInfo.blitSRVFormat != formatInfo.srvFormat) - { - D3D11_SHADER_RESOURCE_VIEW_DESC blitSRVDesc; - blitSRVDesc.Format = formatInfo.blitSRVFormat; - blitSRVDesc.ViewDimension = (supportedSamples == 0) - ? D3D11_SRV_DIMENSION_TEXTURE2D - : D3D11_SRV_DIMENSION_TEXTURE2DMS; - blitSRVDesc.Texture2D.MostDetailedMip = 0; - blitSRVDesc.Texture2D.MipLevels = 1; - - ANGLE_TRY(allocateResource(blitSRVDesc, texture.get(), &blitSRV)); - } - else - { - blitSRV = srv.makeCopy(); - } - } - - if (bindDSV) - { - D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; - dsvDesc.Format = formatInfo.dsvFormat; - dsvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_DSV_DIMENSION_TEXTURE2D - : D3D11_DSV_DIMENSION_TEXTURE2DMS; - dsvDesc.Texture2D.MipSlice = 0; - dsvDesc.Flags = 0; - - d3d11::DepthStencilView dsv; - ANGLE_TRY(allocateResource(dsvDesc, texture.get(), &dsv)); - - *outRT = new TextureRenderTarget11(std::move(dsv), texture, srv, format, formatInfo, - width, height, 1, supportedSamples); - } - else if (bindRTV) - { - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = formatInfo.rtvFormat; - rtvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_RTV_DIMENSION_TEXTURE2D - : D3D11_RTV_DIMENSION_TEXTURE2DMS; - rtvDesc.Texture2D.MipSlice = 0; - - d3d11::RenderTargetView rtv; - ANGLE_TRY(allocateResource(rtvDesc, texture.get(), &rtv)); - - if (formatInfo.dataInitializerFunction != nullptr) - { - const float clearValues[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - mDeviceContext->ClearRenderTargetView(rtv.get(), clearValues); - } - - *outRT = new TextureRenderTarget11(std::move(rtv), texture, srv, blitSRV, format, - formatInfo, width, height, 1, supportedSamples); - } - else - { - UNREACHABLE(); - } - } - else - { - *outRT = new TextureRenderTarget11(d3d11::RenderTargetView(), TextureHelper11(), - d3d11::SharedSRV(), d3d11::SharedSRV(), format, - d3d11::Format::Get(GL_NONE, mRenderer11DeviceCaps), - width, height, 1, supportedSamples); - } - - return gl::NoError(); -} - -gl::Error Renderer11::createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) -{ - ASSERT(source != nullptr); - - RenderTargetD3D *newRT = nullptr; - ANGLE_TRY(createRenderTarget(source->getWidth(), source->getHeight(), - source->getInternalFormat(), source->getSamples(), &newRT)); - - RenderTarget11 *source11 = GetAs<RenderTarget11>(source); - RenderTarget11 *dest11 = GetAs<RenderTarget11>(newRT); - - mDeviceContext->CopySubresourceRegion(dest11->getTexture().get(), dest11->getSubresourceIndex(), - 0, 0, 0, source11->getTexture().get(), - source11->getSubresourceIndex(), nullptr); - *outRT = newRT; - return gl::NoError(); -} - -gl::Error Renderer11::loadExecutable(const uint8_t *function, - size_t length, - gl::ShaderType type, - const std::vector<D3DVarying> &streamOutVaryings, - bool separatedOutputBuffers, - ShaderExecutableD3D **outExecutable) -{ - ShaderData shaderData(function, length); - - switch (type) - { - case gl::SHADER_VERTEX: - { - d3d11::VertexShader vertexShader; - d3d11::GeometryShader streamOutShader; - ANGLE_TRY(allocateResource(shaderData, &vertexShader)); - - if (!streamOutVaryings.empty()) - { - std::vector<D3D11_SO_DECLARATION_ENTRY> soDeclaration; - soDeclaration.reserve(streamOutVaryings.size()); - - for (const auto &streamOutVarying : streamOutVaryings) - { - D3D11_SO_DECLARATION_ENTRY entry = {0}; - entry.Stream = 0; - entry.SemanticName = streamOutVarying.semanticName.c_str(); - entry.SemanticIndex = streamOutVarying.semanticIndex; - entry.StartComponent = 0; - entry.ComponentCount = static_cast<BYTE>(streamOutVarying.componentCount); - entry.OutputSlot = static_cast<BYTE>( - (separatedOutputBuffers ? streamOutVarying.outputSlot : 0)); - soDeclaration.push_back(entry); - } - - ANGLE_TRY(allocateResource(shaderData, &soDeclaration, &streamOutShader)); - } - - *outExecutable = new ShaderExecutable11(function, length, std::move(vertexShader), - std::move(streamOutShader)); - } - break; - case gl::SHADER_FRAGMENT: - { - d3d11::PixelShader pixelShader; - ANGLE_TRY(allocateResource(shaderData, &pixelShader)); - *outExecutable = new ShaderExecutable11(function, length, std::move(pixelShader)); - } - break; - case gl::SHADER_GEOMETRY: - { - d3d11::GeometryShader geometryShader; - ANGLE_TRY(allocateResource(shaderData, &geometryShader)); - *outExecutable = new ShaderExecutable11(function, length, std::move(geometryShader)); - } - break; - case gl::SHADER_COMPUTE: - { - d3d11::ComputeShader computeShader; - ANGLE_TRY(allocateResource(shaderData, &computeShader)); - *outExecutable = new ShaderExecutable11(function, length, std::move(computeShader)); - } - break; - default: - UNREACHABLE(); - return gl::InternalError(); - } - - return gl::NoError(); -} - -gl::Error Renderer11::compileToExecutable(gl::InfoLog &infoLog, - const std::string &shaderHLSL, - gl::ShaderType type, - const std::vector<D3DVarying> &streamOutVaryings, - bool separatedOutputBuffers, - const angle::CompilerWorkaroundsD3D &workarounds, - ShaderExecutableD3D **outExectuable) -{ - std::stringstream profileStream; - - switch (type) - { - case gl::SHADER_VERTEX: - profileStream << "vs"; - break; - case gl::SHADER_FRAGMENT: - profileStream << "ps"; - break; - case gl::SHADER_GEOMETRY: - profileStream << "gs"; - break; - case gl::SHADER_COMPUTE: - profileStream << "cs"; - break; - default: - UNREACHABLE(); - return gl::InternalError(); - } - - profileStream << "_" << getMajorShaderModel() << "_" << getMinorShaderModel() - << getShaderModelSuffix(); - std::string profile = profileStream.str(); - - UINT flags = D3DCOMPILE_OPTIMIZATION_LEVEL2; - - if (gl::DebugAnnotationsActive()) - { -#ifndef NDEBUG - flags = D3DCOMPILE_SKIP_OPTIMIZATION; -#endif - - flags |= D3DCOMPILE_DEBUG; - } - - if (workarounds.enableIEEEStrictness) - flags |= D3DCOMPILE_IEEE_STRICTNESS; - - // Sometimes D3DCompile will fail with the default compilation flags for complicated shaders - // when it would otherwise pass with alternative options. - // Try the default flags first and if compilation fails, try some alternatives. - std::vector<CompileConfig> configs; - configs.push_back(CompileConfig(flags, "default")); - configs.push_back(CompileConfig(flags | D3DCOMPILE_SKIP_VALIDATION, "skip validation")); - configs.push_back(CompileConfig(flags | D3DCOMPILE_SKIP_OPTIMIZATION, "skip optimization")); - - if (getMajorShaderModel() == 4 && getShaderModelSuffix() != "") - { - // Some shaders might cause a "blob content mismatch between level9 and d3d10 shader". - // e.g. dEQP-GLES2.functional.shaders.struct.local.loop_nested_struct_array_*. - // Using the [unroll] directive works around this, as does this D3DCompile flag. - configs.push_back( - CompileConfig(flags | D3DCOMPILE_AVOID_FLOW_CONTROL, "avoid flow control")); - } - - D3D_SHADER_MACRO loopMacros[] = {{"ANGLE_ENABLE_LOOP_FLATTEN", "1"}, {0, 0}}; - - // TODO(jmadill): Use ComPtr? - ID3DBlob *binary = nullptr; - std::string debugInfo; - ANGLE_TRY(mCompiler.compileToBinary(infoLog, shaderHLSL, profile, configs, loopMacros, &binary, - &debugInfo)); - - // It's possible that binary is NULL if the compiler failed in all configurations. Set the - // executable to NULL and return GL_NO_ERROR to signify that there was a link error but the - // internal state is still OK. - if (!binary) - { - *outExectuable = nullptr; - return gl::NoError(); - } - - gl::Error error = loadExecutable(reinterpret_cast<const uint8_t *>(binary->GetBufferPointer()), - binary->GetBufferSize(), type, streamOutVaryings, - separatedOutputBuffers, outExectuable); - - SafeRelease(binary); - if (error.isError()) - { - return error; - } - - if (!debugInfo.empty()) - { - (*outExectuable)->appendDebugInfo(debugInfo); - } - - return gl::NoError(); -} - -gl::Error Renderer11::ensureHLSLCompilerInitialized() -{ - return mCompiler.ensureInitialized(); -} - -UniformStorageD3D *Renderer11::createUniformStorage(size_t storageSize) -{ - return new UniformStorage11(storageSize); -} - -VertexBuffer *Renderer11::createVertexBuffer() -{ - return new VertexBuffer11(this); -} - -IndexBuffer *Renderer11::createIndexBuffer() -{ - return new IndexBuffer11(this); -} - -StreamProducerImpl *Renderer11::createStreamProducerD3DTextureNV12( - egl::Stream::ConsumerType consumerType, - const egl::AttributeMap &attribs) -{ - return new StreamProducerNV12(this); -} - -bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const -{ - ASSERT(getNativeExtensions().pixelBufferObject); - - const gl::InternalFormat &internalFormatInfo = gl::GetSizedInternalFormatInfo(internalFormat); - const d3d11::Format &d3d11FormatInfo = - d3d11::Format::Get(internalFormat, mRenderer11DeviceCaps); - - // sRGB formats do not work with D3D11 buffer SRVs - if (internalFormatInfo.colorEncoding == GL_SRGB) - { - return false; - } - - // We cannot support direct copies to non-color-renderable formats - if (d3d11FormatInfo.rtvFormat == DXGI_FORMAT_UNKNOWN) - { - return false; - } - - // We skip all 3-channel formats since sometimes format support is missing - if (internalFormatInfo.componentCount == 3) - { - return false; - } - - // We don't support formats which we can't represent without conversion - if (d3d11FormatInfo.format().glInternalFormat != internalFormat) - { - return false; - } - - // Buffer SRV creation for this format was not working on Windows 10. - if (d3d11FormatInfo.texFormat == DXGI_FORMAT_B5G5R5A1_UNORM) - { - return false; - } - - // This format is not supported as a buffer SRV. - if (d3d11FormatInfo.texFormat == DXGI_FORMAT_A8_UNORM) - { - return false; - } - - return true; -} - -gl::Error Renderer11::fastCopyBufferToTexture(const gl::Context *context, - const gl::PixelUnpackState &unpack, - unsigned int offset, - RenderTargetD3D *destRenderTarget, - GLenum destinationFormat, - GLenum sourcePixelsType, - const gl::Box &destArea) -{ - ASSERT(supportsFastCopyBufferToTexture(destinationFormat)); - return mPixelTransfer->copyBufferToTexture(context, unpack, offset, destRenderTarget, - destinationFormat, sourcePixelsType, destArea); -} - -ImageD3D *Renderer11::createImage() -{ - return new Image11(this); -} - -gl::Error Renderer11::generateMipmap(const gl::Context *context, ImageD3D *dest, ImageD3D *src) -{ - Image11 *dest11 = GetAs<Image11>(dest); - Image11 *src11 = GetAs<Image11>(src); - return Image11::GenerateMipmap(context, dest11, src11, mRenderer11DeviceCaps); -} - -gl::Error Renderer11::generateMipmapUsingD3D(const gl::Context *context, - TextureStorage *storage, - const gl::TextureState &textureState) -{ - TextureStorage11 *storage11 = GetAs<TextureStorage11>(storage); - - ASSERT(storage11->isRenderTarget()); - ASSERT(storage11->supportsNativeMipmapFunction()); - - const d3d11::SharedSRV *srv = nullptr; - ANGLE_TRY(storage11->getSRVLevels(context, textureState.getEffectiveBaseLevel(), - textureState.getEffectiveMaxLevel(), &srv)); - - mDeviceContext->GenerateMips(srv->get()); - - return gl::NoError(); -} - -gl::Error Renderer11::copyImage(const gl::Context *context, - ImageD3D *dest, - ImageD3D *source, - const gl::Rectangle &sourceRect, - const gl::Offset &destOffset, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) -{ - Image11 *dest11 = GetAs<Image11>(dest); - Image11 *src11 = GetAs<Image11>(source); - return Image11::CopyImage(context, dest11, src11, sourceRect, destOffset, unpackFlipY, - unpackPremultiplyAlpha, unpackUnmultiplyAlpha, mRenderer11DeviceCaps); -} - -TextureStorage *Renderer11::createTextureStorage2D(SwapChainD3D *swapChain) -{ - SwapChain11 *swapChain11 = GetAs<SwapChain11>(swapChain); - return new TextureStorage11_2D(this, swapChain11); -} - -TextureStorage *Renderer11::createTextureStorageEGLImage(EGLImageD3D *eglImage, - RenderTargetD3D *renderTargetD3D) -{ - return new TextureStorage11_EGLImage(this, eglImage, GetAs<RenderTarget11>(renderTargetD3D)); -} - -TextureStorage *Renderer11::createTextureStorageExternal( - egl::Stream *stream, - const egl::Stream::GLTextureDescription &desc) -{ - return new TextureStorage11_External(this, stream, desc); -} - -TextureStorage *Renderer11::createTextureStorage2D(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - int levels, - bool hintLevelZeroOnly) -{ - return new TextureStorage11_2D(this, internalformat, renderTarget, width, height, levels, - hintLevelZeroOnly); -} - -TextureStorage *Renderer11::createTextureStorageCube(GLenum internalformat, - bool renderTarget, - int size, - int levels, - bool hintLevelZeroOnly) -{ - return new TextureStorage11_Cube(this, internalformat, renderTarget, size, levels, - hintLevelZeroOnly); -} - -TextureStorage *Renderer11::createTextureStorage3D(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - GLsizei depth, - int levels) -{ - return new TextureStorage11_3D(this, internalformat, renderTarget, width, height, depth, - levels); -} - -TextureStorage *Renderer11::createTextureStorage2DArray(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - GLsizei depth, - int levels) -{ - return new TextureStorage11_2DArray(this, internalformat, renderTarget, width, height, depth, - levels); -} - -TextureStorage *Renderer11::createTextureStorage2DMultisample(GLenum internalformat, - GLsizei width, - GLsizei height, - int levels, - int samples, - bool fixedSampleLocations) -{ - return new TextureStorage11_2DMultisample(this, internalformat, width, height, levels, samples, - fixedSampleLocations); -} - -gl::Error Renderer11::readFromAttachment(const gl::Context *context, - const gl::FramebufferAttachment &srcAttachment, - const gl::Rectangle &sourceArea, - GLenum format, - GLenum type, - GLuint outputPitch, - const gl::PixelPackState &pack, - uint8_t *pixelsOut) -{ - ASSERT(sourceArea.width >= 0); - ASSERT(sourceArea.height >= 0); - - const bool invertTexture = UsePresentPathFast(this, &srcAttachment); - - RenderTarget11 *rt11 = nullptr; - ANGLE_TRY(srcAttachment.getRenderTarget(context, &rt11)); - ASSERT(rt11->getTexture().valid()); - - const TextureHelper11 &textureHelper = rt11->getTexture(); - unsigned int sourceSubResource = rt11->getSubresourceIndex(); - - const gl::Extents &texSize = textureHelper.getExtents(); - - gl::Rectangle actualArea = sourceArea; - if (invertTexture) - { - actualArea.y = texSize.height - actualArea.y - actualArea.height; - } - - // Clamp read region to the defined texture boundaries, preventing out of bounds reads - // and reads of uninitialized data. - gl::Rectangle safeArea; - safeArea.x = gl::clamp(actualArea.x, 0, texSize.width); - safeArea.y = gl::clamp(actualArea.y, 0, texSize.height); - safeArea.width = - gl::clamp(actualArea.width + std::min(actualArea.x, 0), 0, texSize.width - safeArea.x); - safeArea.height = - gl::clamp(actualArea.height + std::min(actualArea.y, 0), 0, texSize.height - safeArea.y); - - ASSERT(safeArea.x >= 0 && safeArea.y >= 0); - ASSERT(safeArea.x + safeArea.width <= texSize.width); - ASSERT(safeArea.y + safeArea.height <= texSize.height); - - if (safeArea.width == 0 || safeArea.height == 0) - { - // no work to do - return gl::NoError(); - } - - gl::Extents safeSize(safeArea.width, safeArea.height, 1); - TextureHelper11 stagingHelper; - ANGLE_TRY_RESULT( - createStagingTexture(textureHelper.getTextureType(), textureHelper.getFormatSet(), safeSize, - StagingAccess::READ), - stagingHelper); - - TextureHelper11 resolvedTextureHelper; - - // "srcTexture" usually points to the source texture. - // For 2D multisampled textures, it points to the multisampled resolve texture. - const TextureHelper11 *srcTexture = &textureHelper; - - if (textureHelper.is2D() && textureHelper.getSampleCount() > 1) - { - D3D11_TEXTURE2D_DESC resolveDesc; - resolveDesc.Width = static_cast<UINT>(texSize.width); - resolveDesc.Height = static_cast<UINT>(texSize.height); - resolveDesc.MipLevels = 1; - resolveDesc.ArraySize = 1; - resolveDesc.Format = textureHelper.getFormat(); - resolveDesc.SampleDesc.Count = 1; - resolveDesc.SampleDesc.Quality = 0; - resolveDesc.Usage = D3D11_USAGE_DEFAULT; - resolveDesc.BindFlags = 0; - resolveDesc.CPUAccessFlags = 0; - resolveDesc.MiscFlags = 0; - - ANGLE_TRY( - allocateTexture(resolveDesc, textureHelper.getFormatSet(), &resolvedTextureHelper)); - - mDeviceContext->ResolveSubresource(resolvedTextureHelper.get(), 0, textureHelper.get(), - sourceSubResource, textureHelper.getFormat()); - - sourceSubResource = 0; - srcTexture = &resolvedTextureHelper; - } - - D3D11_BOX srcBox; - srcBox.left = static_cast<UINT>(safeArea.x); - srcBox.right = static_cast<UINT>(safeArea.x + safeArea.width); - srcBox.top = static_cast<UINT>(safeArea.y); - srcBox.bottom = static_cast<UINT>(safeArea.y + safeArea.height); - - // Select the correct layer from a 3D attachment - srcBox.front = 0; - if (textureHelper.is3D()) - { - srcBox.front = static_cast<UINT>(srcAttachment.layer()); - } - srcBox.back = srcBox.front + 1; - - mDeviceContext->CopySubresourceRegion(stagingHelper.get(), 0, 0, 0, 0, srcTexture->get(), - sourceSubResource, &srcBox); - - gl::Buffer *packBuffer = context->getGLState().getTargetBuffer(gl::BufferBinding::PixelPack); - if (!invertTexture) - { - PackPixelsParams packParams(safeArea, format, type, outputPitch, pack, packBuffer, 0); - return packPixels(stagingHelper, packParams, pixelsOut); - } - - // Create a new PixelPackState with reversed row order. Note that we can't just assign - // 'invertTexturePack' to be 'pack' (or memcpy) since that breaks the ref counting/object - // tracking in the 'pixelBuffer' members, causing leaks. Instead we must use - // pixelBuffer.set() twice, which performs the addRef/release correctly - gl::PixelPackState invertTexturePack; - invertTexturePack.alignment = pack.alignment; - invertTexturePack.reverseRowOrder = !pack.reverseRowOrder; - - PackPixelsParams packParams(safeArea, format, type, outputPitch, invertTexturePack, packBuffer, - 0); - gl::Error error = packPixels(stagingHelper, packParams, pixelsOut); - ANGLE_TRY(error); - return gl::NoError(); -} - -gl::Error Renderer11::packPixels(const TextureHelper11 &textureHelper, - const PackPixelsParams ¶ms, - uint8_t *pixelsOut) -{ - ID3D11Resource *readResource = textureHelper.get(); - - D3D11_MAPPED_SUBRESOURCE mapping; - HRESULT hr = mDeviceContext->Map(readResource, 0, D3D11_MAP_READ, 0, &mapping); - if (FAILED(hr)) - { - ASSERT(hr == E_OUTOFMEMORY); - return gl::OutOfMemory() << "Failed to map internal texture for reading, " << gl::FmtHR(hr); - } - - uint8_t *source = static_cast<uint8_t *>(mapping.pData); - int inputPitch = static_cast<int>(mapping.RowPitch); - - const auto &formatInfo = textureHelper.getFormatSet(); - ASSERT(formatInfo.format().glInternalFormat != GL_NONE); - - PackPixels(params, formatInfo.format(), inputPitch, source, pixelsOut); - - mDeviceContext->Unmap(readResource, 0); - - return gl::NoError(); -} - -gl::Error Renderer11::blitRenderbufferRect(const gl::Context *context, - const gl::Rectangle &readRectIn, - const gl::Rectangle &drawRectIn, - RenderTargetD3D *readRenderTarget, - RenderTargetD3D *drawRenderTarget, - GLenum filter, - const gl::Rectangle *scissor, - bool colorBlit, - bool depthBlit, - bool stencilBlit) -{ - // Since blitRenderbufferRect is called for each render buffer that needs to be blitted, - // it should never be the case that both color and depth/stencil need to be blitted at - // at the same time. - ASSERT(colorBlit != (depthBlit || stencilBlit)); - - RenderTarget11 *drawRenderTarget11 = GetAs<RenderTarget11>(drawRenderTarget); - if (!drawRenderTarget11) - { - return gl::OutOfMemory() - << "Failed to retrieve the internal draw render target from the draw framebuffer."; - } - - const TextureHelper11 &drawTexture = drawRenderTarget11->getTexture(); - unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex(); - - RenderTarget11 *readRenderTarget11 = GetAs<RenderTarget11>(readRenderTarget); - if (!readRenderTarget11) - { - return gl::OutOfMemory() - << "Failed to retrieve the internal read render target from the read framebuffer."; - } - - TextureHelper11 readTexture; - unsigned int readSubresource = 0; - d3d11::SharedSRV readSRV; - - if (readRenderTarget->isMultisampled()) - { - ANGLE_TRY_RESULT( - resolveMultisampledTexture(context, readRenderTarget11, depthBlit, stencilBlit), - readTexture); - - if (!stencilBlit) - { - const auto &readFormatSet = readTexture.getFormatSet(); - - D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc; - viewDesc.Format = readFormatSet.srvFormat; - viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - viewDesc.Texture2D.MipLevels = 1; - viewDesc.Texture2D.MostDetailedMip = 0; - - ANGLE_TRY(allocateResource(viewDesc, readTexture.get(), &readSRV)); - } - } - else - { - ASSERT(readRenderTarget11); - readTexture = readRenderTarget11->getTexture(); - readSubresource = readRenderTarget11->getSubresourceIndex(); - readSRV = readRenderTarget11->getBlitShaderResourceView().makeCopy(); - if (!readSRV.valid()) - { - ASSERT(depthBlit || stencilBlit); - readSRV = readRenderTarget11->getShaderResourceView().makeCopy(); - } - ASSERT(readSRV.valid()); - } - - // Stencil blits don't use shaders. - ASSERT(readSRV.valid() || stencilBlit); - - const gl::Extents readSize(readRenderTarget->getWidth(), readRenderTarget->getHeight(), 1); - const gl::Extents drawSize(drawRenderTarget->getWidth(), drawRenderTarget->getHeight(), 1); - - // From the spec: - // "The actual region taken from the read framebuffer is limited to the intersection of the - // source buffers being transferred, which may include the color buffer selected by the read - // buffer, the depth buffer, and / or the stencil buffer depending on mask." - // This means negative x and y are out of bounds, and not to be read from. We handle this here - // by internally scaling the read and draw rectangles. - gl::Rectangle readRect = readRectIn; - gl::Rectangle drawRect = drawRectIn; - - auto flip = [](int val) { return val >= 0 ? 1 : -1; }; - - if (readRect.x > readSize.width && readRect.width < 0) - { - int delta = readRect.x - readSize.width; - readRect.x -= delta; - readRect.width += delta; - - int drawDelta = delta * flip(drawRect.width); - drawRect.x += drawDelta; - drawRect.width -= drawDelta; - } - - if (readRect.y > readSize.height && readRect.height < 0) - { - int delta = readRect.y - readSize.height; - readRect.y -= delta; - readRect.height += delta; - - int drawDelta = delta * flip(drawRect.height); - drawRect.y += drawDelta; - drawRect.height -= drawDelta; - } - - auto readToDrawX = [&drawRectIn, &readRectIn](int readOffset) { - double readToDrawScale = - static_cast<double>(drawRectIn.width) / static_cast<double>(readRectIn.width); - return static_cast<int>(round(static_cast<double>(readOffset) * readToDrawScale)); - }; - if (readRect.x < 0) - { - int readOffset = -readRect.x; - readRect.x += readOffset; - readRect.width -= readOffset; - - int drawOffset = readToDrawX(readOffset); - drawRect.x += drawOffset; - drawRect.width -= drawOffset; - } - - auto readToDrawY = [&drawRectIn, &readRectIn](int readOffset) { - double readToDrawScale = - static_cast<double>(drawRectIn.height) / static_cast<double>(readRectIn.height); - return static_cast<int>(round(static_cast<double>(readOffset) * readToDrawScale)); - }; - if (readRect.y < 0) - { - int readOffset = -readRect.y; - readRect.y += readOffset; - readRect.height -= readOffset; - - int drawOffset = readToDrawY(readOffset); - drawRect.y += drawOffset; - drawRect.height -= drawOffset; - } - - if (readRect.x1() < 0) - { - int readOffset = -readRect.x1(); - readRect.width += readOffset; - - int drawOffset = readToDrawX(readOffset); - drawRect.width += drawOffset; - } - - if (readRect.y1() < 0) - { - int readOffset = -readRect.y1(); - readRect.height += readOffset; - - int drawOffset = readToDrawY(readOffset); - drawRect.height += drawOffset; - } - - if (readRect.x1() > readSize.width) - { - int delta = readRect.x1() - readSize.width; - readRect.width -= delta; - drawRect.width -= delta * flip(drawRect.width); - } - - if (readRect.y1() > readSize.height) - { - int delta = readRect.y1() - readSize.height; - readRect.height -= delta; - drawRect.height -= delta * flip(drawRect.height); - } - - bool scissorNeeded = scissor && gl::ClipRectangle(drawRect, *scissor, nullptr); - - const auto &destFormatInfo = - gl::GetSizedInternalFormatInfo(drawRenderTarget->getInternalFormat()); - const auto &srcFormatInfo = - gl::GetSizedInternalFormatInfo(readRenderTarget->getInternalFormat()); - const auto &formatSet = drawRenderTarget11->getFormatSet(); - const auto &nativeFormat = formatSet.format(); - - // Some blits require masking off emulated texture channels. eg: from RGBA8 to RGB8, we - // emulate RGB8 with RGBA8, so we need to mask off the alpha channel when we copy. - - gl::Color<bool> colorMask; - colorMask.red = - (srcFormatInfo.redBits > 0) && (destFormatInfo.redBits == 0) && (nativeFormat.redBits > 0); - colorMask.green = (srcFormatInfo.greenBits > 0) && (destFormatInfo.greenBits == 0) && - (nativeFormat.greenBits > 0); - colorMask.blue = (srcFormatInfo.blueBits > 0) && (destFormatInfo.blueBits == 0) && - (nativeFormat.blueBits > 0); - colorMask.alpha = (srcFormatInfo.alphaBits > 0) && (destFormatInfo.alphaBits == 0) && - (nativeFormat.alphaBits > 0); - - // We only currently support masking off the alpha channel. - bool colorMaskingNeeded = colorMask.alpha; - ASSERT(!colorMask.red && !colorMask.green && !colorMask.blue); - - bool wholeBufferCopy = !scissorNeeded && !colorMaskingNeeded && readRect.x == 0 && - readRect.width == readSize.width && readRect.y == 0 && - readRect.height == readSize.height && drawRect.x == 0 && - drawRect.width == drawSize.width && drawRect.y == 0 && - drawRect.height == drawSize.height; - - bool stretchRequired = readRect.width != drawRect.width || readRect.height != drawRect.height; - - bool flipRequired = - readRect.width < 0 || readRect.height < 0 || drawRect.width < 0 || drawRect.height < 0; - - bool outOfBounds = readRect.x < 0 || readRect.x + readRect.width > readSize.width || - readRect.y < 0 || readRect.y + readRect.height > readSize.height || - drawRect.x < 0 || drawRect.x + drawRect.width > drawSize.width || - drawRect.y < 0 || drawRect.y + drawRect.height > drawSize.height; - - bool partialDSBlit = - (nativeFormat.depthBits > 0 && depthBlit) != (nativeFormat.stencilBits > 0 && stencilBlit); - - if (readRenderTarget11->getFormatSet().formatID == - drawRenderTarget11->getFormatSet().formatID && - !stretchRequired && !outOfBounds && !flipRequired && !partialDSBlit && - !colorMaskingNeeded && (!(depthBlit || stencilBlit) || wholeBufferCopy)) - { - UINT dstX = drawRect.x; - UINT dstY = drawRect.y; - - D3D11_BOX readBox; - readBox.left = readRect.x; - readBox.right = readRect.x + readRect.width; - readBox.top = readRect.y; - readBox.bottom = readRect.y + readRect.height; - readBox.front = 0; - readBox.back = 1; - - if (scissorNeeded) - { - // drawRect is guaranteed to have positive width and height because stretchRequired is - // false. - ASSERT(drawRect.width >= 0 || drawRect.height >= 0); - - if (drawRect.x < scissor->x) - { - dstX = scissor->x; - readBox.left += (scissor->x - drawRect.x); - } - if (drawRect.y < scissor->y) - { - dstY = scissor->y; - readBox.top += (scissor->y - drawRect.y); - } - if (drawRect.x + drawRect.width > scissor->x + scissor->width) - { - readBox.right -= ((drawRect.x + drawRect.width) - (scissor->x + scissor->width)); - } - if (drawRect.y + drawRect.height > scissor->y + scissor->height) - { - readBox.bottom -= ((drawRect.y + drawRect.height) - (scissor->y + scissor->height)); - } - } - - // D3D11 needs depth-stencil CopySubresourceRegions to have a NULL pSrcBox - // We also require complete framebuffer copies for depth-stencil blit. - D3D11_BOX *pSrcBox = wholeBufferCopy ? nullptr : &readBox; - - mDeviceContext->CopySubresourceRegion(drawTexture.get(), drawSubresource, dstX, dstY, 0, - readTexture.get(), readSubresource, pSrcBox); - } - else - { - gl::Box readArea(readRect.x, readRect.y, 0, readRect.width, readRect.height, 1); - gl::Box drawArea(drawRect.x, drawRect.y, 0, drawRect.width, drawRect.height, 1); - - if (depthBlit && stencilBlit) - { - ANGLE_TRY(mBlit->copyDepthStencil(readTexture, readSubresource, readArea, readSize, - drawTexture, drawSubresource, drawArea, drawSize, - scissor)); - } - else if (depthBlit) - { - const d3d11::DepthStencilView &drawDSV = drawRenderTarget11->getDepthStencilView(); - ASSERT(readSRV.valid()); - ANGLE_TRY(mBlit->copyDepth(context, readSRV, readArea, readSize, drawDSV, drawArea, - drawSize, scissor)); - } - else if (stencilBlit) - { - ANGLE_TRY(mBlit->copyStencil(context, readTexture, readSubresource, readArea, readSize, - drawTexture, drawSubresource, drawArea, drawSize, - scissor)); - } - else - { - const d3d11::RenderTargetView &drawRTV = drawRenderTarget11->getRenderTargetView(); - - // We don't currently support masking off any other channel than alpha - bool maskOffAlpha = colorMaskingNeeded && colorMask.alpha; - ASSERT(readSRV.valid()); - ANGLE_TRY(mBlit->copyTexture( - context, readSRV, readArea, readSize, srcFormatInfo.format, drawRTV, drawArea, - drawSize, scissor, destFormatInfo.format, filter, maskOffAlpha, false, false)); - } - } - - return gl::NoError(); -} - -bool Renderer11::isES3Capable() const -{ - return (d3d11_gl::GetMaximumClientVersion(mRenderer11DeviceCaps.featureLevel).major > 2); -} - -RendererClass Renderer11::getRendererClass() const -{ - return RENDERER_D3D11; -} - -void Renderer11::onSwap() -{ - // Send histogram updates every half hour - const double kHistogramUpdateInterval = 30 * 60; - - auto *platform = ANGLEPlatformCurrent(); - const double currentTime = platform->monotonicallyIncreasingTime(platform); - const double timeSinceLastUpdate = currentTime - mLastHistogramUpdateTime; - - if (timeSinceLastUpdate > kHistogramUpdateInterval) - { - updateHistograms(); - mLastHistogramUpdateTime = currentTime; - } -} - -void Renderer11::updateHistograms() -{ - // Update the buffer CPU memory histogram - { - size_t sizeSum = 0; - for (const Buffer11 *buffer : mAliveBuffers) - { - sizeSum += buffer->getTotalCPUBufferMemoryBytes(); - } - const int kOneMegaByte = 1024 * 1024; - ANGLE_HISTOGRAM_MEMORY_MB("GPU.ANGLE.Buffer11CPUMemoryMB", - static_cast<int>(sizeSum) / kOneMegaByte); - } -} - -void Renderer11::onBufferCreate(const Buffer11 *created) -{ - mAliveBuffers.insert(created); -} - -void Renderer11::onBufferDelete(const Buffer11 *deleted) -{ - mAliveBuffers.erase(deleted); -} - -gl::ErrorOrResult<TextureHelper11> Renderer11::resolveMultisampledTexture( - const gl::Context *context, - RenderTarget11 *renderTarget, - bool depth, - bool stencil) -{ - if (depth && !stencil) - { - return mBlit->resolveDepth(context, renderTarget); - } - - if (stencil) - { - return mBlit->resolveStencil(context, renderTarget, depth); - } - - const auto &formatSet = renderTarget->getFormatSet(); - - ASSERT(renderTarget->isMultisampled()); - const d3d11::SharedSRV &sourceSRV = renderTarget->getShaderResourceView(); - D3D11_SHADER_RESOURCE_VIEW_DESC sourceSRVDesc; - sourceSRV.get()->GetDesc(&sourceSRVDesc); - ASSERT(sourceSRVDesc.ViewDimension == D3D_SRV_DIMENSION_TEXTURE2DMS); - - if (!mCachedResolveTexture.valid() || - mCachedResolveTexture.getExtents().width != renderTarget->getWidth() || - mCachedResolveTexture.getExtents().height != renderTarget->getHeight() || - mCachedResolveTexture.getFormat() != formatSet.texFormat) - { - D3D11_TEXTURE2D_DESC resolveDesc; - resolveDesc.Width = renderTarget->getWidth(); - resolveDesc.Height = renderTarget->getHeight(); - resolveDesc.MipLevels = 1; - resolveDesc.ArraySize = 1; - resolveDesc.Format = formatSet.texFormat; - resolveDesc.SampleDesc.Count = 1; - resolveDesc.SampleDesc.Quality = 0; - resolveDesc.Usage = D3D11_USAGE_DEFAULT; - resolveDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - resolveDesc.CPUAccessFlags = 0; - resolveDesc.MiscFlags = 0; - - ANGLE_TRY(allocateTexture(resolveDesc, formatSet, &mCachedResolveTexture)); - } - - mDeviceContext->ResolveSubresource(mCachedResolveTexture.get(), 0, - renderTarget->getTexture().get(), - renderTarget->getSubresourceIndex(), formatSet.texFormat); - return mCachedResolveTexture; -} - -bool Renderer11::getLUID(LUID *adapterLuid) const -{ - adapterLuid->HighPart = 0; - adapterLuid->LowPart = 0; - - if (!mDxgiAdapter) - { - return false; - } - - DXGI_ADAPTER_DESC adapterDesc; - if (FAILED(mDxgiAdapter->GetDesc(&adapterDesc))) - { - return false; - } - - *adapterLuid = adapterDesc.AdapterLuid; - return true; -} - -VertexConversionType Renderer11::getVertexConversionType( - gl::VertexFormatType vertexFormatType) const -{ - return d3d11::GetVertexFormatInfo(vertexFormatType, mRenderer11DeviceCaps.featureLevel) - .conversionType; -} - -GLenum Renderer11::getVertexComponentType(gl::VertexFormatType vertexFormatType) const -{ - const auto &format = - d3d11::GetVertexFormatInfo(vertexFormatType, mRenderer11DeviceCaps.featureLevel); - return d3d11::GetComponentType(format.nativeFormat); -} - -gl::ErrorOrResult<unsigned int> Renderer11::getVertexSpaceRequired( - const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLsizei count, - GLsizei instances) const -{ - if (!attrib.enabled) - { - return 16u; - } - - unsigned int elementCount = 0; - const unsigned int divisor = binding.getDivisor(); - if (instances == 0 || divisor == 0) - { - elementCount = count; - } - else - { - // Round up to divisor, if possible - elementCount = UnsignedCeilDivide(static_cast<unsigned int>(instances), divisor); - } - - gl::VertexFormatType formatType = gl::GetVertexFormatType(attrib); - const D3D_FEATURE_LEVEL featureLevel = mRenderer11DeviceCaps.featureLevel; - const d3d11::VertexFormat &vertexFormatInfo = - d3d11::GetVertexFormatInfo(formatType, featureLevel); - const d3d11::DXGIFormatSize &dxgiFormatInfo = - d3d11::GetDXGIFormatSizeInfo(vertexFormatInfo.nativeFormat); - unsigned int elementSize = dxgiFormatInfo.pixelBytes; - if (elementSize > std::numeric_limits<unsigned int>::max() / elementCount) - { - return gl::OutOfMemory() << "New vertex buffer size would result in an overflow."; - } - - return elementSize * elementCount; -} - -void Renderer11::generateCaps(gl::Caps *outCaps, - gl::TextureCapsMap *outTextureCaps, - gl::Extensions *outExtensions, - gl::Limitations *outLimitations) const -{ - d3d11_gl::GenerateCaps(mDevice, mDeviceContext, mRenderer11DeviceCaps, outCaps, outTextureCaps, - outExtensions, outLimitations); -} - -angle::WorkaroundsD3D Renderer11::generateWorkarounds() const -{ - return d3d11::GenerateWorkarounds(mRenderer11DeviceCaps, mAdapterDescription); -} - -egl::Error Renderer11::getEGLDevice(DeviceImpl **device) -{ - if (mEGLDevice == nullptr) - { - ASSERT(mDevice != nullptr); - mEGLDevice = new DeviceD3D(); - egl::Error error = mEGLDevice->initialize(reinterpret_cast<void *>(mDevice), - EGL_D3D11_DEVICE_ANGLE, EGL_FALSE); - - if (error.isError()) - { - SafeDelete(mEGLDevice); - return error; - } - } - - *device = static_cast<DeviceImpl *>(mEGLDevice); - return egl::NoError(); -} - -ContextImpl *Renderer11::createContext(const gl::ContextState &state) -{ - return new Context11(state, this); -} - -FramebufferImpl *Renderer11::createDefaultFramebuffer(const gl::FramebufferState &state) -{ - return new Framebuffer11(state, this); -} - -gl::Error Renderer11::getScratchMemoryBuffer(size_t requestedSize, angle::MemoryBuffer **bufferOut) -{ - if (!mScratchMemoryBuffer.get(requestedSize, bufferOut)) - { - return gl::OutOfMemory() << "Failed to allocate internal buffer."; - } - return gl::NoError(); -} - -gl::Version Renderer11::getMaxSupportedESVersion() const -{ - return d3d11_gl::GetMaximumClientVersion(mRenderer11DeviceCaps.featureLevel); -} - -gl::DebugAnnotator *Renderer11::getAnnotator() -{ - return mAnnotator; -} - -gl::Error Renderer11::applyComputeShader(const gl::Context *context) -{ - ANGLE_TRY(ensureHLSLCompilerInitialized()); - - const auto &glState = context->getGLState(); - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram()); - - ShaderExecutableD3D *computeExe = nullptr; - ANGLE_TRY(programD3D->getComputeExecutable(&computeExe)); - ASSERT(computeExe != nullptr); - - mStateManager.setComputeShader(&GetAs<ShaderExecutable11>(computeExe)->getComputeShader()); - ANGLE_TRY(mStateManager.applyComputeUniforms(programD3D)); - - return gl::NoError(); -} - -gl::Error Renderer11::dispatchCompute(const gl::Context *context, - GLuint numGroupsX, - GLuint numGroupsY, - GLuint numGroupsZ) -{ - ANGLE_TRY(mStateManager.updateStateForCompute(context, numGroupsX, numGroupsY, numGroupsZ)); - ANGLE_TRY(applyComputeShader(context)); - - mDeviceContext->Dispatch(numGroupsX, numGroupsY, numGroupsZ); - - return gl::NoError(); -} - -gl::ErrorOrResult<TextureHelper11> Renderer11::createStagingTexture( - ResourceType textureType, - const d3d11::Format &formatSet, - const gl::Extents &size, - StagingAccess readAndWriteAccess) -{ - if (textureType == ResourceType::Texture2D) - { - D3D11_TEXTURE2D_DESC stagingDesc; - stagingDesc.Width = size.width; - stagingDesc.Height = size.height; - stagingDesc.MipLevels = 1; - stagingDesc.ArraySize = 1; - stagingDesc.Format = formatSet.texFormat; - stagingDesc.SampleDesc.Count = 1; - stagingDesc.SampleDesc.Quality = 0; - stagingDesc.Usage = D3D11_USAGE_STAGING; - stagingDesc.BindFlags = 0; - stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - stagingDesc.MiscFlags = 0; - - if (readAndWriteAccess == StagingAccess::READ_WRITE) - { - stagingDesc.CPUAccessFlags |= D3D11_CPU_ACCESS_WRITE; - } - - TextureHelper11 stagingTex; - ANGLE_TRY(allocateTexture(stagingDesc, formatSet, &stagingTex)); - return stagingTex; - } - ASSERT(textureType == ResourceType::Texture3D); - - D3D11_TEXTURE3D_DESC stagingDesc; - stagingDesc.Width = size.width; - stagingDesc.Height = size.height; - stagingDesc.Depth = 1; - stagingDesc.MipLevels = 1; - stagingDesc.Format = formatSet.texFormat; - stagingDesc.Usage = D3D11_USAGE_STAGING; - stagingDesc.BindFlags = 0; - stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - stagingDesc.MiscFlags = 0; - - TextureHelper11 stagingTex; - ANGLE_TRY(allocateTexture(stagingDesc, formatSet, &stagingTex)); - return stagingTex; -} - -gl::Error Renderer11::allocateTexture(const D3D11_TEXTURE2D_DESC &desc, - const d3d11::Format &format, - const D3D11_SUBRESOURCE_DATA *initData, - TextureHelper11 *textureOut) -{ - d3d11::Texture2D texture; - ANGLE_TRY(mResourceManager11.allocate(this, &desc, initData, &texture)); - textureOut->init(std::move(texture), desc, format); - return gl::NoError(); -} - -gl::Error Renderer11::allocateTexture(const D3D11_TEXTURE3D_DESC &desc, - const d3d11::Format &format, - const D3D11_SUBRESOURCE_DATA *initData, - TextureHelper11 *textureOut) -{ - d3d11::Texture3D texture; - ANGLE_TRY(mResourceManager11.allocate(this, &desc, initData, &texture)); - textureOut->init(std::move(texture), desc, format); - return gl::NoError(); -} - -gl::Error Renderer11::getBlendState(const d3d11::BlendStateKey &key, - const d3d11::BlendState **outBlendState) -{ - return mStateCache.getBlendState(this, key, outBlendState); -} - -gl::Error Renderer11::getRasterizerState(const gl::RasterizerState &rasterState, - bool scissorEnabled, - ID3D11RasterizerState **outRasterizerState) -{ - return mStateCache.getRasterizerState(this, rasterState, scissorEnabled, outRasterizerState); -} - -gl::Error Renderer11::getDepthStencilState(const gl::DepthStencilState &dsState, - const d3d11::DepthStencilState **outDSState) -{ - return mStateCache.getDepthStencilState(this, dsState, outDSState); -} - -gl::Error Renderer11::getSamplerState(const gl::SamplerState &samplerState, - ID3D11SamplerState **outSamplerState) -{ - return mStateCache.getSamplerState(this, samplerState, outSamplerState); -} - -gl::Error Renderer11::clearRenderTarget(RenderTargetD3D *renderTarget, - const gl::ColorF &clearColorValue, - const float clearDepthValue, - const unsigned int clearStencilValue) -{ - RenderTarget11 *rt11 = GetAs<RenderTarget11>(renderTarget); - - if (rt11->getDepthStencilView().valid()) - { - const auto &format = rt11->getFormatSet(); - const UINT clearFlags = (format.format().depthBits > 0 ? D3D11_CLEAR_DEPTH : 0) | - (format.format().stencilBits ? D3D11_CLEAR_STENCIL : 0); - mDeviceContext->ClearDepthStencilView(rt11->getDepthStencilView().get(), clearFlags, - clearDepthValue, - static_cast<UINT8>(clearStencilValue)); - return gl::NoError(); - } - - ASSERT(rt11->getRenderTargetView().valid()); - ID3D11RenderTargetView *rtv = rt11->getRenderTargetView().get(); - - // There are complications with some types of RTV and FL 9_3 with ClearRenderTargetView. - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ff476388(v=vs.85).aspx - ASSERT(mRenderer11DeviceCaps.featureLevel > D3D_FEATURE_LEVEL_9_3 || !IsArrayRTV(rtv)); - - const auto &d3d11Format = rt11->getFormatSet(); - const auto &glFormat = gl::GetSizedInternalFormatInfo(renderTarget->getInternalFormat()); - - gl::ColorF safeClearColor = clearColorValue; - - if (d3d11Format.format().alphaBits > 0 && glFormat.alphaBits == 0) - { - safeClearColor.alpha = 1.0f; - } - - mDeviceContext->ClearRenderTargetView(rtv, &safeClearColor.red); - return gl::NoError(); -} - -bool Renderer11::canSelectViewInVertexShader() const -{ - return !getWorkarounds().selectViewInGeometryShader && - getRenderer11DeviceCaps().supportsVpRtIndexWriteFromVertexShader; -} - -gl::Error Renderer11::markTransformFeedbackUsage(const gl::Context *context) -{ - const gl::State &glState = context->getGLState(); - const gl::TransformFeedback *transformFeedback = glState.getCurrentTransformFeedback(); - for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++) - { - const gl::OffsetBindingPointer<gl::Buffer> &binding = - transformFeedback->getIndexedBuffer(i); - if (binding.get() != nullptr) - { - BufferD3D *bufferD3D = GetImplAs<BufferD3D>(binding.get()); - ANGLE_TRY(bufferD3D->markTransformFeedbackUsage(context)); - } - } - - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h deleted file mode 100644 index a8c24e681b..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h +++ /dev/null @@ -1,576 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// Renderer11.h: Defines a back-end specific class for the D3D11 renderer. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_H_ - -#include "common/angleutils.h" -#include "common/mathutil.h" -#include "libANGLE/AttributeMap.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/renderer/d3d/HLSLCompiler.h" -#include "libANGLE/renderer/d3d/ProgramD3D.h" -#include "libANGLE/renderer/d3d/RenderTargetD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h" -#include "libANGLE/renderer/d3d/d3d11/RenderStateCache.h" -#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" -#include "libANGLE/renderer/d3d/d3d11/StateManager11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -namespace gl -{ -class FramebufferAttachment; -struct ImageIndex; -} - -namespace rx -{ -class Blit11; -class Buffer11; -class Clear11; -class Context11; -class IndexDataManager; -struct PackPixelsParams; -class PixelTransfer11; -class RenderTarget11; -class StreamingIndexBufferInterface; -class Trim11; -class VertexDataManager; - -struct Renderer11DeviceCaps -{ - Renderer11DeviceCaps(); - - D3D_FEATURE_LEVEL featureLevel; - bool supportsDXGI1_2; // Support for DXGI 1.2 - bool supportsClearView; // Support for ID3D11DeviceContext1::ClearView - bool supportsConstantBufferOffsets; // Support for Constant buffer offset - bool supportsVpRtIndexWriteFromVertexShader; // VP/RT can be selected in the Vertex Shader - // stage. - bool supportsMultisampledDepthStencilSRVs; // D3D feature level 10.0 no longer allows creation - // of textures with both the bind SRV and DSV flags - // when multisampled. Textures will need to be - // resolved before reading. crbug.com/656989 - UINT B5G6R5support; // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B5G6R5_UNORM - UINT B5G6R5maxSamples; // Maximum number of samples supported by DXGI_FORMAT_B5G6R5_UNORM - UINT B4G4R4A4support; // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B4G4R4A4_UNORM - UINT B4G4R4A4maxSamples; // Maximum number of samples supported by DXGI_FORMAT_B4G4R4A4_UNORM - UINT B5G5R5A1support; // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B5G5R5A1_UNORM - UINT B5G5R5A1maxSamples; // Maximum number of samples supported by DXGI_FORMAT_B5G5R5A1_UNORM - Optional<LARGE_INTEGER> driverVersion; // Four-part driver version number. -}; - -enum -{ - MAX_VERTEX_UNIFORM_VECTORS_D3D11 = 1024, - MAX_FRAGMENT_UNIFORM_VECTORS_D3D11 = 1024 -}; - -// Possible reasons RendererD3D initialize can fail -enum D3D11InitError -{ - // The renderer loaded successfully - D3D11_INIT_SUCCESS = 0, - // Failed to load the ANGLE & D3D compiler libraries - D3D11_INIT_COMPILER_ERROR, - // Failed to load a necessary DLL (non-compiler) - D3D11_INIT_MISSING_DEP, - // CreateDevice returned E_INVALIDARG - D3D11_INIT_CREATEDEVICE_INVALIDARG, - // CreateDevice failed with an error other than invalid arg - D3D11_INIT_CREATEDEVICE_ERROR, - // DXGI 1.2 required but not found - D3D11_INIT_INCOMPATIBLE_DXGI, - // Other initialization error - D3D11_INIT_OTHER_ERROR, - // CreateDevice returned E_FAIL - D3D11_INIT_CREATEDEVICE_FAIL, - // CreateDevice returned E_NOTIMPL - D3D11_INIT_CREATEDEVICE_NOTIMPL, - // CreateDevice returned E_OUTOFMEMORY - D3D11_INIT_CREATEDEVICE_OUTOFMEMORY, - // CreateDevice returned DXGI_ERROR_INVALID_CALL - D3D11_INIT_CREATEDEVICE_INVALIDCALL, - // CreateDevice returned DXGI_ERROR_SDK_COMPONENT_MISSING - D3D11_INIT_CREATEDEVICE_COMPONENTMISSING, - // CreateDevice returned DXGI_ERROR_WAS_STILL_DRAWING - D3D11_INIT_CREATEDEVICE_WASSTILLDRAWING, - // CreateDevice returned DXGI_ERROR_NOT_CURRENTLY_AVAILABLE - D3D11_INIT_CREATEDEVICE_NOTAVAILABLE, - // CreateDevice returned DXGI_ERROR_DEVICE_HUNG - D3D11_INIT_CREATEDEVICE_DEVICEHUNG, - // CreateDevice returned NULL - D3D11_INIT_CREATEDEVICE_NULL, - NUM_D3D11_INIT_ERRORS -}; - -class Renderer11 : public RendererD3D -{ - public: - explicit Renderer11(egl::Display *display); - ~Renderer11() override; - - egl::Error initialize() override; - bool resetDevice() override; - - egl::ConfigSet generateConfigs() override; - void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const override; - - ContextImpl *createContext(const gl::ContextState &state) override; - - gl::Error flush(); - gl::Error finish(); - - bool isValidNativeWindow(EGLNativeWindowType window) const override; - NativeWindowD3D *createNativeWindow(EGLNativeWindowType window, - const egl::Config *config, - const egl::AttributeMap &attribs) const override; - - SwapChainD3D *createSwapChain(NativeWindowD3D *nativeWindow, - HANDLE shareHandle, - IUnknown *d3dTexture, - GLenum backBufferFormat, - GLenum depthBufferFormat, - EGLint orientation, - EGLint samples) override; - egl::Error getD3DTextureInfo(const egl::Config *configuration, - IUnknown *d3dTexture, - EGLint *width, - EGLint *height, - GLenum *fboFormat) const override; - egl::Error validateShareHandle(const egl::Config *config, - HANDLE shareHandle, - const egl::AttributeMap &attribs) const override; - - bool applyPrimitiveType(const gl::State &glState, GLenum mode, GLsizei count); - - // lost device - bool testDeviceLost() override; - bool testDeviceResettable() override; - - std::string getRendererDescription() const; - DeviceIdentifier getAdapterIdentifier() const override; - - unsigned int getReservedVertexUniformVectors() const; - unsigned int getReservedFragmentUniformVectors() const; - unsigned int getReservedVertexUniformBuffers() const; - unsigned int getReservedFragmentUniformBuffers() const; - - bool getShareHandleSupport() const; - - bool getNV12TextureSupport() const; - - int getMajorShaderModel() const override; - int getMinorShaderModel() const override; - std::string getShaderModelSuffix() const override; - - // Pixel operations - gl::Error copyImage2D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) override; - gl::Error copyImageCube(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum target, - GLint level) override; - gl::Error copyImage3D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) override; - gl::Error copyImage2DArray(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) override; - - gl::Error copyTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum destTarget, - GLint destLevel, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) override; - gl::Error copyCompressedTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - TextureStorage *storage, - GLint destLevel) override; - - // RenderTarget creation - gl::Error createRenderTarget(int width, - int height, - GLenum format, - GLsizei samples, - RenderTargetD3D **outRT) override; - gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override; - - // Shader operations - gl::Error loadExecutable(const uint8_t *function, - size_t length, - gl::ShaderType type, - const std::vector<D3DVarying> &streamOutVaryings, - bool separatedOutputBuffers, - ShaderExecutableD3D **outExecutable) override; - gl::Error compileToExecutable(gl::InfoLog &infoLog, - const std::string &shaderHLSL, - gl::ShaderType type, - const std::vector<D3DVarying> &streamOutVaryings, - bool separatedOutputBuffers, - const angle::CompilerWorkaroundsD3D &workarounds, - ShaderExecutableD3D **outExectuable) override; - gl::Error ensureHLSLCompilerInitialized() override; - - UniformStorageD3D *createUniformStorage(size_t storageSize) override; - - // Image operations - ImageD3D *createImage() override; - gl::Error generateMipmap(const gl::Context *context, ImageD3D *dest, ImageD3D *source) override; - gl::Error generateMipmapUsingD3D(const gl::Context *context, - TextureStorage *storage, - const gl::TextureState &textureState) override; - gl::Error copyImage(const gl::Context *context, - ImageD3D *dest, - ImageD3D *source, - const gl::Rectangle &sourceRect, - const gl::Offset &destOffset, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) override; - TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain) override; - TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage, - RenderTargetD3D *renderTargetD3D) override; - TextureStorage *createTextureStorageExternal( - egl::Stream *stream, - const egl::Stream::GLTextureDescription &desc) override; - TextureStorage *createTextureStorage2D(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - int levels, - bool hintLevelZeroOnly) override; - TextureStorage *createTextureStorageCube(GLenum internalformat, - bool renderTarget, - int size, - int levels, - bool hintLevelZeroOnly) override; - TextureStorage *createTextureStorage3D(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - GLsizei depth, - int levels) override; - TextureStorage *createTextureStorage2DArray(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - GLsizei depth, - int levels) override; - TextureStorage *createTextureStorage2DMultisample(GLenum internalformat, - GLsizei width, - GLsizei height, - int levels, - int samples, - bool fixedSampleLocations) override; - - VertexBuffer *createVertexBuffer() override; - IndexBuffer *createIndexBuffer() override; - - // Stream Creation - StreamProducerImpl *createStreamProducerD3DTextureNV12( - egl::Stream::ConsumerType consumerType, - const egl::AttributeMap &attribs) override; - - // D3D11-renderer specific methods - ID3D11Device *getDevice() { return mDevice; } - void *getD3DDevice() override; - ID3D11DeviceContext *getDeviceContext() { return mDeviceContext; }; - ID3D11DeviceContext1 *getDeviceContext1IfSupported() { return mDeviceContext1; }; - IDXGIFactory *getDxgiFactory() { return mDxgiFactory; }; - - gl::Error getBlendState(const d3d11::BlendStateKey &key, - const d3d11::BlendState **outBlendState); - gl::Error getRasterizerState(const gl::RasterizerState &rasterState, - bool scissorEnabled, - ID3D11RasterizerState **outRasterizerState); - gl::Error getDepthStencilState(const gl::DepthStencilState &dsState, - const d3d11::DepthStencilState **outDSState); - gl::Error getSamplerState(const gl::SamplerState &samplerState, - ID3D11SamplerState **outSamplerState); - - Blit11 *getBlitter() { return mBlit; } - Clear11 *getClearer() { return mClear; } - gl::DebugAnnotator *getAnnotator(); - - // Buffer-to-texture and Texture-to-buffer copies - bool supportsFastCopyBufferToTexture(GLenum internalFormat) const override; - gl::Error fastCopyBufferToTexture(const gl::Context *context, - const gl::PixelUnpackState &unpack, - unsigned int offset, - RenderTargetD3D *destRenderTarget, - GLenum destinationFormat, - GLenum sourcePixelsType, - const gl::Box &destArea) override; - - gl::Error packPixels(const TextureHelper11 &textureHelper, - const PackPixelsParams ¶ms, - uint8_t *pixelsOut); - - bool getLUID(LUID *adapterLuid) const override; - VertexConversionType getVertexConversionType( - gl::VertexFormatType vertexFormatType) const override; - GLenum getVertexComponentType(gl::VertexFormatType vertexFormatType) const override; - - // Warning: you should ensure binding really matches attrib.bindingIndex before using this - // function. - gl::ErrorOrResult<unsigned int> getVertexSpaceRequired(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLsizei count, - GLsizei instances) const override; - - gl::Error readFromAttachment(const gl::Context *context, - const gl::FramebufferAttachment &srcAttachment, - const gl::Rectangle &sourceArea, - GLenum format, - GLenum type, - GLuint outputPitch, - const gl::PixelPackState &pack, - uint8_t *pixels); - - gl::Error blitRenderbufferRect(const gl::Context *context, - const gl::Rectangle &readRect, - const gl::Rectangle &drawRect, - RenderTargetD3D *readRenderTarget, - RenderTargetD3D *drawRenderTarget, - GLenum filter, - const gl::Rectangle *scissor, - bool colorBlit, - bool depthBlit, - bool stencilBlit); - - bool isES3Capable() const; - const Renderer11DeviceCaps &getRenderer11DeviceCaps() const { return mRenderer11DeviceCaps; }; - - RendererClass getRendererClass() const override; - StateManager11 *getStateManager() { return &mStateManager; } - - void onSwap(); - void onBufferCreate(const Buffer11 *created); - void onBufferDelete(const Buffer11 *deleted); - - egl::Error getEGLDevice(DeviceImpl **device) override; - - gl::Error drawArrays(const gl::Context *context, - GLenum mode, - GLint startVertex, - GLsizei count, - GLsizei instances); - - gl::Error drawElements(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices, - GLsizei instances); - - gl::Error drawArraysIndirect(const gl::Context *context, GLenum mode, const void *indirect); - gl::Error drawElementsIndirect(const gl::Context *context, - GLenum mode, - GLenum type, - const void *indirect); - - // Necessary hack for default framebuffers in D3D. - FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override; - - gl::Error getScratchMemoryBuffer(size_t requestedSize, angle::MemoryBuffer **bufferOut); - - gl::Version getMaxSupportedESVersion() const override; - - gl::Error dispatchCompute(const gl::Context *context, - GLuint numGroupsX, - GLuint numGroupsY, - GLuint numGroupsZ); - gl::Error applyComputeShader(const gl::Context *context); - - gl::ErrorOrResult<TextureHelper11> createStagingTexture(ResourceType textureType, - const d3d11::Format &formatSet, - const gl::Extents &size, - StagingAccess readAndWriteAccess); - - template <typename DescT, typename ResourceT> - gl::Error allocateResource(const DescT &desc, ResourceT *resourceOut) - { - return mResourceManager11.allocate(this, &desc, nullptr, resourceOut); - } - - template <typename DescT, typename InitDataT, typename ResourceT> - gl::Error allocateResource(const DescT &desc, InitDataT *initData, ResourceT *resourceOut) - { - return mResourceManager11.allocate(this, &desc, initData, resourceOut); - } - - template <typename InitDataT, typename ResourceT> - gl::Error allocateResourceNoDesc(InitDataT *initData, ResourceT *resourceOut) - { - return mResourceManager11.allocate(this, nullptr, initData, resourceOut); - } - - template <typename DescT> - gl::Error allocateTexture(const DescT &desc, - const d3d11::Format &format, - TextureHelper11 *textureOut) - { - return allocateTexture(desc, format, nullptr, textureOut); - } - - gl::Error allocateTexture(const D3D11_TEXTURE2D_DESC &desc, - const d3d11::Format &format, - const D3D11_SUBRESOURCE_DATA *initData, - TextureHelper11 *textureOut); - - gl::Error allocateTexture(const D3D11_TEXTURE3D_DESC &desc, - const d3d11::Format &format, - const D3D11_SUBRESOURCE_DATA *initData, - TextureHelper11 *textureOut); - - gl::Error clearRenderTarget(RenderTargetD3D *renderTarget, - const gl::ColorF &clearColorValue, - const float clearDepthValue, - const unsigned int clearStencilValue) override; - - bool canSelectViewInVertexShader() const override; - - private: - void generateCaps(gl::Caps *outCaps, - gl::TextureCapsMap *outTextureCaps, - gl::Extensions *outExtensions, - gl::Limitations *outLimitations) const override; - - angle::WorkaroundsD3D generateWorkarounds() const override; - - gl::Error drawLineLoop(const gl::Context *context, - GLsizei count, - GLenum type, - const void *indices, - int baseVertex, - int instances); - gl::Error drawTriangleFan(const gl::Context *context, - GLsizei count, - GLenum type, - const void *indices, - int baseVertex, - int instances); - - gl::ErrorOrResult<TextureHelper11> resolveMultisampledTexture(const gl::Context *context, - RenderTarget11 *renderTarget, - bool depth, - bool stencil); - - void populateRenderer11DeviceCaps(); - - void updateHistograms(); - - gl::Error copyImageInternal(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - RenderTargetD3D *destRenderTarget); - - gl::SupportedSampleSet generateSampleSetForEGLConfig( - const gl::TextureCaps &colorBufferFormatCaps, - const gl::TextureCaps &depthStencilBufferFormatCaps) const; - - HRESULT callD3D11CreateDevice(PFN_D3D11_CREATE_DEVICE createDevice, bool debug); - egl::Error initializeD3DDevice(); - egl::Error initializeDevice(); - void releaseDeviceResources(); - void release(); - - d3d11::ANGLED3D11DeviceType getDeviceType() const; - - gl::Error markTransformFeedbackUsage(const gl::Context *context); - - HMODULE mD3d11Module; - HMODULE mDxgiModule; - HMODULE mDCompModule; - std::vector<D3D_FEATURE_LEVEL> mAvailableFeatureLevels; - D3D_DRIVER_TYPE mRequestedDriverType; - bool mCreateDebugDevice; - bool mCreatedWithDeviceEXT; - DeviceD3D *mEGLDevice; - - HLSLCompiler mCompiler; - - RenderStateCache mStateCache; - - StateManager11 mStateManager; - - StreamingIndexBufferInterface *mLineLoopIB; - StreamingIndexBufferInterface *mTriangleFanIB; - - // Texture copy resources - Blit11 *mBlit; - PixelTransfer11 *mPixelTransfer; - - // Masked clear resources - Clear11 *mClear; - - // Perform trim for D3D resources - Trim11 *mTrim; - - // Sync query - d3d11::Query mSyncQuery; - - // Created objects state tracking - std::set<const Buffer11 *> mAliveBuffers; - - double mLastHistogramUpdateTime; - - ID3D11Device *mDevice; - Renderer11DeviceCaps mRenderer11DeviceCaps; - ID3D11DeviceContext *mDeviceContext; - ID3D11DeviceContext1 *mDeviceContext1; - ID3D11DeviceContext3 *mDeviceContext3; - IDXGIAdapter *mDxgiAdapter; - DXGI_ADAPTER_DESC mAdapterDescription; - char mDescription[128]; - IDXGIFactory *mDxgiFactory; - ID3D11Debug *mDebug; - - std::vector<GLuint> mScratchIndexDataBuffer; - - angle::ScratchBuffer mScratchMemoryBuffer; - - gl::DebugAnnotator *mAnnotator; - - mutable Optional<bool> mSupportsShareHandles; - ResourceManager11 mResourceManager11; - - TextureHelper11 mCachedResolveTexture; -}; - -} // namespace rx -#endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp deleted file mode 100644 index c228380a34..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp +++ /dev/null @@ -1,533 +0,0 @@ -// -// Copyright 2017 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. -// -// ResourceManager11: -// Centralized point of allocation for all D3D11 Resources. - -#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" - -#include "common/debug.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" - -namespace rx -{ - -namespace -{ - -constexpr uint8_t kDebugInitTextureDataValue = 0x48; -constexpr FLOAT kDebugColorInitClearValue[4] = {0.3f, 0.5f, 0.7f, 0.5f}; -constexpr FLOAT kDebugDepthInitValue = 0.2f; -constexpr UINT8 kDebugStencilInitValue = 3; - -uint64_t ComputeMippedMemoryUsage(unsigned int width, - unsigned int height, - unsigned int depth, - uint64_t pixelSize, - unsigned int mipLevels) -{ - uint64_t sizeSum = 0; - - for (unsigned int level = 0; level < mipLevels; ++level) - { - unsigned int mipWidth = std::max(width >> level, 1u); - unsigned int mipHeight = std::max(height >> level, 1u); - unsigned int mipDepth = std::max(depth >> level, 1u); - sizeSum += static_cast<uint64_t>(mipWidth * mipHeight * mipDepth) * pixelSize; - } - - return sizeSum; -} - -uint64_t ComputeMemoryUsage(const D3D11_TEXTURE2D_DESC *desc) -{ - ASSERT(desc); - uint64_t pixelBytes = - static_cast<uint64_t>(d3d11::GetDXGIFormatSizeInfo(desc->Format).pixelBytes); - return ComputeMippedMemoryUsage(desc->Width, desc->Height, 1, pixelBytes, desc->MipLevels); -} - -uint64_t ComputeMemoryUsage(const D3D11_TEXTURE3D_DESC *desc) -{ - ASSERT(desc); - uint64_t pixelBytes = - static_cast<uint64_t>(d3d11::GetDXGIFormatSizeInfo(desc->Format).pixelBytes); - return ComputeMippedMemoryUsage(desc->Width, desc->Height, desc->Depth, pixelBytes, - desc->MipLevels); -} - -uint64_t ComputeMemoryUsage(const D3D11_BUFFER_DESC *desc) -{ - ASSERT(desc); - return static_cast<uint64_t>(desc->ByteWidth); -} - -template <typename T> -uint64_t ComputeMemoryUsage(const T *desc) -{ - return 0; -} - -template <ResourceType ResourceT> -uint64_t ComputeGenericMemoryUsage(ID3D11DeviceChild *genericResource) -{ - auto *typedResource = static_cast<GetD3D11Type<ResourceT> *>(genericResource); - GetDescType<ResourceT> desc; - typedResource->GetDesc(&desc); - return ComputeMemoryUsage(&desc); -} - -uint64_t ComputeGenericMemoryUsage(ResourceType resourceType, ID3D11DeviceChild *resource) -{ - switch (resourceType) - { - case ResourceType::Texture2D: - return ComputeGenericMemoryUsage<ResourceType::Texture2D>(resource); - case ResourceType::Texture3D: - return ComputeGenericMemoryUsage<ResourceType::Texture3D>(resource); - case ResourceType::Buffer: - return ComputeGenericMemoryUsage<ResourceType::Buffer>(resource); - - default: - return 0; - } -} - -HRESULT CreateResource(ID3D11Device *device, - const D3D11_BLEND_DESC *desc, - void * /*initData*/, - ID3D11BlendState **blendState) -{ - return device->CreateBlendState(desc, blendState); -} - -HRESULT CreateResource(ID3D11Device *device, - const D3D11_BUFFER_DESC *desc, - const D3D11_SUBRESOURCE_DATA *initData, - ID3D11Buffer **buffer) -{ - return device->CreateBuffer(desc, initData, buffer); -} - -HRESULT CreateResource(ID3D11Device *device, - const ShaderData *desc, - void * /*initData*/, - ID3D11ComputeShader **resourceOut) -{ - return device->CreateComputeShader(desc->get(), desc->size(), nullptr, resourceOut); -} - -HRESULT CreateResource(ID3D11Device *device, - const D3D11_DEPTH_STENCIL_DESC *desc, - void * /*initData*/, - ID3D11DepthStencilState **resourceOut) -{ - return device->CreateDepthStencilState(desc, resourceOut); -} - -HRESULT CreateResource(ID3D11Device *device, - const D3D11_DEPTH_STENCIL_VIEW_DESC *desc, - ID3D11Resource *resource, - ID3D11DepthStencilView **resourceOut) -{ - return device->CreateDepthStencilView(resource, desc, resourceOut); -} - -HRESULT CreateResource(ID3D11Device *device, - const ShaderData *desc, - const std::vector<D3D11_SO_DECLARATION_ENTRY> *initData, - ID3D11GeometryShader **resourceOut) -{ - if (initData) - { - return device->CreateGeometryShaderWithStreamOutput( - desc->get(), desc->size(), initData->data(), static_cast<UINT>(initData->size()), - nullptr, 0, 0, nullptr, resourceOut); - } - else - { - return device->CreateGeometryShader(desc->get(), desc->size(), nullptr, resourceOut); - } -} - -HRESULT CreateResource(ID3D11Device *device, - const InputElementArray *desc, - const ShaderData *initData, - ID3D11InputLayout **resourceOut) -{ - return device->CreateInputLayout(desc->get(), static_cast<UINT>(desc->size()), initData->get(), - initData->size(), resourceOut); -} - -HRESULT CreateResource(ID3D11Device *device, - const ShaderData *desc, - void * /*initData*/, - ID3D11PixelShader **resourceOut) -{ - return device->CreatePixelShader(desc->get(), desc->size(), nullptr, resourceOut); -} - -HRESULT CreateResource(ID3D11Device *device, - const D3D11_QUERY_DESC *desc, - void * /*initData*/, - ID3D11Query **resourceOut) -{ - return device->CreateQuery(desc, resourceOut); -} - -HRESULT CreateResource(ID3D11Device *device, - const D3D11_RASTERIZER_DESC *desc, - void * /*initData*/, - ID3D11RasterizerState **rasterizerState) -{ - return device->CreateRasterizerState(desc, rasterizerState); -} - -HRESULT CreateResource(ID3D11Device *device, - const D3D11_RENDER_TARGET_VIEW_DESC *desc, - ID3D11Resource *resource, - ID3D11RenderTargetView **renderTargetView) -{ - return device->CreateRenderTargetView(resource, desc, renderTargetView); -} - -HRESULT CreateResource(ID3D11Device *device, - const D3D11_SAMPLER_DESC *desc, - void * /*initData*/, - ID3D11SamplerState **resourceOut) -{ - return device->CreateSamplerState(desc, resourceOut); -} - -HRESULT CreateResource(ID3D11Device *device, - const D3D11_SHADER_RESOURCE_VIEW_DESC *desc, - ID3D11Resource *resource, - ID3D11ShaderResourceView **resourceOut) -{ - return device->CreateShaderResourceView(resource, desc, resourceOut); -} - -HRESULT CreateResource(ID3D11Device *device, - const D3D11_TEXTURE2D_DESC *desc, - const D3D11_SUBRESOURCE_DATA *initData, - ID3D11Texture2D **texture) -{ - return device->CreateTexture2D(desc, initData, texture); -} - -HRESULT CreateResource(ID3D11Device *device, - const D3D11_TEXTURE3D_DESC *desc, - const D3D11_SUBRESOURCE_DATA *initData, - ID3D11Texture3D **texture) -{ - return device->CreateTexture3D(desc, initData, texture); -} - -HRESULT CreateResource(ID3D11Device *device, - const ShaderData *desc, - void * /*initData*/, - ID3D11VertexShader **resourceOut) -{ - return device->CreateVertexShader(desc->get(), desc->size(), nullptr, resourceOut); -} - -DXGI_FORMAT GetTypedDepthStencilFormat(DXGI_FORMAT dxgiFormat) -{ - switch (dxgiFormat) - { - case DXGI_FORMAT_R16_TYPELESS: - return DXGI_FORMAT_D16_UNORM; - case DXGI_FORMAT_R24G8_TYPELESS: - return DXGI_FORMAT_D24_UNORM_S8_UINT; - case DXGI_FORMAT_R32_TYPELESS: - return DXGI_FORMAT_D32_FLOAT; - case DXGI_FORMAT_R32G8X24_TYPELESS: - return DXGI_FORMAT_D32_FLOAT_S8X24_UINT; - default: - return dxgiFormat; - } -} - -template <typename DescT, typename ResourceT> -gl::Error ClearResource(Renderer11 *renderer, const DescT *desc, ResourceT *texture) -{ - // No-op. - return gl::NoError(); -} - -template <> -gl::Error ClearResource(Renderer11 *renderer, - const D3D11_TEXTURE2D_DESC *desc, - ID3D11Texture2D *texture) -{ - ID3D11DeviceContext *context = renderer->getDeviceContext(); - - if ((desc->BindFlags & D3D11_BIND_DEPTH_STENCIL) != 0) - { - D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; - dsvDesc.Flags = 0; - dsvDesc.Format = GetTypedDepthStencilFormat(desc->Format); - - const auto &format = d3d11_angle::GetFormat(dsvDesc.Format); - UINT clearFlags = (format.depthBits > 0 ? D3D11_CLEAR_DEPTH : 0) | - (format.stencilBits > 0 ? D3D11_CLEAR_STENCIL : 0); - - // Must process each mip level individually. - for (UINT mipLevel = 0; mipLevel < desc->MipLevels; ++mipLevel) - { - if (desc->SampleDesc.Count == 0) - { - dsvDesc.Texture2D.MipSlice = mipLevel; - dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; - } - else - { - dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS; - } - - d3d11::DepthStencilView dsv; - ANGLE_TRY(renderer->allocateResource(dsvDesc, texture, &dsv)); - - context->ClearDepthStencilView(dsv.get(), clearFlags, kDebugDepthInitValue, - kDebugStencilInitValue); - } - } - else - { - ASSERT((desc->BindFlags & D3D11_BIND_RENDER_TARGET) != 0); - d3d11::RenderTargetView rtv; - ANGLE_TRY(renderer->allocateResourceNoDesc(texture, &rtv)); - - context->ClearRenderTargetView(rtv.get(), kDebugColorInitClearValue); - } - - return gl::NoError(); -} - -template <> -gl::Error ClearResource(Renderer11 *renderer, - const D3D11_TEXTURE3D_DESC *desc, - ID3D11Texture3D *texture) -{ - ID3D11DeviceContext *context = renderer->getDeviceContext(); - - ASSERT((desc->BindFlags & D3D11_BIND_DEPTH_STENCIL) == 0); - ASSERT((desc->BindFlags & D3D11_BIND_RENDER_TARGET) != 0); - - d3d11::RenderTargetView rtv; - ANGLE_TRY(renderer->allocateResourceNoDesc(texture, &rtv)); - - context->ClearRenderTargetView(rtv.get(), kDebugColorInitClearValue); - return gl::NoError(); -} - -#define ANGLE_RESOURCE_STRINGIFY_OP(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) #RESTYPE, - -constexpr std::array<const char *, NumResourceTypes> kResourceTypeNames = { - {ANGLE_RESOURCE_TYPE_OP(Stringify, ANGLE_RESOURCE_STRINGIFY_OP)}}; -static_assert(kResourceTypeNames[NumResourceTypes - 1] != nullptr, - "All members must be initialized."); - -} // anonymous namespace - -// ResourceManager11 Implementation. -ResourceManager11::ResourceManager11() - : mInitializeAllocations(false), - mAllocatedResourceCounts({{}}), - mAllocatedResourceDeviceMemory({{}}) -{ -} - -ResourceManager11::~ResourceManager11() -{ - for (size_t count : mAllocatedResourceCounts) - { - ASSERT(count == 0); - } - - for (uint64_t memorySize : mAllocatedResourceDeviceMemory) - { - ASSERT(memorySize == 0); - } -} - -template <typename T> -gl::Error ResourceManager11::allocate(Renderer11 *renderer, - const GetDescFromD3D11<T> *desc, - GetInitDataFromD3D11<T> *initData, - Resource11<T> *resourceOut) -{ - ID3D11Device *device = renderer->getDevice(); - T *resource = nullptr; - - GetInitDataFromD3D11<T> *shadowInitData = initData; - if (!shadowInitData && mInitializeAllocations) - { - shadowInitData = createInitDataIfNeeded<T>(desc); - } - - HRESULT hr = CreateResource(device, desc, shadowInitData, &resource); - if (FAILED(hr)) - { - ASSERT(!resource); - if (d3d11::isDeviceLostError(hr)) - { - renderer->notifyDeviceLost(); - } - return gl::OutOfMemory() << "Error allocating " - << std::string(kResourceTypeNames[ResourceTypeIndex<T>()]) << ". " - << gl::FmtHR(hr); - } - - if (!shadowInitData && mInitializeAllocations) - { - ANGLE_TRY(ClearResource(renderer, desc, resource)); - } - - ASSERT(resource); - incrResource(GetResourceTypeFromD3D11<T>(), ComputeMemoryUsage(desc)); - *resourceOut = std::move(Resource11<T>(resource, this)); - return gl::NoError(); -} - -void ResourceManager11::incrResource(ResourceType resourceType, uint64_t memorySize) -{ - size_t typeIndex = ResourceTypeIndex(resourceType); - - mAllocatedResourceCounts[typeIndex]++; - mAllocatedResourceDeviceMemory[typeIndex] += memorySize; - - // This checks for integer overflow. - ASSERT(mAllocatedResourceCounts[typeIndex] > 0); - ASSERT(mAllocatedResourceDeviceMemory[typeIndex] >= memorySize); -} - -void ResourceManager11::decrResource(ResourceType resourceType, uint64_t memorySize) -{ - size_t typeIndex = ResourceTypeIndex(resourceType); - - ASSERT(mAllocatedResourceCounts[typeIndex] > 0); - mAllocatedResourceCounts[typeIndex]--; - ASSERT(mAllocatedResourceDeviceMemory[typeIndex] >= memorySize); - mAllocatedResourceDeviceMemory[typeIndex] -= memorySize; -} - -void ResourceManager11::onReleaseGeneric(ResourceType resourceType, ID3D11DeviceChild *resource) -{ - ASSERT(resource); - decrResource(resourceType, ComputeGenericMemoryUsage(resourceType, resource)); -} - -template <> -const D3D11_SUBRESOURCE_DATA *ResourceManager11::createInitDataIfNeeded<ID3D11Texture2D>( - const D3D11_TEXTURE2D_DESC *desc) -{ - ASSERT(desc); - - if ((desc->BindFlags & (D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_RENDER_TARGET)) != 0) - { - // This will be done using ClearView methods. - return nullptr; - } - - size_t requiredSize = static_cast<size_t>(ComputeMemoryUsage(desc)); - if (mZeroMemory.size() < requiredSize) - { - mZeroMemory.resize(requiredSize); - mZeroMemory.fill(kDebugInitTextureDataValue); - } - - const auto &formatSizeInfo = d3d11::GetDXGIFormatSizeInfo(desc->Format); - - UINT subresourceCount = desc->MipLevels * desc->ArraySize; - if (mShadowInitData.size() < subresourceCount) - { - mShadowInitData.resize(subresourceCount); - } - - for (UINT mipLevel = 0; mipLevel < desc->MipLevels; ++mipLevel) - { - for (UINT arrayIndex = 0; arrayIndex < desc->ArraySize; ++arrayIndex) - { - UINT subresourceIndex = D3D11CalcSubresource(mipLevel, arrayIndex, desc->MipLevels); - D3D11_SUBRESOURCE_DATA *data = &mShadowInitData[subresourceIndex]; - - UINT levelWidth = std::max(desc->Width >> mipLevel, 1u); - UINT levelHeight = std::max(desc->Height >> mipLevel, 1u); - - data->SysMemPitch = levelWidth * formatSizeInfo.pixelBytes; - data->SysMemSlicePitch = data->SysMemPitch * levelHeight; - data->pSysMem = mZeroMemory.data(); - } - } - - return mShadowInitData.data(); -} - -template <> -const D3D11_SUBRESOURCE_DATA *ResourceManager11::createInitDataIfNeeded<ID3D11Texture3D>( - const D3D11_TEXTURE3D_DESC *desc) -{ - ASSERT(desc); - - if ((desc->BindFlags & D3D11_BIND_RENDER_TARGET) != 0) - { - // This will be done using ClearView methods. - return nullptr; - } - - size_t requiredSize = static_cast<size_t>(ComputeMemoryUsage(desc)); - if (mZeroMemory.size() < requiredSize) - { - mZeroMemory.resize(requiredSize); - mZeroMemory.fill(kDebugInitTextureDataValue); - } - - const auto &formatSizeInfo = d3d11::GetDXGIFormatSizeInfo(desc->Format); - - UINT subresourceCount = desc->MipLevels; - if (mShadowInitData.size() < subresourceCount) - { - mShadowInitData.resize(subresourceCount); - } - - for (UINT mipLevel = 0; mipLevel < desc->MipLevels; ++mipLevel) - { - UINT subresourceIndex = D3D11CalcSubresource(mipLevel, 0, desc->MipLevels); - D3D11_SUBRESOURCE_DATA *data = &mShadowInitData[subresourceIndex]; - - UINT levelWidth = std::max(desc->Width >> mipLevel, 1u); - UINT levelHeight = std::max(desc->Height >> mipLevel, 1u); - - data->SysMemPitch = levelWidth * formatSizeInfo.pixelBytes; - data->SysMemSlicePitch = data->SysMemPitch * levelHeight; - data->pSysMem = mZeroMemory.data(); - } - - return mShadowInitData.data(); -} - -template <typename T> -GetInitDataFromD3D11<T> *ResourceManager11::createInitDataIfNeeded(const GetDescFromD3D11<T> *desc) -{ - // No-op. - return nullptr; -} - -void ResourceManager11::setAllocationsInitialized(bool initialize) -{ - mInitializeAllocations = initialize; -} - -#define ANGLE_INSTANTIATE_OP(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \ - \ -template \ -gl::Error \ - ResourceManager11::allocate(Renderer11 *, const DESCTYPE *, INITDATATYPE *, \ - Resource11<D3D11TYPE> *); - -ANGLE_RESOURCE_TYPE_OP(Instantitate, ANGLE_INSTANTIATE_OP) -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h deleted file mode 100644 index 0bdde9f8b6..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h +++ /dev/null @@ -1,366 +0,0 @@ -// -// Copyright 2017 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. -// -// ResourceManager11: -// Centralized point of allocation for all D3D11 Resources. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_RESOURCEFACTORY11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_RESOURCEFACTORY11_H_ - -#include <array> -#include <memory> - -#include "common/MemoryBuffer.h" -#include "common/angleutils.h" -#include "common/debug.h" -#include "libANGLE/Error.h" -#include "libANGLE/renderer/renderer_utils.h" - -namespace rx -{ -// These two methods are declared here to prevent circular includes. -namespace d3d11 -{ -HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name); - -template <typename T> -HRESULT SetDebugName(angle::ComPtr<T> &resource, const char *name) -{ - return SetDebugName(resource.Get(), name); -} -} // namespace d3d11 - -class Renderer11; -class ResourceManager11; -template <typename T> -class SharedResource11; -class TextureHelper11; - -using InputElementArray = WrappedArray<D3D11_INPUT_ELEMENT_DESC>; -using ShaderData = WrappedArray<uint8_t>; - -// Format: ResourceType, D3D11 type, DESC type, init data type. -#define ANGLE_RESOURCE_TYPE_OP(NAME, OP) \ - OP(NAME, BlendState, ID3D11BlendState, D3D11_BLEND_DESC, void) \ - OP(NAME, Buffer, ID3D11Buffer, D3D11_BUFFER_DESC, const D3D11_SUBRESOURCE_DATA) \ - OP(NAME, ComputeShader, ID3D11ComputeShader, ShaderData, void) \ - OP(NAME, DepthStencilState, ID3D11DepthStencilState, D3D11_DEPTH_STENCIL_DESC, void) \ - OP(NAME, DepthStencilView, ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, \ - ID3D11Resource) \ - OP(NAME, GeometryShader, ID3D11GeometryShader, ShaderData, \ - const std::vector<D3D11_SO_DECLARATION_ENTRY>) \ - OP(NAME, InputLayout, ID3D11InputLayout, InputElementArray, const ShaderData) \ - OP(NAME, PixelShader, ID3D11PixelShader, ShaderData, void) \ - OP(NAME, Query, ID3D11Query, D3D11_QUERY_DESC, void) \ - OP(NAME, RasterizerState, ID3D11RasterizerState, D3D11_RASTERIZER_DESC, void) \ - OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \ - ID3D11Resource) \ - OP(NAME, SamplerState, ID3D11SamplerState, D3D11_SAMPLER_DESC, void) \ - OP(NAME, ShaderResourceView, ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC, \ - ID3D11Resource) \ - OP(NAME, Texture2D, ID3D11Texture2D, D3D11_TEXTURE2D_DESC, const D3D11_SUBRESOURCE_DATA) \ - OP(NAME, Texture3D, ID3D11Texture3D, D3D11_TEXTURE3D_DESC, const D3D11_SUBRESOURCE_DATA) \ - OP(NAME, VertexShader, ID3D11VertexShader, ShaderData, void) - -#define ANGLE_RESOURCE_TYPE_LIST(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) RESTYPE, - -enum class ResourceType -{ - ANGLE_RESOURCE_TYPE_OP(List, ANGLE_RESOURCE_TYPE_LIST) Last -}; - -#undef ANGLE_RESOURCE_TYPE_LIST - -constexpr size_t ResourceTypeIndex(ResourceType resourceType) -{ - return static_cast<size_t>(resourceType); -} - -constexpr size_t NumResourceTypes = ResourceTypeIndex(ResourceType::Last); - -#define ANGLE_RESOURCE_TYPE_TO_D3D11(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \ - \ -template<> struct NAME<ResourceType::RESTYPE> \ - { \ - using Value = D3D11TYPE; \ - }; - -#define ANGLE_RESOURCE_TYPE_TO_DESC(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \ - \ -template<> struct NAME<ResourceType::RESTYPE> \ - { \ - using Value = DESCTYPE; \ - }; - -#define ANGLE_RESOURCE_TYPE_TO_INIT_DATA(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \ - \ -template<> struct NAME<ResourceType::RESTYPE> \ - { \ - using Value = INITDATATYPE; \ - }; - -#define ANGLE_RESOURCE_TYPE_TO_TYPE(NAME, OP) \ - template <ResourceType Param> \ - struct NAME; \ - ANGLE_RESOURCE_TYPE_OP(NAME, OP) \ - \ -template<ResourceType Param> struct NAME \ - { \ - }; \ - \ -template<ResourceType Param> using Get##NAME = typename NAME<Param>::Value; - -ANGLE_RESOURCE_TYPE_TO_TYPE(D3D11Type, ANGLE_RESOURCE_TYPE_TO_D3D11) -ANGLE_RESOURCE_TYPE_TO_TYPE(DescType, ANGLE_RESOURCE_TYPE_TO_DESC) -ANGLE_RESOURCE_TYPE_TO_TYPE(InitDataType, ANGLE_RESOURCE_TYPE_TO_INIT_DATA) - -#undef ANGLE_RESOURCE_TYPE_TO_D3D11 -#undef ANGLE_RESOURCE_TYPE_TO_DESC -#undef ANGLE_RESOURCE_TYPE_TO_INIT_DATA -#undef ANGLE_RESOURCE_TYPE_TO_TYPE - -#define ANGLE_TYPE_TO_RESOURCE_TYPE(NAME, OP) \ - template <typename Param> \ - struct NAME; \ - ANGLE_RESOURCE_TYPE_OP(NAME, OP) \ - \ -template<typename Param> struct NAME \ - { \ - }; \ - \ -template<typename Param> constexpr ResourceType Get##NAME() \ - { \ - return NAME<Param>::Value; \ - } - -#define ANGLE_D3D11_TO_RESOURCE_TYPE(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \ - \ -template<> struct NAME<D3D11TYPE> \ - { \ - static constexpr ResourceType Value = ResourceType::RESTYPE; \ - }; - -ANGLE_TYPE_TO_RESOURCE_TYPE(ResourceTypeFromD3D11, ANGLE_D3D11_TO_RESOURCE_TYPE) - -#undef ANGLE_D3D11_TO_RESOURCE_TYPE -#undef ANGLE_TYPE_TO_RESOURCE_TYPE - -template <typename T> -using GetDescFromD3D11 = GetDescType<ResourceTypeFromD3D11<T>::Value>; - -template <typename T> -using GetInitDataFromD3D11 = GetInitDataType<ResourceTypeFromD3D11<T>::Value>; - -template <typename T> -constexpr size_t ResourceTypeIndex() -{ - return static_cast<size_t>(GetResourceTypeFromD3D11<T>()); -} - -template <typename T> -struct TypedData -{ - TypedData() {} - ~TypedData(); - - T *object = nullptr; - ResourceManager11 *manager = nullptr; -}; - -// Smart pointer type. Wraps the resource and a factory for safe deletion. -template <typename T, template <class> class Pointer, typename DataT> -class Resource11Base : angle::NonCopyable -{ - public: - T *get() const { return mData->object; } - T *const *getPointer() const { return &mData->object; } - - void setDebugName(const char *name) { d3d11::SetDebugName(mData->object, name); } - - void set(T *object) - { - ASSERT(!valid()); - mData->object = object; - } - - bool valid() const { return (mData->object != nullptr); } - - void reset() - { - if (valid()) - mData.reset(new DataT()); - } - - ResourceSerial getSerial() const - { - return ResourceSerial(reinterpret_cast<uintptr_t>(mData->object)); - } - - protected: - friend class TextureHelper11; - - Resource11Base() : mData(new DataT()) {} - - Resource11Base(Resource11Base &&movedObj) : mData(new DataT()) - { - std::swap(mData, movedObj.mData); - } - - virtual ~Resource11Base() { mData.reset(); } - - Resource11Base &operator=(Resource11Base &&movedObj) - { - std::swap(mData, movedObj.mData); - return *this; - } - - Pointer<DataT> mData; -}; - -template <typename T> -using UniquePtr = typename std::unique_ptr<T, std::default_delete<T>>; - -template <typename ResourceT> -class Resource11 : public Resource11Base<ResourceT, UniquePtr, TypedData<ResourceT>> -{ - public: - Resource11() {} - Resource11(Resource11 &&other) - : Resource11Base<ResourceT, UniquePtr, TypedData<ResourceT>>(std::move(other)) - { - } - Resource11 &operator=(Resource11 &&other) - { - std::swap(this->mData, other.mData); - return *this; - } - - private: - template <typename T> - friend class SharedResource11; - friend class ResourceManager11; - - Resource11(ResourceT *object, ResourceManager11 *manager) - { - this->mData->object = object; - this->mData->manager = manager; - } -}; - -template <typename T> -class SharedResource11 : public Resource11Base<T, std::shared_ptr, TypedData<T>> -{ - public: - SharedResource11() {} - SharedResource11(SharedResource11 &&movedObj) - : Resource11Base<T, std::shared_ptr, TypedData<T>>(std::move(movedObj)) - { - } - - SharedResource11 &operator=(SharedResource11 &&other) - { - std::swap(this->mData, other.mData); - return *this; - } - - SharedResource11 makeCopy() const - { - SharedResource11 copy; - copy.mData = this->mData; - return std::move(copy); - } - - private: - friend class ResourceManager11; - SharedResource11(Resource11<T> &&obj) : Resource11Base<T, std::shared_ptr, TypedData<T>>() - { - std::swap(this->mData->manager, obj.mData->manager); - - // Can't use std::swap because of ID3D11Resource. - auto temp = this->mData->object; - this->mData->object = obj.mData->object; - obj.mData->object = static_cast<T *>(temp); - } -}; - -class ResourceManager11 final : angle::NonCopyable -{ - public: - ResourceManager11(); - ~ResourceManager11(); - - template <typename T> - gl::Error allocate(Renderer11 *renderer, - const GetDescFromD3D11<T> *desc, - GetInitDataFromD3D11<T> *initData, - Resource11<T> *resourceOut); - - template <typename T> - gl::Error allocate(Renderer11 *renderer, - const GetDescFromD3D11<T> *desc, - GetInitDataFromD3D11<T> *initData, - SharedResource11<T> *sharedRes) - { - Resource11<T> res; - ANGLE_TRY(allocate(renderer, desc, initData, &res)); - *sharedRes = std::move(res); - return gl::NoError(); - } - - template <typename T> - void onRelease(T *resource) - { - onReleaseGeneric(GetResourceTypeFromD3D11<T>(), resource); - } - - void onReleaseGeneric(ResourceType resourceType, ID3D11DeviceChild *resource); - - void setAllocationsInitialized(bool initialize); - - private: - void incrResource(ResourceType resourceType, uint64_t memorySize); - void decrResource(ResourceType resourceType, uint64_t memorySize); - - template <typename T> - GetInitDataFromD3D11<T> *createInitDataIfNeeded(const GetDescFromD3D11<T> *desc); - - bool mInitializeAllocations; - - std::array<size_t, NumResourceTypes> mAllocatedResourceCounts; - std::array<uint64_t, NumResourceTypes> mAllocatedResourceDeviceMemory; - angle::MemoryBuffer mZeroMemory; - - std::vector<D3D11_SUBRESOURCE_DATA> mShadowInitData; -}; - -template <typename ResourceT> -TypedData<ResourceT>::~TypedData() -{ - if (object) - { - // We can have a nullptr factory when holding passed-in resources. - if (manager) - { - manager->onRelease(object); - } - object->Release(); - } -} - -#define ANGLE_RESOURCE_TYPE_CLASS(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \ - using RESTYPE = Resource11<D3D11TYPE>; - -namespace d3d11 -{ -ANGLE_RESOURCE_TYPE_OP(ClassList, ANGLE_RESOURCE_TYPE_CLASS) - -using SharedSRV = SharedResource11<ID3D11ShaderResourceView>; -} // namespace d3d11 - -#undef ANGLE_RESOURCE_TYPE_CLASS - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_RESOURCEFACTORY11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp deleted file mode 100644 index 73a530add0..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// ShaderExecutable11.cpp: Implements a D3D11-specific class to contain shader -// executable implementation details. - -#include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" - -namespace rx -{ - -ShaderExecutable11::ShaderExecutable11(const void *function, - size_t length, - d3d11::PixelShader &&executable) - : ShaderExecutableD3D(function, length), - mPixelExecutable(std::move(executable)), - mVertexExecutable(), - mGeometryExecutable(), - mStreamOutExecutable(), - mComputeExecutable() -{ -} - -ShaderExecutable11::ShaderExecutable11(const void *function, - size_t length, - d3d11::VertexShader &&executable, - d3d11::GeometryShader &&streamOut) - : ShaderExecutableD3D(function, length), - mPixelExecutable(), - mVertexExecutable(std::move(executable)), - mGeometryExecutable(), - mStreamOutExecutable(std::move(streamOut)), - mComputeExecutable() -{ -} - -ShaderExecutable11::ShaderExecutable11(const void *function, - size_t length, - d3d11::GeometryShader &&executable) - : ShaderExecutableD3D(function, length), - mPixelExecutable(), - mVertexExecutable(), - mGeometryExecutable(std::move(executable)), - mStreamOutExecutable(), - mComputeExecutable() -{ -} - -ShaderExecutable11::ShaderExecutable11(const void *function, - size_t length, - d3d11::ComputeShader &&executable) - : ShaderExecutableD3D(function, length), - mPixelExecutable(), - mVertexExecutable(), - mGeometryExecutable(), - mStreamOutExecutable(), - mComputeExecutable(std::move(executable)) -{ -} - -ShaderExecutable11::~ShaderExecutable11() -{ -} - -const d3d11::VertexShader &ShaderExecutable11::getVertexShader() const -{ - return mVertexExecutable; -} - -const d3d11::PixelShader &ShaderExecutable11::getPixelShader() const -{ - return mPixelExecutable; -} - -const d3d11::GeometryShader &ShaderExecutable11::getGeometryShader() const -{ - return mGeometryExecutable; -} - -const d3d11::GeometryShader &ShaderExecutable11::getStreamOutShader() const -{ - return mStreamOutExecutable; -} - -const d3d11::ComputeShader &ShaderExecutable11::getComputeShader() const -{ - return mComputeExecutable; -} - -UniformStorage11::UniformStorage11(size_t initialSize) - : UniformStorageD3D(initialSize), mConstantBuffer() -{ -} - -UniformStorage11::~UniformStorage11() -{ -} - -gl::Error UniformStorage11::getConstantBuffer(Renderer11 *renderer, const d3d11::Buffer **bufferOut) -{ - if (size() > 0 && !mConstantBuffer.valid()) - { - D3D11_BUFFER_DESC desc = {0}; - desc.ByteWidth = static_cast<unsigned int>(size()); - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - - ANGLE_TRY(renderer->allocateResource(desc, &mConstantBuffer)); - } - - *bufferOut = &mConstantBuffer; - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h deleted file mode 100644 index 3f417578a3..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// ShaderExecutable11.h: Defines a D3D11-specific class to contain shader -// executable implementation details. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_SHADEREXECUTABLE11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_SHADEREXECUTABLE11_H_ - -#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h" -#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" - -namespace rx -{ -class Renderer11; -class UniformStorage11; - -class ShaderExecutable11 : public ShaderExecutableD3D -{ - public: - ShaderExecutable11(const void *function, size_t length, d3d11::PixelShader &&executable); - ShaderExecutable11(const void *function, - size_t length, - d3d11::VertexShader &&executable, - d3d11::GeometryShader &&streamOut); - ShaderExecutable11(const void *function, size_t length, d3d11::GeometryShader &&executable); - ShaderExecutable11(const void *function, size_t length, d3d11::ComputeShader &&executable); - - ~ShaderExecutable11() override; - - const d3d11::PixelShader &getPixelShader() const; - const d3d11::VertexShader &getVertexShader() const; - const d3d11::GeometryShader &getGeometryShader() const; - const d3d11::GeometryShader &getStreamOutShader() const; - const d3d11::ComputeShader &getComputeShader() const; - - private: - d3d11::PixelShader mPixelExecutable; - d3d11::VertexShader mVertexExecutable; - d3d11::GeometryShader mGeometryExecutable; - d3d11::GeometryShader mStreamOutExecutable; - d3d11::ComputeShader mComputeExecutable; -}; - -class UniformStorage11 : public UniformStorageD3D -{ - public: - UniformStorage11(size_t initialSize); - ~UniformStorage11() override; - - gl::Error getConstantBuffer(Renderer11 *renderer, const d3d11::Buffer **bufferOut); - - private: - d3d11::Buffer mConstantBuffer; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_SHADEREXECUTABLE11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp deleted file mode 100644 index e9902d3f14..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp +++ /dev/null @@ -1,3075 +0,0 @@ -// -// Copyright (c) 2015 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. -// - -// StateManager11.cpp: Defines a class for caching D3D11 state - -#include "libANGLE/renderer/d3d/d3d11/StateManager11.h" - -#include "common/bitset_utils.h" -#include "common/utilities.h" -#include "libANGLE/Context.h" -#include "libANGLE/Query.h" -#include "libANGLE/VertexArray.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" -#include "libANGLE/renderer/d3d/d3d11/Buffer11.h" -#include "libANGLE/renderer/d3d/d3d11/Context11.h" -#include "libANGLE/renderer/d3d/d3d11/Framebuffer11.h" -#include "libANGLE/renderer/d3d/d3d11/IndexBuffer11.h" -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h" -#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h" -#include "libANGLE/renderer/d3d/d3d11/TransformFeedback11.h" -#include "libANGLE/renderer/d3d/d3d11/VertexArray11.h" - -namespace rx -{ - -namespace -{ -bool ImageIndexConflictsWithSRV(const gl::ImageIndex &index, D3D11_SHADER_RESOURCE_VIEW_DESC desc) -{ - unsigned mipLevel = index.mipIndex; - GLint layerIndex = index.layerIndex; - GLenum type = index.type; - - switch (desc.ViewDimension) - { - case D3D11_SRV_DIMENSION_TEXTURE2D: - { - bool allLevels = (desc.Texture2D.MipLevels == std::numeric_limits<UINT>::max()); - unsigned int maxSrvMip = desc.Texture2D.MipLevels + desc.Texture2D.MostDetailedMip; - maxSrvMip = allLevels ? INT_MAX : maxSrvMip; - - unsigned mipMin = index.mipIndex; - unsigned mipMax = (layerIndex == -1) ? INT_MAX : layerIndex; - - return type == GL_TEXTURE_2D && - gl::RangeUI(mipMin, mipMax) - .intersects(gl::RangeUI(desc.Texture2D.MostDetailedMip, maxSrvMip)); - } - - case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: - { - bool allLevels = (desc.Texture2DArray.MipLevels == std::numeric_limits<UINT>::max()); - unsigned int maxSrvMip = - desc.Texture2DArray.MipLevels + desc.Texture2DArray.MostDetailedMip; - maxSrvMip = allLevels ? INT_MAX : maxSrvMip; - - unsigned maxSlice = desc.Texture2DArray.FirstArraySlice + desc.Texture2DArray.ArraySize; - - // Cube maps can be mapped to Texture2DArray SRVs - return (type == GL_TEXTURE_2D_ARRAY || gl::IsCubeMapTextureTarget(type)) && - desc.Texture2DArray.MostDetailedMip <= mipLevel && mipLevel < maxSrvMip && - desc.Texture2DArray.FirstArraySlice <= static_cast<UINT>(layerIndex) && - static_cast<UINT>(layerIndex) < maxSlice; - } - - case D3D11_SRV_DIMENSION_TEXTURECUBE: - { - bool allLevels = (desc.TextureCube.MipLevels == std::numeric_limits<UINT>::max()); - unsigned int maxSrvMip = desc.TextureCube.MipLevels + desc.TextureCube.MostDetailedMip; - maxSrvMip = allLevels ? INT_MAX : maxSrvMip; - - return gl::IsCubeMapTextureTarget(type) && - desc.TextureCube.MostDetailedMip <= mipLevel && mipLevel < maxSrvMip; - } - - case D3D11_SRV_DIMENSION_TEXTURE3D: - { - bool allLevels = (desc.Texture3D.MipLevels == std::numeric_limits<UINT>::max()); - unsigned int maxSrvMip = desc.Texture3D.MipLevels + desc.Texture3D.MostDetailedMip; - maxSrvMip = allLevels ? INT_MAX : maxSrvMip; - - return type == GL_TEXTURE_3D && desc.Texture3D.MostDetailedMip <= mipLevel && - mipLevel < maxSrvMip; - } - default: - // We only handle the cases corresponding to valid image indexes - UNIMPLEMENTED(); - } - - return false; -} - -// Does *not* increment the resource ref count!! -ID3D11Resource *GetViewResource(ID3D11View *view) -{ - ID3D11Resource *resource = nullptr; - ASSERT(view); - view->GetResource(&resource); - resource->Release(); - return resource; -} - -int GetWrapBits(GLenum wrap) -{ - switch (wrap) - { - case GL_CLAMP_TO_EDGE: - return 0x1; - case GL_REPEAT: - return 0x2; - case GL_MIRRORED_REPEAT: - return 0x3; - default: - UNREACHABLE(); - return 0; - } -} - -Optional<size_t> FindFirstNonInstanced( - const std::vector<const TranslatedAttribute *> ¤tAttributes) -{ - for (size_t index = 0; index < currentAttributes.size(); ++index) - { - if (currentAttributes[index]->divisor == 0) - { - return Optional<size_t>(index); - } - } - - return Optional<size_t>::Invalid(); -} - -void SortAttributesByLayout(const gl::Program *program, - const std::vector<TranslatedAttribute> &vertexArrayAttribs, - const std::vector<TranslatedAttribute> ¤tValueAttribs, - AttribIndexArray *sortedD3DSemanticsOut, - std::vector<const TranslatedAttribute *> *sortedAttributesOut) -{ - sortedAttributesOut->clear(); - - const auto &locationToSemantic = - GetImplAs<ProgramD3D>(program)->getAttribLocationToD3DSemantics(); - - for (auto locationIndex : program->getActiveAttribLocationsMask()) - { - int d3dSemantic = locationToSemantic[locationIndex]; - if (sortedAttributesOut->size() <= static_cast<size_t>(d3dSemantic)) - { - sortedAttributesOut->resize(d3dSemantic + 1); - } - - (*sortedD3DSemanticsOut)[d3dSemantic] = d3dSemantic; - - const auto *arrayAttrib = &vertexArrayAttribs[locationIndex]; - if (arrayAttrib->attribute && arrayAttrib->attribute->enabled) - { - (*sortedAttributesOut)[d3dSemantic] = arrayAttrib; - } - else - { - ASSERT(currentValueAttribs[locationIndex].attribute); - (*sortedAttributesOut)[d3dSemantic] = ¤tValueAttribs[locationIndex]; - } - } -} - -void UpdateUniformBuffer(ID3D11DeviceContext *deviceContext, - UniformStorage11 *storage, - const d3d11::Buffer *buffer) -{ - deviceContext->UpdateSubresource(buffer->get(), 0, nullptr, storage->getDataPointer(0, 0), 0, - 0); -} - -} // anonymous namespace - -// StateManager11::SRVCache Implementation. - -StateManager11::SRVCache::SRVCache() : mHighestUsedSRV(0) -{ -} - -StateManager11::SRVCache::~SRVCache() -{ -} - -void StateManager11::SRVCache::update(size_t resourceIndex, ID3D11ShaderResourceView *srv) -{ - ASSERT(resourceIndex < mCurrentSRVs.size()); - SRVRecord *record = &mCurrentSRVs[resourceIndex]; - - record->srv = reinterpret_cast<uintptr_t>(srv); - if (srv) - { - record->resource = reinterpret_cast<uintptr_t>(GetViewResource(srv)); - srv->GetDesc(&record->desc); - mHighestUsedSRV = std::max(resourceIndex + 1, mHighestUsedSRV); - } - else - { - record->resource = 0; - - if (resourceIndex + 1 == mHighestUsedSRV) - { - do - { - --mHighestUsedSRV; - } while (mHighestUsedSRV > 0 && mCurrentSRVs[mHighestUsedSRV].srv == 0); - } - } -} - -void StateManager11::SRVCache::clear() -{ - if (mCurrentSRVs.empty()) - { - return; - } - - memset(&mCurrentSRVs[0], 0, sizeof(SRVRecord) * mCurrentSRVs.size()); - mHighestUsedSRV = 0; -} - -// ShaderConstants11 implementation - -ShaderConstants11::ShaderConstants11() - : mVertexDirty(true), - mPixelDirty(true), - mComputeDirty(true), - mSamplerMetadataVSDirty(true), - mSamplerMetadataPSDirty(true), - mSamplerMetadataCSDirty(true) -{ -} - -ShaderConstants11::~ShaderConstants11() -{ -} - -void ShaderConstants11::init(const gl::Caps &caps) -{ - mSamplerMetadataVS.resize(caps.maxVertexTextureImageUnits); - mSamplerMetadataPS.resize(caps.maxTextureImageUnits); - mSamplerMetadataCS.resize(caps.maxComputeTextureImageUnits); -} - -size_t ShaderConstants11::getRequiredBufferSize(gl::SamplerType samplerType) const -{ - switch (samplerType) - { - case gl::SAMPLER_VERTEX: - return sizeof(Vertex) + mSamplerMetadataVS.size() * sizeof(SamplerMetadata); - case gl::SAMPLER_PIXEL: - return sizeof(Pixel) + mSamplerMetadataPS.size() * sizeof(SamplerMetadata); - case gl::SAMPLER_COMPUTE: - return sizeof(Compute) + mSamplerMetadataCS.size() * sizeof(SamplerMetadata); - default: - UNREACHABLE(); - return 0; - } -} - -void ShaderConstants11::markDirty() -{ - mVertexDirty = true; - mPixelDirty = true; - mComputeDirty = true; - mSamplerMetadataVSDirty = true; - mSamplerMetadataPSDirty = true; - mSamplerMetadataCSDirty = true; -} - -bool ShaderConstants11::updateSamplerMetadata(SamplerMetadata *data, const gl::Texture &texture) -{ - bool dirty = false; - unsigned int baseLevel = texture.getTextureState().getEffectiveBaseLevel(); - GLenum sizedFormat = - texture.getFormat(texture.getTarget(), baseLevel).info->sizedInternalFormat; - if (data->baseLevel != static_cast<int>(baseLevel)) - { - data->baseLevel = static_cast<int>(baseLevel); - dirty = true; - } - - // Some metadata is needed only for integer textures. We avoid updating the constant buffer - // unnecessarily by changing the data only in case the texture is an integer texture and - // the values have changed. - bool needIntegerTextureMetadata = false; - // internalFormatBits == 0 means a 32-bit texture in the case of integer textures. - int internalFormatBits = 0; - switch (sizedFormat) - { - case GL_RGBA32I: - case GL_RGBA32UI: - case GL_RGB32I: - case GL_RGB32UI: - case GL_RG32I: - case GL_RG32UI: - case GL_R32I: - case GL_R32UI: - needIntegerTextureMetadata = true; - break; - case GL_RGBA16I: - case GL_RGBA16UI: - case GL_RGB16I: - case GL_RGB16UI: - case GL_RG16I: - case GL_RG16UI: - case GL_R16I: - case GL_R16UI: - needIntegerTextureMetadata = true; - internalFormatBits = 16; - break; - case GL_RGBA8I: - case GL_RGBA8UI: - case GL_RGB8I: - case GL_RGB8UI: - case GL_RG8I: - case GL_RG8UI: - case GL_R8I: - case GL_R8UI: - needIntegerTextureMetadata = true; - internalFormatBits = 8; - break; - case GL_RGB10_A2UI: - needIntegerTextureMetadata = true; - internalFormatBits = 10; - break; - default: - break; - } - if (needIntegerTextureMetadata) - { - if (data->internalFormatBits != internalFormatBits) - { - data->internalFormatBits = internalFormatBits; - dirty = true; - } - // Pack the wrap values into one integer so we can fit all the metadata in one 4-integer - // vector. - GLenum wrapS = texture.getWrapS(); - GLenum wrapT = texture.getWrapT(); - GLenum wrapR = texture.getWrapR(); - int wrapModes = GetWrapBits(wrapS) | (GetWrapBits(wrapT) << 2) | (GetWrapBits(wrapR) << 4); - if (data->wrapModes != wrapModes) - { - data->wrapModes = wrapModes; - dirty = true; - } - } - - return dirty; -} - -void ShaderConstants11::setComputeWorkGroups(GLuint numGroupsX, - GLuint numGroupsY, - GLuint numGroupsZ) -{ - mCompute.numWorkGroups[0] = numGroupsX; - mCompute.numWorkGroups[1] = numGroupsY; - mCompute.numWorkGroups[2] = numGroupsZ; - mComputeDirty = true; -} - -void ShaderConstants11::setMultiviewWriteToViewportIndex(GLfloat index) -{ - mVertex.multiviewWriteToViewportIndex = index; - mVertexDirty = true; - mPixel.multiviewWriteToViewportIndex = index; - mPixelDirty = true; -} - -void ShaderConstants11::onViewportChange(const gl::Rectangle &glViewport, - const D3D11_VIEWPORT &dxViewport, - bool is9_3, - bool presentPathFast) -{ - mVertexDirty = true; - mPixelDirty = true; - - // On Feature Level 9_*, we must emulate large and/or negative viewports in the shaders - // using viewAdjust (like the D3D9 renderer). - if (is9_3) - { - mVertex.viewAdjust[0] = static_cast<float>((glViewport.width - dxViewport.Width) + - 2 * (glViewport.x - dxViewport.TopLeftX)) / - dxViewport.Width; - mVertex.viewAdjust[1] = static_cast<float>((glViewport.height - dxViewport.Height) + - 2 * (glViewport.y - dxViewport.TopLeftY)) / - dxViewport.Height; - mVertex.viewAdjust[2] = static_cast<float>(glViewport.width) / dxViewport.Width; - mVertex.viewAdjust[3] = static_cast<float>(glViewport.height) / dxViewport.Height; - } - - mPixel.viewCoords[0] = glViewport.width * 0.5f; - mPixel.viewCoords[1] = glViewport.height * 0.5f; - mPixel.viewCoords[2] = glViewport.x + (glViewport.width * 0.5f); - mPixel.viewCoords[3] = glViewport.y + (glViewport.height * 0.5f); - - // Instanced pointsprite emulation requires ViewCoords to be defined in the - // the vertex shader. - mVertex.viewCoords[0] = mPixel.viewCoords[0]; - mVertex.viewCoords[1] = mPixel.viewCoords[1]; - mVertex.viewCoords[2] = mPixel.viewCoords[2]; - mVertex.viewCoords[3] = mPixel.viewCoords[3]; - - const float zNear = dxViewport.MinDepth; - const float zFar = dxViewport.MaxDepth; - - mPixel.depthFront[0] = (zFar - zNear) * 0.5f; - mPixel.depthFront[1] = (zNear + zFar) * 0.5f; - - mVertex.depthRange[0] = zNear; - mVertex.depthRange[1] = zFar; - mVertex.depthRange[2] = zFar - zNear; - - mPixel.depthRange[0] = zNear; - mPixel.depthRange[1] = zFar; - mPixel.depthRange[2] = zFar - zNear; - - mPixel.viewScale[0] = 1.0f; - mPixel.viewScale[1] = presentPathFast ? 1.0f : -1.0f; - // Updates to the multiviewWriteToViewportIndex member are to be handled whenever the draw - // framebuffer's layout is changed. - - mVertex.viewScale[0] = mPixel.viewScale[0]; - mVertex.viewScale[1] = mPixel.viewScale[1]; -} - -void ShaderConstants11::onSamplerChange(gl::SamplerType samplerType, - unsigned int samplerIndex, - const gl::Texture &texture) -{ - switch (samplerType) - { - case gl::SAMPLER_VERTEX: - if (updateSamplerMetadata(&mSamplerMetadataVS[samplerIndex], texture)) - { - mSamplerMetadataVSDirty = true; - } - break; - case gl::SAMPLER_PIXEL: - if (updateSamplerMetadata(&mSamplerMetadataPS[samplerIndex], texture)) - { - mSamplerMetadataPSDirty = true; - } - break; - case gl::SAMPLER_COMPUTE: - if (updateSamplerMetadata(&mSamplerMetadataCS[samplerIndex], texture)) - { - mSamplerMetadataCSDirty = true; - } - break; - default: - UNREACHABLE(); - break; - } -} - -gl::Error ShaderConstants11::updateBuffer(ID3D11DeviceContext *deviceContext, - gl::SamplerType samplerType, - const ProgramD3D &programD3D, - const d3d11::Buffer &driverConstantBuffer) -{ - bool dirty = false; - size_t dataSize = 0; - const uint8_t *data = nullptr; - const uint8_t *samplerData = nullptr; - - switch (samplerType) - { - case gl::SAMPLER_VERTEX: - dirty = mVertexDirty || mSamplerMetadataVSDirty; - dataSize = sizeof(Vertex); - data = reinterpret_cast<const uint8_t *>(&mVertex); - samplerData = reinterpret_cast<const uint8_t *>(mSamplerMetadataVS.data()); - mVertexDirty = false; - mSamplerMetadataVSDirty = false; - break; - case gl::SAMPLER_PIXEL: - dirty = mPixelDirty || mSamplerMetadataPSDirty; - dataSize = sizeof(Pixel); - data = reinterpret_cast<const uint8_t *>(&mPixel); - samplerData = reinterpret_cast<const uint8_t *>(mSamplerMetadataPS.data()); - mPixelDirty = false; - mSamplerMetadataPSDirty = false; - break; - case gl::SAMPLER_COMPUTE: - dirty = mComputeDirty || mSamplerMetadataCSDirty; - dataSize = sizeof(Compute); - data = reinterpret_cast<const uint8_t *>(&mCompute); - samplerData = reinterpret_cast<const uint8_t *>(mSamplerMetadataCS.data()); - mComputeDirty = false; - mSamplerMetadataCSDirty = false; - break; - default: - UNREACHABLE(); - break; - } - - ASSERT(driverConstantBuffer.valid()); - - if (!dirty) - { - return gl::NoError(); - } - - // Previous buffer contents are discarded, so we need to refresh the whole buffer. - D3D11_MAPPED_SUBRESOURCE mapping = {0}; - HRESULT result = - deviceContext->Map(driverConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapping); - - if (FAILED(result)) - { - return gl::OutOfMemory() << "Internal error mapping constant buffer: " << gl::FmtHR(result); - } - - size_t samplerDataBytes = sizeof(SamplerMetadata) * programD3D.getUsedSamplerRange(samplerType); - - memcpy(mapping.pData, data, dataSize); - memcpy(reinterpret_cast<uint8_t *>(mapping.pData) + dataSize, samplerData, samplerDataBytes); - - deviceContext->Unmap(driverConstantBuffer.get(), 0); - - return gl::NoError(); -} - -static const GLenum QueryTypes[] = {GL_ANY_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED_CONSERVATIVE, - GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, GL_TIME_ELAPSED_EXT, - GL_COMMANDS_COMPLETED_CHROMIUM}; - -StateManager11::StateManager11(Renderer11 *renderer) - : mRenderer(renderer), - mInternalDirtyBits(), - mCurBlendColor(0, 0, 0, 0), - mCurSampleMask(0), - mCurStencilRef(0), - mCurStencilBackRef(0), - mCurStencilSize(0), - mCurScissorEnabled(false), - mCurScissorRect(), - mCurViewport(), - mCurNear(0.0f), - mCurFar(0.0f), - mViewportBounds(), - mRenderTargetIsDirty(true), - mCurPresentPathFastEnabled(false), - mCurPresentPathFastColorBufferHeight(0), - mDirtyCurrentValueAttribs(), - mCurrentValueAttribs(), - mCurrentInputLayout(), - mInputLayoutIsDirty(false), - mVertexAttribsNeedTranslation(false), - mDirtyVertexBufferRange(gl::MAX_VERTEX_ATTRIBS, 0), - mCurrentPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_UNDEFINED), - mDirtySwizzles(false), - mAppliedIB(nullptr), - mAppliedIBFormat(DXGI_FORMAT_UNKNOWN), - mAppliedIBOffset(0), - mIndexBufferIsDirty(false), - mVertexDataManager(renderer), - mIndexDataManager(renderer), - mIsMultiviewEnabled(false), - mEmptySerial(mRenderer->generateSerial()), - mIsTransformFeedbackCurrentlyActiveUnpaused(false) -{ - mCurBlendState.blend = false; - mCurBlendState.sourceBlendRGB = GL_ONE; - mCurBlendState.destBlendRGB = GL_ZERO; - mCurBlendState.sourceBlendAlpha = GL_ONE; - mCurBlendState.destBlendAlpha = GL_ZERO; - mCurBlendState.blendEquationRGB = GL_FUNC_ADD; - mCurBlendState.blendEquationAlpha = GL_FUNC_ADD; - mCurBlendState.colorMaskRed = true; - mCurBlendState.colorMaskBlue = true; - mCurBlendState.colorMaskGreen = true; - mCurBlendState.colorMaskAlpha = true; - mCurBlendState.sampleAlphaToCoverage = false; - mCurBlendState.dither = false; - - mCurDepthStencilState.depthTest = false; - mCurDepthStencilState.depthFunc = GL_LESS; - mCurDepthStencilState.depthMask = true; - mCurDepthStencilState.stencilTest = false; - mCurDepthStencilState.stencilMask = true; - mCurDepthStencilState.stencilFail = GL_KEEP; - mCurDepthStencilState.stencilPassDepthFail = GL_KEEP; - mCurDepthStencilState.stencilPassDepthPass = GL_KEEP; - mCurDepthStencilState.stencilWritemask = static_cast<GLuint>(-1); - mCurDepthStencilState.stencilBackFunc = GL_ALWAYS; - mCurDepthStencilState.stencilBackMask = static_cast<GLuint>(-1); - mCurDepthStencilState.stencilBackFail = GL_KEEP; - mCurDepthStencilState.stencilBackPassDepthFail = GL_KEEP; - mCurDepthStencilState.stencilBackPassDepthPass = GL_KEEP; - mCurDepthStencilState.stencilBackWritemask = static_cast<GLuint>(-1); - - mCurRasterState.rasterizerDiscard = false; - mCurRasterState.cullFace = false; - mCurRasterState.cullMode = gl::CullFaceMode::Back; - mCurRasterState.frontFace = GL_CCW; - mCurRasterState.polygonOffsetFill = false; - mCurRasterState.polygonOffsetFactor = 0.0f; - mCurRasterState.polygonOffsetUnits = 0.0f; - mCurRasterState.pointDrawMode = false; - mCurRasterState.multiSample = false; - - // Start with all internal dirty bits set. - mInternalDirtyBits.set(); - - // Initially all current value attributes must be updated on first use. - mDirtyCurrentValueAttribs.set(); - - mCurrentVertexBuffers.fill(nullptr); - mCurrentVertexStrides.fill(std::numeric_limits<UINT>::max()); - mCurrentVertexOffsets.fill(std::numeric_limits<UINT>::max()); -} - -StateManager11::~StateManager11() -{ -} - -template <typename SRVType> -void StateManager11::setShaderResourceInternal(gl::SamplerType shaderType, - UINT resourceSlot, - const SRVType *srv) -{ - auto ¤tSRVs = (shaderType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs); - - ASSERT(static_cast<size_t>(resourceSlot) < currentSRVs.size()); - const SRVRecord &record = currentSRVs[resourceSlot]; - - if (record.srv != reinterpret_cast<uintptr_t>(srv)) - { - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - ID3D11ShaderResourceView *srvPtr = srv ? srv->get() : nullptr; - if (shaderType == gl::SAMPLER_VERTEX) - { - deviceContext->VSSetShaderResources(resourceSlot, 1, &srvPtr); - } - else - { - deviceContext->PSSetShaderResources(resourceSlot, 1, &srvPtr); - } - - currentSRVs.update(resourceSlot, srvPtr); - } -} - -void StateManager11::updateStencilSizeIfChanged(bool depthStencilInitialized, - unsigned int stencilSize) -{ - if (!depthStencilInitialized || stencilSize != mCurStencilSize) - { - mCurStencilSize = stencilSize; - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - } -} - -void StateManager11::checkPresentPath(const gl::Context *context) -{ - if (!mRenderer->presentPathFastEnabled()) - return; - - const auto *framebuffer = context->getGLState().getDrawFramebuffer(); - const auto *firstColorAttachment = framebuffer->getFirstColorbuffer(); - const bool presentPathFastActive = UsePresentPathFast(mRenderer, firstColorAttachment); - - const int colorBufferHeight = firstColorAttachment ? firstColorAttachment->getSize().height : 0; - - if ((mCurPresentPathFastEnabled != presentPathFastActive) || - (presentPathFastActive && (colorBufferHeight != mCurPresentPathFastColorBufferHeight))) - { - mCurPresentPathFastEnabled = presentPathFastActive; - mCurPresentPathFastColorBufferHeight = colorBufferHeight; - - // Scissor rect may need to be vertically inverted - mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE); - - // Cull Mode may need to be inverted - mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE); - - // Viewport may need to be vertically inverted - invalidateViewport(context); - } -} - -gl::Error StateManager11::updateStateForCompute(const gl::Context *context, - GLuint numGroupsX, - GLuint numGroupsY, - GLuint numGroupsZ) -{ - mShaderConstants.setComputeWorkGroups(numGroupsX, numGroupsY, numGroupsZ); - - // TODO(jmadill): Use dirty bits. - const auto &glState = context->getGLState(); - auto *programD3D = GetImplAs<ProgramD3D>(glState.getProgram()); - programD3D->updateSamplerMapping(); - - // TODO(jmadill): Use dirty bits. - ANGLE_TRY(generateSwizzlesForShader(context, gl::SAMPLER_COMPUTE)); - - // TODO(jmadill): More complete implementation. - ANGLE_TRY(syncTextures(context)); - - // TODO(Xinghua): applyUniformBuffers for compute shader. - - return gl::NoError(); -} - -void StateManager11::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits) -{ - if (!dirtyBits.any()) - { - return; - } - - const auto &state = context->getGLState(); - - for (auto dirtyBit : dirtyBits) - { - switch (dirtyBit) - { - case gl::State::DIRTY_BIT_BLEND_EQUATIONS: - { - const gl::BlendState &blendState = state.getBlendState(); - if (blendState.blendEquationRGB != mCurBlendState.blendEquationRGB || - blendState.blendEquationAlpha != mCurBlendState.blendEquationAlpha) - { - mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); - } - break; - } - case gl::State::DIRTY_BIT_BLEND_FUNCS: - { - const gl::BlendState &blendState = state.getBlendState(); - if (blendState.sourceBlendRGB != mCurBlendState.sourceBlendRGB || - blendState.destBlendRGB != mCurBlendState.destBlendRGB || - blendState.sourceBlendAlpha != mCurBlendState.sourceBlendAlpha || - blendState.destBlendAlpha != mCurBlendState.destBlendAlpha) - { - mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); - } - break; - } - case gl::State::DIRTY_BIT_BLEND_ENABLED: - if (state.getBlendState().blend != mCurBlendState.blend) - { - mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); - } - break; - case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED: - if (state.getBlendState().sampleAlphaToCoverage != - mCurBlendState.sampleAlphaToCoverage) - { - mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); - } - break; - case gl::State::DIRTY_BIT_DITHER_ENABLED: - if (state.getBlendState().dither != mCurBlendState.dither) - { - mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); - } - break; - case gl::State::DIRTY_BIT_COLOR_MASK: - { - const gl::BlendState &blendState = state.getBlendState(); - if (blendState.colorMaskRed != mCurBlendState.colorMaskRed || - blendState.colorMaskGreen != mCurBlendState.colorMaskGreen || - blendState.colorMaskBlue != mCurBlendState.colorMaskBlue || - blendState.colorMaskAlpha != mCurBlendState.colorMaskAlpha) - { - mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); - } - break; - } - case gl::State::DIRTY_BIT_BLEND_COLOR: - if (state.getBlendColor() != mCurBlendColor) - { - mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); - } - break; - case gl::State::DIRTY_BIT_DEPTH_MASK: - if (state.getDepthStencilState().depthMask != mCurDepthStencilState.depthMask) - { - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - } - break; - case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED: - if (state.getDepthStencilState().depthTest != mCurDepthStencilState.depthTest) - { - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - } - break; - case gl::State::DIRTY_BIT_DEPTH_FUNC: - if (state.getDepthStencilState().depthFunc != mCurDepthStencilState.depthFunc) - { - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - } - break; - case gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED: - if (state.getDepthStencilState().stencilTest != mCurDepthStencilState.stencilTest) - { - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - } - break; - case gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT: - { - const gl::DepthStencilState &depthStencil = state.getDepthStencilState(); - if (depthStencil.stencilFunc != mCurDepthStencilState.stencilFunc || - depthStencil.stencilMask != mCurDepthStencilState.stencilMask || - state.getStencilRef() != mCurStencilRef) - { - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - } - break; - } - case gl::State::DIRTY_BIT_STENCIL_FUNCS_BACK: - { - const gl::DepthStencilState &depthStencil = state.getDepthStencilState(); - if (depthStencil.stencilBackFunc != mCurDepthStencilState.stencilBackFunc || - depthStencil.stencilBackMask != mCurDepthStencilState.stencilBackMask || - state.getStencilBackRef() != mCurStencilBackRef) - { - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - } - break; - } - case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT: - if (state.getDepthStencilState().stencilWritemask != - mCurDepthStencilState.stencilWritemask) - { - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - } - break; - case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK: - if (state.getDepthStencilState().stencilBackWritemask != - mCurDepthStencilState.stencilBackWritemask) - { - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - } - break; - case gl::State::DIRTY_BIT_STENCIL_OPS_FRONT: - { - const gl::DepthStencilState &depthStencil = state.getDepthStencilState(); - if (depthStencil.stencilFail != mCurDepthStencilState.stencilFail || - depthStencil.stencilPassDepthFail != - mCurDepthStencilState.stencilPassDepthFail || - depthStencil.stencilPassDepthPass != mCurDepthStencilState.stencilPassDepthPass) - { - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - } - break; - } - case gl::State::DIRTY_BIT_STENCIL_OPS_BACK: - { - const gl::DepthStencilState &depthStencil = state.getDepthStencilState(); - if (depthStencil.stencilBackFail != mCurDepthStencilState.stencilBackFail || - depthStencil.stencilBackPassDepthFail != - mCurDepthStencilState.stencilBackPassDepthFail || - depthStencil.stencilBackPassDepthPass != - mCurDepthStencilState.stencilBackPassDepthPass) - { - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - } - break; - } - case gl::State::DIRTY_BIT_CULL_FACE_ENABLED: - if (state.getRasterizerState().cullFace != mCurRasterState.cullFace) - { - mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE); - } - break; - case gl::State::DIRTY_BIT_CULL_FACE: - if (state.getRasterizerState().cullMode != mCurRasterState.cullMode) - { - mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE); - } - break; - case gl::State::DIRTY_BIT_FRONT_FACE: - if (state.getRasterizerState().frontFace != mCurRasterState.frontFace) - { - mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE); - } - break; - case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED: - if (state.getRasterizerState().polygonOffsetFill != - mCurRasterState.polygonOffsetFill) - { - mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE); - } - break; - case gl::State::DIRTY_BIT_POLYGON_OFFSET: - { - const gl::RasterizerState &rasterState = state.getRasterizerState(); - if (rasterState.polygonOffsetFactor != mCurRasterState.polygonOffsetFactor || - rasterState.polygonOffsetUnits != mCurRasterState.polygonOffsetUnits) - { - mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE); - } - break; - } - case gl::State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED: - if (state.getRasterizerState().rasterizerDiscard != - mCurRasterState.rasterizerDiscard) - { - mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE); - - // Enabling/disabling rasterizer discard affects the pixel shader. - invalidateShaders(); - } - break; - case gl::State::DIRTY_BIT_SCISSOR: - if (state.getScissor() != mCurScissorRect) - { - mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE); - } - break; - case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED: - if (state.isScissorTestEnabled() != mCurScissorEnabled) - { - mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE); - // Rasterizer state update needs mCurScissorsEnabled and updates when it changes - mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE); - } - break; - case gl::State::DIRTY_BIT_DEPTH_RANGE: - if (state.getNearPlane() != mCurNear || state.getFarPlane() != mCurFar) - { - invalidateViewport(context); - } - break; - case gl::State::DIRTY_BIT_VIEWPORT: - if (state.getViewport() != mCurViewport) - { - invalidateViewport(context); - } - break; - case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING: - invalidateRenderTarget(); - if (mIsMultiviewEnabled) - { - handleMultiviewDrawFramebufferChange(context); - } - break; - case gl::State::DIRTY_BIT_VERTEX_ARRAY_BINDING: - invalidateVertexBuffer(); - // Force invalidate the current value attributes, since the VertexArray11 keeps an - // internal cache of TranslatedAttributes, and they CurrentValue attributes are - // owned by the StateManager11/Context. - mDirtyCurrentValueAttribs.set(); - // Invalidate the cached index buffer. - mIndexBufferIsDirty = true; - break; - case gl::State::DIRTY_BIT_TEXTURE_BINDINGS: - invalidateTexturesAndSamplers(); - break; - case gl::State::DIRTY_BIT_SAMPLER_BINDINGS: - invalidateTexturesAndSamplers(); - break; - case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE: - { - mInternalDirtyBits.set(DIRTY_BIT_SHADERS); - invalidateVertexBuffer(); - invalidateRenderTarget(); - invalidateTexturesAndSamplers(); - invalidateProgramUniforms(); - invalidateProgramUniformBuffers(); - gl::VertexArray *vao = state.getVertexArray(); - if (mIsMultiviewEnabled && vao != nullptr) - { - // If ANGLE_multiview is enabled, the attribute divisor has to be updated for - // each binding. - VertexArray11 *vao11 = GetImplAs<VertexArray11>(vao); - const gl::Program *program = state.getProgram(); - int numViews = 1; - if (program != nullptr && program->usesMultiview()) - { - numViews = program->getNumViews(); - } - vao11->markAllAttributeDivisorsForAdjustment(numViews); - } - break; - } - case gl::State::DIRTY_BIT_CURRENT_VALUES: - { - for (auto attribIndex : state.getAndResetDirtyCurrentValues()) - { - invalidateCurrentValueAttrib(attribIndex); - } - } - default: - break; - } - } - - // TODO(jmadill): Input layout and vertex buffer state. -} - -void StateManager11::handleMultiviewDrawFramebufferChange(const gl::Context *context) -{ - const auto &glState = context->getGLState(); - const gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer(); - ASSERT(drawFramebuffer != nullptr); - - // Update viewport offsets. - const std::vector<gl::Offset> *attachmentViewportOffsets = - drawFramebuffer->getViewportOffsets(); - const std::vector<gl::Offset> &viewportOffsets = - attachmentViewportOffsets != nullptr - ? *attachmentViewportOffsets - : gl::FramebufferAttachment::GetDefaultViewportOffsetVector(); - if (mViewportOffsets != viewportOffsets) - { - mViewportOffsets = viewportOffsets; - - // Because new viewport offsets are to be applied, we have to mark the internal viewport and - // scissor state as dirty. - invalidateViewport(context); - mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE); - } - switch (drawFramebuffer->getMultiviewLayout()) - { - case GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE: - mShaderConstants.setMultiviewWriteToViewportIndex(1.0f); - break; - case GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE: - // Because the base view index is applied as an offset to the 2D texture array when the - // RTV is created, we just have to pass a boolean to select which code path is to be - // used. - mShaderConstants.setMultiviewWriteToViewportIndex(0.0f); - break; - default: - // There is no need to update the value in the constant buffer if the active framebuffer - // object does not have a multiview layout. - break; - } -} - -gl::Error StateManager11::syncBlendState(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::BlendState &blendState, - const gl::ColorF &blendColor, - unsigned int sampleMask) -{ - const d3d11::BlendState *dxBlendState = nullptr; - const d3d11::BlendStateKey &key = - RenderStateCache::GetBlendStateKey(context, framebuffer, blendState); - - ANGLE_TRY(mRenderer->getBlendState(key, &dxBlendState)); - - ASSERT(dxBlendState != nullptr); - - float blendColors[4] = {0.0f}; - if (blendState.sourceBlendRGB != GL_CONSTANT_ALPHA && - blendState.sourceBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA && - blendState.destBlendRGB != GL_CONSTANT_ALPHA && - blendState.destBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA) - { - blendColors[0] = blendColor.red; - blendColors[1] = blendColor.green; - blendColors[2] = blendColor.blue; - blendColors[3] = blendColor.alpha; - } - else - { - blendColors[0] = blendColor.alpha; - blendColors[1] = blendColor.alpha; - blendColors[2] = blendColor.alpha; - blendColors[3] = blendColor.alpha; - } - - mRenderer->getDeviceContext()->OMSetBlendState(dxBlendState->get(), blendColors, sampleMask); - - mCurBlendState = blendState; - mCurBlendColor = blendColor; - mCurSampleMask = sampleMask; - - return gl::NoError(); -} - -gl::Error StateManager11::syncDepthStencilState(const gl::State &glState) -{ - mCurDepthStencilState = glState.getDepthStencilState(); - mCurStencilRef = glState.getStencilRef(); - mCurStencilBackRef = glState.getStencilBackRef(); - - // get the maximum size of the stencil ref - unsigned int maxStencil = 0; - if (mCurDepthStencilState.stencilTest && mCurStencilSize > 0) - { - maxStencil = (1 << mCurStencilSize) - 1; - } - ASSERT((mCurDepthStencilState.stencilWritemask & maxStencil) == - (mCurDepthStencilState.stencilBackWritemask & maxStencil)); - ASSERT(mCurStencilRef == mCurStencilBackRef); - ASSERT((mCurDepthStencilState.stencilMask & maxStencil) == - (mCurDepthStencilState.stencilBackMask & maxStencil)); - - gl::DepthStencilState modifiedGLState = glState.getDepthStencilState(); - - ASSERT(mCurDisableDepth.valid() && mCurDisableStencil.valid()); - - if (mCurDisableDepth.value()) - { - modifiedGLState.depthTest = false; - modifiedGLState.depthMask = false; - } - - if (mCurDisableStencil.value()) - { - modifiedGLState.stencilWritemask = 0; - modifiedGLState.stencilBackWritemask = 0; - modifiedGLState.stencilTest = false; - } - - const d3d11::DepthStencilState *d3dState = nullptr; - ANGLE_TRY(mRenderer->getDepthStencilState(modifiedGLState, &d3dState)); - ASSERT(d3dState); - - // Max D3D11 stencil reference value is 0xFF, - // corresponding to the max 8 bits in a stencil buffer - // GL specifies we should clamp the ref value to the - // nearest bit depth when doing stencil ops - static_assert(D3D11_DEFAULT_STENCIL_READ_MASK == 0xFF, - "Unexpected value of D3D11_DEFAULT_STENCIL_READ_MASK"); - static_assert(D3D11_DEFAULT_STENCIL_WRITE_MASK == 0xFF, - "Unexpected value of D3D11_DEFAULT_STENCIL_WRITE_MASK"); - UINT dxStencilRef = std::min<UINT>(mCurStencilRef, 0xFFu); - - mRenderer->getDeviceContext()->OMSetDepthStencilState(d3dState->get(), dxStencilRef); - - return gl::NoError(); -} - -gl::Error StateManager11::syncRasterizerState(const gl::Context *context, bool pointDrawMode) -{ - // TODO: Remove pointDrawMode and multiSample from gl::RasterizerState. - gl::RasterizerState rasterState = context->getGLState().getRasterizerState(); - rasterState.pointDrawMode = pointDrawMode; - rasterState.multiSample = mCurRasterState.multiSample; - - ID3D11RasterizerState *dxRasterState = nullptr; - - if (mCurPresentPathFastEnabled) - { - gl::RasterizerState modifiedRasterState = rasterState; - - // If prseent path fast is active then we need invert the front face state. - // This ensures that both gl_FrontFacing is correct, and front/back culling - // is performed correctly. - if (modifiedRasterState.frontFace == GL_CCW) - { - modifiedRasterState.frontFace = GL_CW; - } - else - { - ASSERT(modifiedRasterState.frontFace == GL_CW); - modifiedRasterState.frontFace = GL_CCW; - } - - ANGLE_TRY( - mRenderer->getRasterizerState(modifiedRasterState, mCurScissorEnabled, &dxRasterState)); - } - else - { - ANGLE_TRY(mRenderer->getRasterizerState(rasterState, mCurScissorEnabled, &dxRasterState)); - } - - mRenderer->getDeviceContext()->RSSetState(dxRasterState); - - mCurRasterState = rasterState; - - return gl::NoError(); -} - -void StateManager11::syncScissorRectangle(const gl::Rectangle &scissor, bool enabled) -{ - int modifiedScissorY = scissor.y; - if (mCurPresentPathFastEnabled) - { - modifiedScissorY = mCurPresentPathFastColorBufferHeight - scissor.height - scissor.y; - } - - if (enabled) - { - std::array<D3D11_RECT, gl::IMPLEMENTATION_ANGLE_MULTIVIEW_MAX_VIEWS> rectangles; - const UINT numRectangles = static_cast<UINT>(mViewportOffsets.size()); - for (UINT i = 0u; i < numRectangles; ++i) - { - D3D11_RECT &rect = rectangles[i]; - int x = scissor.x + mViewportOffsets[i].x; - int y = modifiedScissorY + mViewportOffsets[i].y; - rect.left = std::max(0, x); - rect.top = std::max(0, y); - rect.right = x + std::max(0, scissor.width); - rect.bottom = y + std::max(0, scissor.height); - } - mRenderer->getDeviceContext()->RSSetScissorRects(numRectangles, rectangles.data()); - } - - mCurScissorRect = scissor; - mCurScissorEnabled = enabled; -} - -void StateManager11::syncViewport(const gl::Context *context) -{ - const auto &glState = context->getGLState(); - gl::Framebuffer *framebuffer = glState.getDrawFramebuffer(); - float actualZNear = gl::clamp01(glState.getNearPlane()); - float actualZFar = gl::clamp01(glState.getFarPlane()); - - const auto &caps = context->getCaps(); - int dxMaxViewportBoundsX = static_cast<int>(caps.maxViewportWidth); - int dxMaxViewportBoundsY = static_cast<int>(caps.maxViewportHeight); - int dxMinViewportBoundsX = -dxMaxViewportBoundsX; - int dxMinViewportBoundsY = -dxMaxViewportBoundsY; - - bool is9_3 = mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3; - - if (is9_3) - { - // Feature Level 9 viewports shouldn't exceed the dimensions of the rendertarget. - dxMaxViewportBoundsX = static_cast<int>(mViewportBounds.width); - dxMaxViewportBoundsY = static_cast<int>(mViewportBounds.height); - dxMinViewportBoundsX = 0; - dxMinViewportBoundsY = 0; - } - - const auto &viewport = glState.getViewport(); - std::array<D3D11_VIEWPORT, gl::IMPLEMENTATION_ANGLE_MULTIVIEW_MAX_VIEWS> dxViewports; - const UINT numRectangles = static_cast<UINT>(mViewportOffsets.size()); - - int dxViewportTopLeftX = 0; - int dxViewportTopLeftY = 0; - int dxViewportWidth = 0; - int dxViewportHeight = 0; - - for (UINT i = 0u; i < numRectangles; ++i) - { - dxViewportTopLeftX = gl::clamp(viewport.x + mViewportOffsets[i].x, dxMinViewportBoundsX, - dxMaxViewportBoundsX); - dxViewportTopLeftY = gl::clamp(viewport.y + mViewportOffsets[i].y, dxMinViewportBoundsY, - dxMaxViewportBoundsY); - dxViewportWidth = gl::clamp(viewport.width, 0, dxMaxViewportBoundsX - dxViewportTopLeftX); - dxViewportHeight = gl::clamp(viewport.height, 0, dxMaxViewportBoundsY - dxViewportTopLeftY); - - D3D11_VIEWPORT &dxViewport = dxViewports[i]; - dxViewport.TopLeftX = static_cast<float>(dxViewportTopLeftX); - if (mCurPresentPathFastEnabled) - { - // When present path fast is active and we're rendering to framebuffer 0, we must invert - // the viewport in Y-axis. - // NOTE: We delay the inversion until right before the call to RSSetViewports, and leave - // dxViewportTopLeftY unchanged. This allows us to calculate viewAdjust below using the - // unaltered dxViewportTopLeftY value. - dxViewport.TopLeftY = static_cast<float>(mCurPresentPathFastColorBufferHeight - - dxViewportTopLeftY - dxViewportHeight); - } - else - { - dxViewport.TopLeftY = static_cast<float>(dxViewportTopLeftY); - } - - // The es 3.1 spec section 9.2 states that, "If there are no attachments, rendering - // will be limited to a rectangle having a lower left of (0, 0) and an upper right of - // (width, height), where width and height are the framebuffer object's default width - // and height." See http://anglebug.com/1594 - // If the Framebuffer has no color attachment and the default width or height is smaller - // than the current viewport, use the smaller of the two sizes. - // If framebuffer default width or height is 0, the params should not set. - if (!framebuffer->getFirstNonNullAttachment() && - (framebuffer->getDefaultWidth() || framebuffer->getDefaultHeight())) - { - dxViewport.Width = - static_cast<GLfloat>(std::min(viewport.width, framebuffer->getDefaultWidth())); - dxViewport.Height = - static_cast<GLfloat>(std::min(viewport.height, framebuffer->getDefaultHeight())); - } - else - { - dxViewport.Width = static_cast<float>(dxViewportWidth); - dxViewport.Height = static_cast<float>(dxViewportHeight); - } - dxViewport.MinDepth = actualZNear; - dxViewport.MaxDepth = actualZFar; - } - - mRenderer->getDeviceContext()->RSSetViewports(numRectangles, dxViewports.data()); - - mCurViewport = viewport; - mCurNear = actualZNear; - mCurFar = actualZFar; - - const D3D11_VIEWPORT adjustViewport = {static_cast<FLOAT>(dxViewportTopLeftX), - static_cast<FLOAT>(dxViewportTopLeftY), - static_cast<FLOAT>(dxViewportWidth), - static_cast<FLOAT>(dxViewportHeight), - actualZNear, - actualZFar}; - mShaderConstants.onViewportChange(viewport, adjustViewport, is9_3, mCurPresentPathFastEnabled); -} - -void StateManager11::invalidateRenderTarget() -{ - mRenderTargetIsDirty = true; -} - -void StateManager11::processFramebufferInvalidation(const gl::Context *context) -{ - if (!mRenderTargetIsDirty) - { - return; - } - - ASSERT(context); - - mRenderTargetIsDirty = false; - mInternalDirtyBits.set(DIRTY_BIT_RENDER_TARGET); - - // The pixel shader is dependent on the output layout. - invalidateShaders(); - - // The D3D11 blend state is heavily dependent on the current render target. - mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); - - gl::Framebuffer *fbo = context->getGLState().getDrawFramebuffer(); - ASSERT(fbo); - - // Disable the depth test/depth write if we are using a stencil-only attachment. - // This is because ANGLE emulates stencil-only with D24S8 on D3D11 - we should neither read - // nor write to the unused depth part of this emulated texture. - bool disableDepth = (!fbo->hasDepth() && fbo->hasStencil()); - - // Similarly we disable the stencil portion of the DS attachment if the app only binds depth. - bool disableStencil = (fbo->hasDepth() && !fbo->hasStencil()); - - if (!mCurDisableDepth.valid() || disableDepth != mCurDisableDepth.value() || - !mCurDisableStencil.valid() || disableStencil != mCurDisableStencil.value()) - { - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); - mCurDisableDepth = disableDepth; - mCurDisableStencil = disableStencil; - } - - bool multiSample = (fbo->getCachedSamples(context) != 0); - if (multiSample != mCurRasterState.multiSample) - { - mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE); - mCurRasterState.multiSample = multiSample; - } - - checkPresentPath(context); - - if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3) - { - const auto *firstAttachment = fbo->getFirstNonNullAttachment(); - if (firstAttachment) - { - const auto &size = firstAttachment->getSize(); - if (mViewportBounds.width != size.width || mViewportBounds.height != size.height) - { - mViewportBounds = gl::Extents(size.width, size.height, 1); - invalidateViewport(context); - } - } - } -} - -void StateManager11::invalidateBoundViews() -{ - mCurVertexSRVs.clear(); - mCurPixelSRVs.clear(); - - invalidateRenderTarget(); -} - -void StateManager11::invalidateVertexBuffer() -{ - unsigned int limit = std::min<unsigned int>(mRenderer->getNativeCaps().maxVertexAttributes, - gl::MAX_VERTEX_ATTRIBS); - mDirtyVertexBufferRange = gl::RangeUI(0, limit); - mInputLayoutIsDirty = true; - mInternalDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_ATTRIBS); - invalidateVertexAttributeTranslation(); -} - -void StateManager11::invalidateViewport(const gl::Context *context) -{ - mInternalDirtyBits.set(DIRTY_BIT_VIEWPORT_STATE); - - // Viewport affects the driver constants. - invalidateDriverUniforms(); -} - -void StateManager11::invalidateTexturesAndSamplers() -{ - mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE); - invalidateSwizzles(); - - // Texture state affects the driver uniforms (base level, etc). - invalidateDriverUniforms(); -} - -void StateManager11::invalidateSwizzles() -{ - mDirtySwizzles = true; -} - -void StateManager11::invalidateProgramUniforms() -{ - mInternalDirtyBits.set(DIRTY_BIT_PROGRAM_UNIFORMS); -} - -void StateManager11::invalidateDriverUniforms() -{ - mInternalDirtyBits.set(DIRTY_BIT_DRIVER_UNIFORMS); -} - -void StateManager11::invalidateProgramUniformBuffers() -{ - mInternalDirtyBits.set(DIRTY_BIT_PROGRAM_UNIFORM_BUFFERS); -} - -void StateManager11::invalidateConstantBuffer(unsigned int slot) -{ - if (slot == d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER) - { - invalidateDriverUniforms(); - } - else if (slot == d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK) - { - invalidateProgramUniforms(); - } - else - { - invalidateProgramUniformBuffers(); - } -} - -void StateManager11::invalidateShaders() -{ - mInternalDirtyBits.set(DIRTY_BIT_SHADERS); -} - -void StateManager11::setRenderTarget(ID3D11RenderTargetView *rtv, ID3D11DepthStencilView *dsv) -{ - if ((rtv && unsetConflictingView(rtv)) || (dsv && unsetConflictingView(dsv))) - { - mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE); - } - - mRenderer->getDeviceContext()->OMSetRenderTargets(1, &rtv, dsv); - mInternalDirtyBits.set(DIRTY_BIT_RENDER_TARGET); -} - -void StateManager11::setRenderTargets(ID3D11RenderTargetView **rtvs, - UINT numRTVs, - ID3D11DepthStencilView *dsv) -{ - bool anyDirty = false; - - for (UINT rtvIndex = 0; rtvIndex < numRTVs; ++rtvIndex) - { - anyDirty = anyDirty || unsetConflictingView(rtvs[rtvIndex]); - } - - if (dsv) - { - anyDirty = anyDirty || unsetConflictingView(dsv); - } - - if (anyDirty) - { - mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE); - } - - mRenderer->getDeviceContext()->OMSetRenderTargets(numRTVs, (numRTVs > 0) ? rtvs : nullptr, dsv); - mInternalDirtyBits.set(DIRTY_BIT_RENDER_TARGET); -} - -void StateManager11::invalidateVertexAttributeTranslation() -{ - mVertexAttribsNeedTranslation = true; -} - -void StateManager11::onBeginQuery(Query11 *query) -{ - mCurrentQueries.insert(query); -} - -void StateManager11::onDeleteQueryObject(Query11 *query) -{ - mCurrentQueries.erase(query); -} - -gl::Error StateManager11::onMakeCurrent(const gl::Context *context) -{ - const gl::State &state = context->getGLState(); - - for (Query11 *query : mCurrentQueries) - { - ANGLE_TRY(query->pause()); - } - mCurrentQueries.clear(); - - for (GLenum queryType : QueryTypes) - { - gl::Query *query = state.getActiveQuery(queryType); - if (query != nullptr) - { - Query11 *query11 = GetImplAs<Query11>(query); - ANGLE_TRY(query11->resume()); - mCurrentQueries.insert(query11); - } - } - - return gl::NoError(); -} - -gl::Error StateManager11::clearTextures(gl::SamplerType samplerType, - size_t rangeStart, - size_t rangeEnd) -{ - if (rangeStart == rangeEnd) - { - return gl::NoError(); - } - - auto ¤tSRVs = (samplerType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs); - - gl::Range<size_t> clearRange(rangeStart, std::min(rangeEnd, currentSRVs.highestUsed())); - if (clearRange.empty()) - { - return gl::NoError(); - } - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - if (samplerType == gl::SAMPLER_VERTEX) - { - deviceContext->VSSetShaderResources(static_cast<unsigned int>(clearRange.low()), - static_cast<unsigned int>(clearRange.length()), - &mNullSRVs[0]); - } - else - { - deviceContext->PSSetShaderResources(static_cast<unsigned int>(clearRange.low()), - static_cast<unsigned int>(clearRange.length()), - &mNullSRVs[0]); - } - - for (size_t samplerIndex : clearRange) - { - currentSRVs.update(samplerIndex, nullptr); - } - - return gl::NoError(); -} - -bool StateManager11::unsetConflictingView(ID3D11View *view) -{ - uintptr_t resource = reinterpret_cast<uintptr_t>(GetViewResource(view)); - return unsetConflictingSRVs(gl::SAMPLER_VERTEX, resource, nullptr) || - unsetConflictingSRVs(gl::SAMPLER_PIXEL, resource, nullptr); -} - -bool StateManager11::unsetConflictingSRVs(gl::SamplerType samplerType, - uintptr_t resource, - const gl::ImageIndex *index) -{ - auto ¤tSRVs = (samplerType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs); - - bool foundOne = false; - - for (size_t resourceIndex = 0; resourceIndex < currentSRVs.size(); ++resourceIndex) - { - auto &record = currentSRVs[resourceIndex]; - - if (record.srv && record.resource == resource && - (!index || ImageIndexConflictsWithSRV(*index, record.desc))) - { - setShaderResourceInternal<d3d11::ShaderResourceView>( - samplerType, static_cast<UINT>(resourceIndex), nullptr); - foundOne = true; - } - } - - return foundOne; -} - -void StateManager11::unsetConflictingAttachmentResources( - const gl::FramebufferAttachment *attachment, - ID3D11Resource *resource) -{ - // Unbind render target SRVs from the shader here to prevent D3D11 warnings. - if (attachment->type() == GL_TEXTURE) - { - uintptr_t resourcePtr = reinterpret_cast<uintptr_t>(resource); - const gl::ImageIndex &index = attachment->getTextureImageIndex(); - // The index doesn't need to be corrected for the small compressed texture workaround - // because a rendertarget is never compressed. - unsetConflictingSRVs(gl::SAMPLER_VERTEX, resourcePtr, &index); - unsetConflictingSRVs(gl::SAMPLER_PIXEL, resourcePtr, &index); - } - else if (attachment->type() == GL_FRAMEBUFFER_DEFAULT) - { - uintptr_t resourcePtr = reinterpret_cast<uintptr_t>(resource); - unsetConflictingSRVs(gl::SAMPLER_VERTEX, resourcePtr, nullptr); - unsetConflictingSRVs(gl::SAMPLER_PIXEL, resourcePtr, nullptr); - } -} - -gl::Error StateManager11::initialize(const gl::Caps &caps, const gl::Extensions &extensions) -{ - mCurVertexSRVs.initialize(caps.maxVertexTextureImageUnits); - mCurPixelSRVs.initialize(caps.maxTextureImageUnits); - - // Initialize cached NULL SRV block - mNullSRVs.resize(caps.maxTextureImageUnits, nullptr); - - mCurrentValueAttribs.resize(caps.maxVertexAttributes); - - mForceSetVertexSamplerStates.resize(caps.maxVertexTextureImageUnits, true); - mForceSetPixelSamplerStates.resize(caps.maxTextureImageUnits, true); - mForceSetComputeSamplerStates.resize(caps.maxComputeTextureImageUnits, true); - - mCurVertexSamplerStates.resize(caps.maxVertexTextureImageUnits); - mCurPixelSamplerStates.resize(caps.maxTextureImageUnits); - mCurComputeSamplerStates.resize(caps.maxComputeTextureImageUnits); - - mShaderConstants.init(caps); - - mIsMultiviewEnabled = extensions.multiview; - mViewportOffsets.resize(1u); - - ANGLE_TRY(mVertexDataManager.initialize()); - - mCurrentAttributes.reserve(gl::MAX_VERTEX_ATTRIBS); - - return gl::NoError(); -} - -void StateManager11::deinitialize() -{ - mCurrentValueAttribs.clear(); - mInputLayoutCache.clear(); - mVertexDataManager.deinitialize(); - mIndexDataManager.deinitialize(); - - mDriverConstantBufferVS.reset(); - mDriverConstantBufferPS.reset(); - mDriverConstantBufferCS.reset(); -} - -gl::Error StateManager11::syncFramebuffer(const gl::Context *context, gl::Framebuffer *framebuffer) -{ - Framebuffer11 *framebuffer11 = GetImplAs<Framebuffer11>(framebuffer); - - // Applies the render target surface, depth stencil surface, viewport rectangle and - // scissor rectangle to the renderer - ASSERT(framebuffer && !framebuffer->hasAnyDirtyBit() && framebuffer->cachedComplete()); - - // Check for zero-sized default framebuffer, which is a special case. - // in this case we do not wish to modify any state and just silently return false. - // this will not report any gl error but will cause the calling method to return. - if (framebuffer->id() == 0) - { - ASSERT(!framebuffer11->hasAnyInternalDirtyBit()); - const gl::Extents &size = framebuffer->getFirstColorbuffer()->getSize(); - if (size.width == 0 || size.height == 0) - { - return gl::NoError(); - } - } - - RTVArray framebufferRTVs = {{}}; - - const auto &colorRTs = framebuffer11->getCachedColorRenderTargets(); - - size_t appliedRTIndex = 0; - bool skipInactiveRTs = mRenderer->getWorkarounds().mrtPerfWorkaround; - const auto &drawStates = framebuffer->getDrawBufferStates(); - gl::DrawBufferMask activeProgramOutputs = - context->getContextState().getState().getProgram()->getActiveOutputVariables(); - UINT maxExistingRT = 0; - - for (size_t rtIndex = 0; rtIndex < colorRTs.size(); ++rtIndex) - { - const RenderTarget11 *renderTarget = colorRTs[rtIndex]; - - // Skip inactive rendertargets if the workaround is enabled. - if (skipInactiveRTs && - (!renderTarget || drawStates[rtIndex] == GL_NONE || !activeProgramOutputs[rtIndex])) - { - continue; - } - - if (renderTarget) - { - framebufferRTVs[appliedRTIndex] = renderTarget->getRenderTargetView().get(); - ASSERT(framebufferRTVs[appliedRTIndex]); - maxExistingRT = static_cast<UINT>(appliedRTIndex) + 1; - - // Unset conflicting texture SRVs - const auto *attachment = framebuffer->getColorbuffer(rtIndex); - ASSERT(attachment); - unsetConflictingAttachmentResources(attachment, renderTarget->getTexture().get()); - } - - appliedRTIndex++; - } - - // Get the depth stencil buffers - ID3D11DepthStencilView *framebufferDSV = nullptr; - const auto *depthStencilRenderTarget = framebuffer11->getCachedDepthStencilRenderTarget(); - if (depthStencilRenderTarget) - { - framebufferDSV = depthStencilRenderTarget->getDepthStencilView().get(); - ASSERT(framebufferDSV); - - // Unset conflicting texture SRVs - const auto *attachment = framebuffer->getDepthOrStencilbuffer(); - ASSERT(attachment); - unsetConflictingAttachmentResources(attachment, - depthStencilRenderTarget->getTexture().get()); - } - - // TODO(jmadill): Use context caps? - ASSERT(maxExistingRT <= static_cast<UINT>(mRenderer->getNativeCaps().maxDrawBuffers)); - - // Apply the render target and depth stencil - mRenderer->getDeviceContext()->OMSetRenderTargets(maxExistingRT, framebufferRTVs.data(), - framebufferDSV); - - return gl::NoError(); -} - -void StateManager11::invalidateCurrentValueAttrib(size_t attribIndex) -{ - mDirtyCurrentValueAttribs.set(attribIndex); - mInternalDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_ATTRIBS); -} - -gl::Error StateManager11::syncCurrentValueAttribs(const gl::State &glState) -{ - const auto &activeAttribsMask = glState.getProgram()->getActiveAttribLocationsMask(); - const auto &dirtyActiveAttribs = (activeAttribsMask & mDirtyCurrentValueAttribs); - - if (!dirtyActiveAttribs.any()) - { - return gl::NoError(); - } - - const auto &vertexAttributes = glState.getVertexArray()->getVertexAttributes(); - const auto &vertexBindings = glState.getVertexArray()->getVertexBindings(); - mDirtyCurrentValueAttribs = (mDirtyCurrentValueAttribs & ~dirtyActiveAttribs); - - for (auto attribIndex : dirtyActiveAttribs) - { - if (vertexAttributes[attribIndex].enabled) - continue; - - const auto *attrib = &vertexAttributes[attribIndex]; - const auto ¤tValue = glState.getVertexAttribCurrentValue(attribIndex); - TranslatedAttribute *currentValueAttrib = &mCurrentValueAttribs[attribIndex]; - currentValueAttrib->currentValueType = currentValue.Type; - currentValueAttrib->attribute = attrib; - currentValueAttrib->binding = &vertexBindings[attrib->bindingIndex]; - - mDirtyVertexBufferRange.extend(static_cast<unsigned int>(attribIndex)); - mInputLayoutIsDirty = true; - - ANGLE_TRY(mVertexDataManager.storeCurrentValue(currentValue, currentValueAttrib, - static_cast<size_t>(attribIndex))); - } - - return gl::NoError(); -} - -void StateManager11::setInputLayout(const d3d11::InputLayout *inputLayout) -{ - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - if (inputLayout == nullptr) - { - if (!mCurrentInputLayout.empty()) - { - deviceContext->IASetInputLayout(nullptr); - mCurrentInputLayout.clear(); - mInputLayoutIsDirty = true; - } - } - else if (inputLayout->getSerial() != mCurrentInputLayout) - { - deviceContext->IASetInputLayout(inputLayout->get()); - mCurrentInputLayout = inputLayout->getSerial(); - mInputLayoutIsDirty = true; - } -} - -bool StateManager11::queueVertexBufferChange(size_t bufferIndex, - ID3D11Buffer *buffer, - UINT stride, - UINT offset) -{ - if (buffer != mCurrentVertexBuffers[bufferIndex] || - stride != mCurrentVertexStrides[bufferIndex] || - offset != mCurrentVertexOffsets[bufferIndex]) - { - mInputLayoutIsDirty = true; - mDirtyVertexBufferRange.extend(static_cast<unsigned int>(bufferIndex)); - - mCurrentVertexBuffers[bufferIndex] = buffer; - mCurrentVertexStrides[bufferIndex] = stride; - mCurrentVertexOffsets[bufferIndex] = offset; - return true; - } - - return false; -} - -bool StateManager11::queueVertexOffsetChange(size_t bufferIndex, UINT offsetOnly) -{ - if (offsetOnly != mCurrentVertexOffsets[bufferIndex]) - { - mInputLayoutIsDirty = true; - mDirtyVertexBufferRange.extend(static_cast<unsigned int>(bufferIndex)); - mCurrentVertexOffsets[bufferIndex] = offsetOnly; - return true; - } - return false; -} - -void StateManager11::applyVertexBufferChanges() -{ - if (mDirtyVertexBufferRange.empty()) - { - return; - } - - ASSERT(mDirtyVertexBufferRange.high() <= gl::MAX_VERTEX_ATTRIBS); - - UINT start = static_cast<UINT>(mDirtyVertexBufferRange.low()); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - deviceContext->IASetVertexBuffers(start, static_cast<UINT>(mDirtyVertexBufferRange.length()), - &mCurrentVertexBuffers[start], &mCurrentVertexStrides[start], - &mCurrentVertexOffsets[start]); - - mDirtyVertexBufferRange = gl::RangeUI(gl::MAX_VERTEX_ATTRIBS, 0); -} - -void StateManager11::setSingleVertexBuffer(const d3d11::Buffer *buffer, UINT stride, UINT offset) -{ - ID3D11Buffer *native = buffer ? buffer->get() : nullptr; - if (queueVertexBufferChange(0, native, stride, offset)) - { - applyVertexBufferChanges(); - } -} - -gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMode) -{ - const auto &glState = context->getGLState(); - auto *programD3D = GetImplAs<ProgramD3D>(glState.getProgram()); - - // TODO(jmadill): Use dirty bits. - processFramebufferInvalidation(context); - - // TODO(jmadill): Use dirty bits. - if (programD3D->updateSamplerMapping() == ProgramD3D::SamplerMapping::WasDirty) - { - invalidateTexturesAndSamplers(); - } - - // TODO(jmadill): Use dirty bits. - if (programD3D->areVertexUniformsDirty() || programD3D->areFragmentUniformsDirty()) - { - mInternalDirtyBits.set(DIRTY_BIT_PROGRAM_UNIFORMS); - } - - // Transform feedback affects the stream-out geometry shader. - // TODO(jmadill): Use dirty bits. - if (glState.isTransformFeedbackActiveUnpaused() != mIsTransformFeedbackCurrentlyActiveUnpaused) - { - mIsTransformFeedbackCurrentlyActiveUnpaused = glState.isTransformFeedbackActiveUnpaused(); - invalidateShaders(); - } - - // Swizzling can cause internal state changes with blit shaders. - if (mDirtySwizzles) - { - ANGLE_TRY(generateSwizzles(context)); - mDirtySwizzles = false; - } - - gl::Framebuffer *framebuffer = glState.getDrawFramebuffer(); - Framebuffer11 *framebuffer11 = GetImplAs<Framebuffer11>(framebuffer); - ANGLE_TRY(framebuffer11->markAttachmentsDirty(context)); - - if (framebuffer11->hasAnyInternalDirtyBit()) - { - ASSERT(framebuffer->id() != 0); - framebuffer11->syncInternalState(context); - } - - bool pointDrawMode = (drawMode == GL_POINTS); - if (pointDrawMode != mCurRasterState.pointDrawMode) - { - mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE); - - // Changing from points to not points (or vice-versa) affects the geometry shader. - invalidateShaders(); - } - - // TODO(jiawei.shao@intel.com): This can be recomputed only on framebuffer or multisample mask - // state changes. - RenderTarget11 *firstRT = framebuffer11->getFirstRenderTarget(); - int samples = (firstRT ? firstRT->getSamples() : 0); - unsigned int sampleMask = GetBlendSampleMask(glState, samples); - if (sampleMask != mCurSampleMask) - { - mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); - } - - // Changing the vertex attribute state can affect the vertex shader. - gl::VertexArray *vao = glState.getVertexArray(); - VertexArray11 *vao11 = GetImplAs<VertexArray11>(vao); - if (vao11->flushAttribUpdates(context)) - { - mInternalDirtyBits.set(DIRTY_BIT_SHADERS); - } - - auto dirtyBitsCopy = mInternalDirtyBits; - mInternalDirtyBits.reset(); - - for (auto dirtyBit : dirtyBitsCopy) - { - switch (dirtyBit) - { - case DIRTY_BIT_RENDER_TARGET: - ANGLE_TRY(syncFramebuffer(context, framebuffer)); - break; - case DIRTY_BIT_VIEWPORT_STATE: - syncViewport(context); - break; - case DIRTY_BIT_SCISSOR_STATE: - syncScissorRectangle(glState.getScissor(), glState.isScissorTestEnabled()); - break; - case DIRTY_BIT_RASTERIZER_STATE: - ANGLE_TRY(syncRasterizerState(context, pointDrawMode)); - break; - case DIRTY_BIT_BLEND_STATE: - ANGLE_TRY(syncBlendState(context, framebuffer, glState.getBlendState(), - glState.getBlendColor(), sampleMask)); - break; - case DIRTY_BIT_DEPTH_STENCIL_STATE: - ANGLE_TRY(syncDepthStencilState(glState)); - break; - case DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE: - // TODO(jmadill): More fine-grained update. - ANGLE_TRY(syncTextures(context)); - break; - case DIRTY_BIT_PROGRAM_UNIFORMS: - ANGLE_TRY(applyUniforms(programD3D)); - break; - case DIRTY_BIT_DRIVER_UNIFORMS: - // This must happen after viewport sync; the viewport affects builtin uniforms. - ANGLE_TRY(applyDriverUniforms(*programD3D)); - break; - case DIRTY_BIT_PROGRAM_UNIFORM_BUFFERS: - ANGLE_TRY(syncUniformBuffers(context, programD3D)); - break; - case DIRTY_BIT_SHADERS: - ANGLE_TRY(syncProgram(context, drawMode)); - break; - case DIRTY_BIT_CURRENT_VALUE_ATTRIBS: - ANGLE_TRY(syncCurrentValueAttribs(glState)); - break; - default: - UNREACHABLE(); - break; - } - } - - ANGLE_TRY(syncTransformFeedbackBuffers(context)); - - // Check that we haven't set any dirty bits in the flushing of the dirty bits loop. - ASSERT(mInternalDirtyBits.none()); - - return gl::NoError(); -} - -void StateManager11::setShaderResourceShared(gl::SamplerType shaderType, - UINT resourceSlot, - const d3d11::SharedSRV *srv) -{ - setShaderResourceInternal(shaderType, resourceSlot, srv); - - // TODO(jmadill): Narrower dirty region. - mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE); -} - -void StateManager11::setShaderResource(gl::SamplerType shaderType, - UINT resourceSlot, - const d3d11::ShaderResourceView *srv) -{ - setShaderResourceInternal(shaderType, resourceSlot, srv); - - // TODO(jmadill): Narrower dirty region. - mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE); -} - -void StateManager11::setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY primitiveTopology) -{ - if (primitiveTopology != mCurrentPrimitiveTopology) - { - mRenderer->getDeviceContext()->IASetPrimitiveTopology(primitiveTopology); - mCurrentPrimitiveTopology = primitiveTopology; - } -} - -void StateManager11::setDrawShaders(const d3d11::VertexShader *vertexShader, - const d3d11::GeometryShader *geometryShader, - const d3d11::PixelShader *pixelShader) -{ - setVertexShader(vertexShader); - setGeometryShader(geometryShader); - setPixelShader(pixelShader); -} - -void StateManager11::setVertexShader(const d3d11::VertexShader *shader) -{ - ResourceSerial serial = shader ? shader->getSerial() : ResourceSerial(0); - - if (serial != mAppliedVertexShader) - { - ID3D11VertexShader *appliedShader = shader ? shader->get() : nullptr; - mRenderer->getDeviceContext()->VSSetShader(appliedShader, nullptr, 0); - mAppliedVertexShader = serial; - invalidateShaders(); - } -} - -void StateManager11::setGeometryShader(const d3d11::GeometryShader *shader) -{ - ResourceSerial serial = shader ? shader->getSerial() : ResourceSerial(0); - - if (serial != mAppliedGeometryShader) - { - ID3D11GeometryShader *appliedShader = shader ? shader->get() : nullptr; - mRenderer->getDeviceContext()->GSSetShader(appliedShader, nullptr, 0); - mAppliedGeometryShader = serial; - invalidateShaders(); - } -} - -void StateManager11::setPixelShader(const d3d11::PixelShader *shader) -{ - ResourceSerial serial = shader ? shader->getSerial() : ResourceSerial(0); - - if (serial != mAppliedPixelShader) - { - ID3D11PixelShader *appliedShader = shader ? shader->get() : nullptr; - mRenderer->getDeviceContext()->PSSetShader(appliedShader, nullptr, 0); - mAppliedPixelShader = serial; - invalidateShaders(); - } -} - -void StateManager11::setComputeShader(const d3d11::ComputeShader *shader) -{ - ResourceSerial serial = shader ? shader->getSerial() : ResourceSerial(0); - - if (serial != mAppliedComputeShader) - { - ID3D11ComputeShader *appliedShader = shader ? shader->get() : nullptr; - mRenderer->getDeviceContext()->CSSetShader(appliedShader, nullptr, 0); - mAppliedComputeShader = serial; - // TODO(jmadill): Dirty bits for compute. - } -} - -void StateManager11::setVertexConstantBuffer(unsigned int slot, const d3d11::Buffer *buffer) -{ - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - auto ¤tSerial = mCurrentConstantBufferVS[slot]; - - mCurrentConstantBufferVSOffset[slot] = 0; - mCurrentConstantBufferVSSize[slot] = 0; - - if (buffer) - { - if (currentSerial != buffer->getSerial()) - { - deviceContext->VSSetConstantBuffers(slot, 1, buffer->getPointer()); - currentSerial = buffer->getSerial(); - invalidateConstantBuffer(slot); - } - } - else - { - if (!currentSerial.empty()) - { - ID3D11Buffer *nullBuffer = nullptr; - deviceContext->VSSetConstantBuffers(slot, 1, &nullBuffer); - currentSerial.clear(); - invalidateConstantBuffer(slot); - } - } -} - -void StateManager11::setPixelConstantBuffer(unsigned int slot, const d3d11::Buffer *buffer) -{ - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - auto ¤tSerial = mCurrentConstantBufferPS[slot]; - - mCurrentConstantBufferPSOffset[slot] = 0; - mCurrentConstantBufferPSSize[slot] = 0; - - if (buffer) - { - if (currentSerial != buffer->getSerial()) - { - deviceContext->PSSetConstantBuffers(slot, 1, buffer->getPointer()); - currentSerial = buffer->getSerial(); - invalidateConstantBuffer(slot); - } - } - else - { - if (!currentSerial.empty()) - { - ID3D11Buffer *nullBuffer = nullptr; - deviceContext->PSSetConstantBuffers(slot, 1, &nullBuffer); - currentSerial.clear(); - invalidateConstantBuffer(slot); - } - } -} - -void StateManager11::setDepthStencilState(const d3d11::DepthStencilState *depthStencilState, - UINT stencilRef) -{ - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - if (depthStencilState) - { - deviceContext->OMSetDepthStencilState(depthStencilState->get(), stencilRef); - } - else - { - deviceContext->OMSetDepthStencilState(nullptr, stencilRef); - } - - mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE); -} - -void StateManager11::setSimpleBlendState(const d3d11::BlendState *blendState) -{ - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - if (blendState) - { - deviceContext->OMSetBlendState(blendState->get(), nullptr, 0xFFFFFFFF); - } - else - { - deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFFF); - } - - mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); -} - -void StateManager11::setRasterizerState(const d3d11::RasterizerState *rasterizerState) -{ - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - if (rasterizerState) - { - deviceContext->RSSetState(rasterizerState->get()); - } - else - { - deviceContext->RSSetState(nullptr); - } - - mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE); -} - -void StateManager11::setSimpleViewport(const gl::Extents &extents) -{ - setSimpleViewport(extents.width, extents.height); -} - -void StateManager11::setSimpleViewport(int width, int height) -{ - D3D11_VIEWPORT viewport; - viewport.TopLeftX = 0; - viewport.TopLeftY = 0; - viewport.Width = static_cast<FLOAT>(width); - viewport.Height = static_cast<FLOAT>(height); - viewport.MinDepth = 0.0f; - viewport.MaxDepth = 1.0f; - - mRenderer->getDeviceContext()->RSSetViewports(1, &viewport); - mInternalDirtyBits.set(DIRTY_BIT_VIEWPORT_STATE); -} - -void StateManager11::setSimplePixelTextureAndSampler(const d3d11::SharedSRV &srv, - const d3d11::SamplerState &samplerState) -{ - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - setShaderResourceInternal(gl::SAMPLER_PIXEL, 0, &srv); - deviceContext->PSSetSamplers(0, 1, samplerState.getPointer()); - - mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE); - mForceSetPixelSamplerStates[0] = true; -} - -void StateManager11::setSimpleScissorRect(const gl::Rectangle &glRect) -{ - D3D11_RECT scissorRect; - scissorRect.left = glRect.x; - scissorRect.right = glRect.x + glRect.width; - scissorRect.top = glRect.y; - scissorRect.bottom = glRect.y + glRect.height; - setScissorRectD3D(scissorRect); -} - -void StateManager11::setScissorRectD3D(const D3D11_RECT &d3dRect) -{ - mRenderer->getDeviceContext()->RSSetScissorRects(1, &d3dRect); - mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE); -} - -// For each Direct3D sampler of either the pixel or vertex stage, -// looks up the corresponding OpenGL texture image unit and texture type, -// and sets the texture and its addressing/filtering state (or NULL when inactive). -// Sampler mapping needs to be up-to-date on the program object before this is called. -gl::Error StateManager11::applyTextures(const gl::Context *context, gl::SamplerType shaderType) -{ - const auto &glState = context->getGLState(); - const auto &caps = context->getCaps(); - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram()); - - ASSERT(!programD3D->isSamplerMappingDirty()); - - // TODO(jmadill): Use the Program's sampler bindings. - const auto &completeTextures = glState.getCompleteTextureCache(); - - unsigned int samplerRange = programD3D->getUsedSamplerRange(shaderType); - for (unsigned int samplerIndex = 0; samplerIndex < samplerRange; samplerIndex++) - { - GLint textureUnit = programD3D->getSamplerMapping(shaderType, samplerIndex, caps); - ASSERT(textureUnit != -1); - gl::Texture *texture = completeTextures[textureUnit]; - - // A nullptr texture indicates incomplete. - if (texture) - { - gl::Sampler *samplerObject = glState.getSampler(textureUnit); - - const gl::SamplerState &samplerState = - samplerObject ? samplerObject->getSamplerState() : texture->getSamplerState(); - - ANGLE_TRY(setSamplerState(context, shaderType, samplerIndex, texture, samplerState)); - ANGLE_TRY(setTexture(context, shaderType, samplerIndex, texture)); - } - else - { - GLenum textureType = programD3D->getSamplerTextureType(shaderType, samplerIndex); - - // Texture is not sampler complete or it is in use by the framebuffer. Bind the - // incomplete texture. - gl::Texture *incompleteTexture = nullptr; - ANGLE_TRY(mRenderer->getIncompleteTexture(context, textureType, &incompleteTexture)); - ANGLE_TRY(setSamplerState(context, shaderType, samplerIndex, incompleteTexture, - incompleteTexture->getSamplerState())); - ANGLE_TRY(setTexture(context, shaderType, samplerIndex, incompleteTexture)); - } - } - - // Set all the remaining textures to NULL - size_t samplerCount = (shaderType == gl::SAMPLER_PIXEL) ? caps.maxTextureImageUnits - : caps.maxVertexTextureImageUnits; - ANGLE_TRY(clearTextures(shaderType, samplerRange, samplerCount)); - - return gl::NoError(); -} - -gl::Error StateManager11::syncTextures(const gl::Context *context) -{ - ANGLE_TRY(applyTextures(context, gl::SAMPLER_VERTEX)); - ANGLE_TRY(applyTextures(context, gl::SAMPLER_PIXEL)); - return gl::NoError(); -} - -gl::Error StateManager11::setSamplerState(const gl::Context *context, - gl::SamplerType type, - int index, - gl::Texture *texture, - const gl::SamplerState &samplerState) -{ -#if !defined(NDEBUG) - // Storage should exist, texture should be complete. Only verified in Debug. - TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture); - TextureStorage *storage = nullptr; - ANGLE_TRY(textureD3D->getNativeTexture(context, &storage)); - ASSERT(storage); -#endif // !defined(NDEBUG) - - auto *deviceContext = mRenderer->getDeviceContext(); - - if (type == gl::SAMPLER_PIXEL) - { - ASSERT(static_cast<unsigned int>(index) < mRenderer->getNativeCaps().maxTextureImageUnits); - - if (mForceSetPixelSamplerStates[index] || - memcmp(&samplerState, &mCurPixelSamplerStates[index], sizeof(gl::SamplerState)) != 0) - { - ID3D11SamplerState *dxSamplerState = nullptr; - ANGLE_TRY(mRenderer->getSamplerState(samplerState, &dxSamplerState)); - - ASSERT(dxSamplerState != nullptr); - deviceContext->PSSetSamplers(index, 1, &dxSamplerState); - - mCurPixelSamplerStates[index] = samplerState; - } - - mForceSetPixelSamplerStates[index] = false; - } - else if (type == gl::SAMPLER_VERTEX) - { - ASSERT(static_cast<unsigned int>(index) < - mRenderer->getNativeCaps().maxVertexTextureImageUnits); - - if (mForceSetVertexSamplerStates[index] || - memcmp(&samplerState, &mCurVertexSamplerStates[index], sizeof(gl::SamplerState)) != 0) - { - ID3D11SamplerState *dxSamplerState = nullptr; - ANGLE_TRY(mRenderer->getSamplerState(samplerState, &dxSamplerState)); - - ASSERT(dxSamplerState != nullptr); - deviceContext->VSSetSamplers(index, 1, &dxSamplerState); - - mCurVertexSamplerStates[index] = samplerState; - } - - mForceSetVertexSamplerStates[index] = false; - } - else if (type == gl::SAMPLER_COMPUTE) - { - ASSERT(static_cast<unsigned int>(index) < - mRenderer->getNativeCaps().maxComputeTextureImageUnits); - - if (mForceSetComputeSamplerStates[index] || - memcmp(&samplerState, &mCurComputeSamplerStates[index], sizeof(gl::SamplerState)) != 0) - { - ID3D11SamplerState *dxSamplerState = nullptr; - ANGLE_TRY(mRenderer->getSamplerState(samplerState, &dxSamplerState)); - - ASSERT(dxSamplerState != nullptr); - deviceContext->CSSetSamplers(index, 1, &dxSamplerState); - - mCurComputeSamplerStates[index] = samplerState; - } - - mForceSetComputeSamplerStates[index] = false; - } - else - UNREACHABLE(); - - // Sampler metadata that's passed to shaders in uniforms is stored separately from rest of the - // sampler state since having it in contiguous memory makes it possible to memcpy to a constant - // buffer, and it doesn't affect the state set by PSSetSamplers/VSSetSamplers. - mShaderConstants.onSamplerChange(type, index, *texture); - - return gl::NoError(); -} - -gl::Error StateManager11::setTexture(const gl::Context *context, - gl::SamplerType type, - int index, - gl::Texture *texture) -{ - const d3d11::SharedSRV *textureSRV = nullptr; - - if (texture) - { - TextureD3D *textureImpl = GetImplAs<TextureD3D>(texture); - - TextureStorage *texStorage = nullptr; - ANGLE_TRY(textureImpl->getNativeTexture(context, &texStorage)); - - // Texture should be complete and have a storage - ASSERT(texStorage); - - TextureStorage11 *storage11 = GetAs<TextureStorage11>(texStorage); - - ANGLE_TRY(storage11->getSRV(context, texture->getTextureState(), &textureSRV)); - - // If we get an invalid SRV here, something went wrong in the texture class and we're - // unexpectedly missing the shader resource view. - ASSERT(textureSRV->valid()); - - textureImpl->resetDirty(); - } - - ASSERT( - (type == gl::SAMPLER_PIXEL && - static_cast<unsigned int>(index) < mRenderer->getNativeCaps().maxTextureImageUnits) || - (type == gl::SAMPLER_VERTEX && - static_cast<unsigned int>(index) < mRenderer->getNativeCaps().maxVertexTextureImageUnits)); - - setShaderResourceInternal(type, index, textureSRV); - return gl::NoError(); -} - -// Things that affect a program's dirtyness: -// 1. Directly changing the program executable -> triggered in StateManager11::syncState. -// 2. The vertex attribute layout -> triggered in VertexArray11::syncState/signal. -// 3. The fragment shader's rendertargets -> triggered in Framebuffer11::syncState/signal. -// 4. Enabling/disabling rasterizer discard. -> triggered in StateManager11::syncState. -// 5. Enabling/disabling transform feedback. -> checked in StateManager11::updateState. -// 6. An internal shader was used. -> triggered in StateManager11::set*Shader. -// 7. Drawing with/without point sprites. -> checked in StateManager11::updateState. -// TODO(jmadill): Use dirty bits for transform feedback. -gl::Error StateManager11::syncProgram(const gl::Context *context, GLenum drawMode) -{ - Context11 *context11 = GetImplAs<Context11>(context); - ANGLE_TRY(context11->triggerDrawCallProgramRecompilation(context, drawMode)); - - const auto &glState = context->getGLState(); - const auto *va11 = GetImplAs<VertexArray11>(glState.getVertexArray()); - auto *programD3D = GetImplAs<ProgramD3D>(glState.getProgram()); - - programD3D->updateCachedInputLayout(va11->getCurrentStateSerial(), glState); - - // Binaries must be compiled before the sync. - ASSERT(programD3D->hasVertexExecutableForCachedInputLayout()); - ASSERT(programD3D->hasGeometryExecutableForPrimitiveType(drawMode)); - ASSERT(programD3D->hasPixelExecutableForCachedOutputLayout()); - - ShaderExecutableD3D *vertexExe = nullptr; - ANGLE_TRY(programD3D->getVertexExecutableForCachedInputLayout(&vertexExe, nullptr)); - - ShaderExecutableD3D *pixelExe = nullptr; - ANGLE_TRY(programD3D->getPixelExecutableForCachedOutputLayout(&pixelExe, nullptr)); - - ShaderExecutableD3D *geometryExe = nullptr; - ANGLE_TRY(programD3D->getGeometryExecutableForPrimitiveType(context, drawMode, &geometryExe, - nullptr)); - - const d3d11::VertexShader *vertexShader = - (vertexExe ? &GetAs<ShaderExecutable11>(vertexExe)->getVertexShader() : nullptr); - - // Skip pixel shader if we're doing rasterizer discard. - const d3d11::PixelShader *pixelShader = nullptr; - if (!glState.getRasterizerState().rasterizerDiscard) - { - pixelShader = (pixelExe ? &GetAs<ShaderExecutable11>(pixelExe)->getPixelShader() : nullptr); - } - - const d3d11::GeometryShader *geometryShader = nullptr; - if (glState.isTransformFeedbackActiveUnpaused()) - { - geometryShader = - (vertexExe ? &GetAs<ShaderExecutable11>(vertexExe)->getStreamOutShader() : nullptr); - } - else - { - geometryShader = - (geometryExe ? &GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader() : nullptr); - } - - setDrawShaders(vertexShader, geometryShader, pixelShader); - - // Explicitly clear the shaders dirty bit. - mInternalDirtyBits.reset(DIRTY_BIT_SHADERS); - - return gl::NoError(); -} - -gl::Error StateManager11::applyVertexBuffer(const gl::Context *context, - GLenum mode, - const DrawCallVertexParams &vertexParams, - bool isIndexedRendering) -{ - const auto &state = context->getGLState(); - const gl::VertexArray *vertexArray = state.getVertexArray(); - VertexArray11 *vertexArray11 = GetImplAs<VertexArray11>(vertexArray); - - if (mVertexAttribsNeedTranslation) - { - ANGLE_TRY(vertexArray11->updateDirtyAndDynamicAttribs(context, &mVertexDataManager, - vertexParams)); - mInputLayoutIsDirty = true; - - // Determine if we need to update attribs on the next draw. - mVertexAttribsNeedTranslation = (vertexArray11->hasActiveDynamicAttrib(context)); - } - - if (!mLastFirstVertex.valid() || mLastFirstVertex.value() != vertexParams.firstVertex()) - { - mLastFirstVertex = vertexParams.firstVertex(); - mInputLayoutIsDirty = true; - } - - if (!mInputLayoutIsDirty) - { - return gl::NoError(); - } - - const auto &vertexArrayAttribs = vertexArray11->getTranslatedAttribs(); - gl::Program *program = state.getProgram(); - - // Sort the attributes according to ensure we re-use similar input layouts. - AttribIndexArray sortedSemanticIndices; - SortAttributesByLayout(program, vertexArrayAttribs, mCurrentValueAttribs, - &sortedSemanticIndices, &mCurrentAttributes); - - auto featureLevel = mRenderer->getRenderer11DeviceCaps().featureLevel; - - // If we are using FL 9_3, make sure the first attribute is not instanced - if (featureLevel <= D3D_FEATURE_LEVEL_9_3 && !mCurrentAttributes.empty()) - { - if (mCurrentAttributes[0]->divisor > 0) - { - Optional<size_t> firstNonInstancedIndex = FindFirstNonInstanced(mCurrentAttributes); - if (firstNonInstancedIndex.valid()) - { - size_t index = firstNonInstancedIndex.value(); - std::swap(mCurrentAttributes[0], mCurrentAttributes[index]); - std::swap(sortedSemanticIndices[0], sortedSemanticIndices[index]); - } - } - } - - // Update the applied input layout by querying the cache. - ANGLE_TRY(mInputLayoutCache.updateInputLayout(mRenderer, state, mCurrentAttributes, mode, - sortedSemanticIndices, vertexParams)); - - // Update the applied vertex buffers. - ANGLE_TRY(mInputLayoutCache.applyVertexBuffers(context, mCurrentAttributes, mode, - vertexParams.firstVertex(), isIndexedRendering)); - - // InputLayoutCache::applyVertexBuffers calls through to the Bufer11 to get the native vertex - // buffer (ID3D11Buffer *). Because we allocate these buffers lazily, this will trigger - // allocation. This in turn will signal that the buffer is dirty. Since we just resolved the - // dirty-ness in VertexArray11::updateDirtyAndDynamicAttribs, this can make us do a needless - // update on the second draw call. - // Hence we clear the flags here, after we've applied vertex data, since we know everything - // is clean. This is a bit of a hack. - vertexArray11->clearDirtyAndPromoteDynamicAttribs(context, vertexParams); - - mInputLayoutIsDirty = false; - return gl::NoError(); -} - -gl::Error StateManager11::applyIndexBuffer(const gl::Context *context, - const void *indices, - GLsizei count, - GLenum type, - const gl::HasIndexRange &lazyIndexRange, - bool usePrimitiveRestartWorkaround) -{ - const auto &glState = context->getGLState(); - gl::VertexArray *vao = glState.getVertexArray(); - VertexArray11 *vao11 = GetImplAs<VertexArray11>(vao); - - GLenum destElementType = - GetIndexTranslationDestType(type, lazyIndexRange, usePrimitiveRestartWorkaround); - - if (!vao11->updateElementArrayStorage(context, type, destElementType, indices) && - !mIndexBufferIsDirty) - { - // No streaming or index buffer application necessary. - return gl::NoError(); - } - - gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get(); - - TranslatedIndexData *indexInfo = vao11->getCachedIndexInfo(); - ANGLE_TRY(mIndexDataManager.prepareIndexData(context, type, destElementType, count, - elementArrayBuffer, indices, indexInfo)); - - ID3D11Buffer *buffer = nullptr; - DXGI_FORMAT bufferFormat = - (indexInfo->indexType == GL_UNSIGNED_INT) ? DXGI_FORMAT_R32_UINT : DXGI_FORMAT_R16_UINT; - - if (indexInfo->storage) - { - Buffer11 *storage = GetAs<Buffer11>(indexInfo->storage); - ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_INDEX), buffer); - } - else - { - IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(indexInfo->indexBuffer); - buffer = indexBuffer->getBuffer().get(); - } - - // Track dirty indices in the index range cache. - indexInfo->srcIndexData.srcIndicesChanged = - syncIndexBuffer(buffer, bufferFormat, indexInfo->startOffset); - - mIndexBufferIsDirty = false; - - vao11->setCachedIndexInfoValid(); - return gl::NoError(); -} - -void StateManager11::setIndexBuffer(ID3D11Buffer *buffer, - DXGI_FORMAT indexFormat, - unsigned int offset) -{ - if (syncIndexBuffer(buffer, indexFormat, offset)) - { - mIndexBufferIsDirty = true; - } -} - -bool StateManager11::syncIndexBuffer(ID3D11Buffer *buffer, - DXGI_FORMAT indexFormat, - unsigned int offset) -{ - if (buffer != mAppliedIB || indexFormat != mAppliedIBFormat || offset != mAppliedIBOffset) - { - mRenderer->getDeviceContext()->IASetIndexBuffer(buffer, indexFormat, offset); - - mAppliedIB = buffer; - mAppliedIBFormat = indexFormat; - mAppliedIBOffset = offset; - return true; - } - - return false; -} - -// Vertex buffer is invalidated outside this function. -gl::Error StateManager11::updateVertexOffsetsForPointSpritesEmulation(GLint startVertex, - GLsizei emulatedInstanceId) -{ - return mInputLayoutCache.updateVertexOffsetsForPointSpritesEmulation( - mRenderer, mCurrentAttributes, startVertex, emulatedInstanceId); -} - -gl::Error StateManager11::generateSwizzle(const gl::Context *context, gl::Texture *texture) -{ - if (!texture) - { - return gl::NoError(); - } - - TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture); - ASSERT(textureD3D); - - TextureStorage *texStorage = nullptr; - ANGLE_TRY(textureD3D->getNativeTexture(context, &texStorage)); - - if (texStorage) - { - TextureStorage11 *storage11 = GetAs<TextureStorage11>(texStorage); - const gl::TextureState &textureState = texture->getTextureState(); - ANGLE_TRY(storage11->generateSwizzles(context, textureState.getSwizzleState())); - } - - return gl::NoError(); -} - -gl::Error StateManager11::generateSwizzlesForShader(const gl::Context *context, - gl::SamplerType type) -{ - const auto &glState = context->getGLState(); - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram()); - - unsigned int samplerRange = programD3D->getUsedSamplerRange(type); - - for (unsigned int i = 0; i < samplerRange; i++) - { - GLenum textureType = programD3D->getSamplerTextureType(type, i); - GLint textureUnit = programD3D->getSamplerMapping(type, i, context->getCaps()); - if (textureUnit != -1) - { - gl::Texture *texture = glState.getSamplerTexture(textureUnit, textureType); - ASSERT(texture); - if (texture->getTextureState().swizzleRequired()) - { - ANGLE_TRY(generateSwizzle(context, texture)); - } - } - } - - return gl::NoError(); -} - -gl::Error StateManager11::generateSwizzles(const gl::Context *context) -{ - ANGLE_TRY(generateSwizzlesForShader(context, gl::SAMPLER_VERTEX)); - ANGLE_TRY(generateSwizzlesForShader(context, gl::SAMPLER_PIXEL)); - return gl::NoError(); -} - -gl::Error StateManager11::applyUniforms(ProgramD3D *programD3D) -{ - UniformStorage11 *vertexUniformStorage = - GetAs<UniformStorage11>(&programD3D->getVertexUniformStorage()); - UniformStorage11 *fragmentUniformStorage = - GetAs<UniformStorage11>(&programD3D->getFragmentUniformStorage()); - ASSERT(vertexUniformStorage); - ASSERT(fragmentUniformStorage); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - const d3d11::Buffer *vertexConstantBuffer = nullptr; - ANGLE_TRY(vertexUniformStorage->getConstantBuffer(mRenderer, &vertexConstantBuffer)); - const d3d11::Buffer *pixelConstantBuffer = nullptr; - ANGLE_TRY(fragmentUniformStorage->getConstantBuffer(mRenderer, &pixelConstantBuffer)); - - if (vertexUniformStorage->size() > 0 && programD3D->areVertexUniformsDirty()) - { - UpdateUniformBuffer(deviceContext, vertexUniformStorage, vertexConstantBuffer); - } - - if (fragmentUniformStorage->size() > 0 && programD3D->areFragmentUniformsDirty()) - { - UpdateUniformBuffer(deviceContext, fragmentUniformStorage, pixelConstantBuffer); - } - - unsigned int slot = d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK; - - if (mCurrentConstantBufferVS[slot] != vertexConstantBuffer->getSerial()) - { - deviceContext->VSSetConstantBuffers(slot, 1, vertexConstantBuffer->getPointer()); - mCurrentConstantBufferVS[slot] = vertexConstantBuffer->getSerial(); - mCurrentConstantBufferVSOffset[slot] = 0; - mCurrentConstantBufferVSSize[slot] = 0; - } - - if (mCurrentConstantBufferPS[slot] != pixelConstantBuffer->getSerial()) - { - deviceContext->PSSetConstantBuffers(slot, 1, pixelConstantBuffer->getPointer()); - mCurrentConstantBufferPS[slot] = pixelConstantBuffer->getSerial(); - mCurrentConstantBufferPSOffset[slot] = 0; - mCurrentConstantBufferPSSize[slot] = 0; - } - - programD3D->markUniformsClean(); - - return gl::NoError(); -} - -gl::Error StateManager11::applyDriverUniforms(const ProgramD3D &programD3D) -{ - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - if (!mDriverConstantBufferVS.valid()) - { - size_t requiredSize = mShaderConstants.getRequiredBufferSize(gl::SAMPLER_VERTEX); - - D3D11_BUFFER_DESC constantBufferDescription = {0}; - d3d11::InitConstantBufferDesc(&constantBufferDescription, requiredSize); - ANGLE_TRY(mRenderer->allocateResource(constantBufferDescription, &mDriverConstantBufferVS)); - - ID3D11Buffer *driverVSConstants = mDriverConstantBufferVS.get(); - deviceContext->VSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1, - &driverVSConstants); - } - - if (!mDriverConstantBufferPS.valid()) - { - size_t requiredSize = mShaderConstants.getRequiredBufferSize(gl::SAMPLER_PIXEL); - - D3D11_BUFFER_DESC constantBufferDescription = {0}; - d3d11::InitConstantBufferDesc(&constantBufferDescription, requiredSize); - ANGLE_TRY(mRenderer->allocateResource(constantBufferDescription, &mDriverConstantBufferPS)); - - ID3D11Buffer *driverVSConstants = mDriverConstantBufferPS.get(); - deviceContext->PSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1, - &driverVSConstants); - } - - // Sampler metadata and driver constants need to coexist in the same constant buffer to conserve - // constant buffer slots. We update both in the constant buffer if needed. - ANGLE_TRY(mShaderConstants.updateBuffer(deviceContext, gl::SAMPLER_VERTEX, programD3D, - mDriverConstantBufferVS)); - ANGLE_TRY(mShaderConstants.updateBuffer(deviceContext, gl::SAMPLER_PIXEL, programD3D, - mDriverConstantBufferPS)); - - // needed for the point sprite geometry shader - // GSSetConstantBuffers triggers device removal on 9_3, so we should only call it for ES3. - if (mRenderer->isES3Capable()) - { - if (mCurrentGeometryConstantBuffer != mDriverConstantBufferPS.getSerial()) - { - ASSERT(mDriverConstantBufferPS.valid()); - deviceContext->GSSetConstantBuffers(0, 1, mDriverConstantBufferPS.getPointer()); - mCurrentGeometryConstantBuffer = mDriverConstantBufferPS.getSerial(); - } - } - - return gl::NoError(); -} - -gl::Error StateManager11::applyComputeUniforms(ProgramD3D *programD3D) -{ - UniformStorage11 *computeUniformStorage = - GetAs<UniformStorage11>(&programD3D->getComputeUniformStorage()); - ASSERT(computeUniformStorage); - - const d3d11::Buffer *constantBuffer = nullptr; - ANGLE_TRY(computeUniformStorage->getConstantBuffer(mRenderer, &constantBuffer)); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - if (computeUniformStorage->size() > 0 && programD3D->areComputeUniformsDirty()) - { - UpdateUniformBuffer(deviceContext, computeUniformStorage, constantBuffer); - programD3D->markUniformsClean(); - } - - if (mCurrentComputeConstantBuffer != constantBuffer->getSerial()) - { - deviceContext->CSSetConstantBuffers( - d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, - constantBuffer->getPointer()); - mCurrentComputeConstantBuffer = constantBuffer->getSerial(); - } - - if (!mDriverConstantBufferCS.valid()) - { - size_t requiredSize = mShaderConstants.getRequiredBufferSize(gl::SAMPLER_COMPUTE); - - D3D11_BUFFER_DESC constantBufferDescription = {0}; - d3d11::InitConstantBufferDesc(&constantBufferDescription, requiredSize); - ANGLE_TRY(mRenderer->allocateResource(constantBufferDescription, &mDriverConstantBufferCS)); - ID3D11Buffer *buffer = mDriverConstantBufferCS.get(); - deviceContext->CSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1, - &buffer); - } - - ANGLE_TRY(mShaderConstants.updateBuffer(deviceContext, gl::SAMPLER_COMPUTE, *programD3D, - mDriverConstantBufferCS)); - - return gl::NoError(); -} - -gl::Error StateManager11::syncUniformBuffers(const gl::Context *context, ProgramD3D *programD3D) -{ - unsigned int reservedVertex = mRenderer->getReservedVertexUniformBuffers(); - unsigned int reservedFragment = mRenderer->getReservedFragmentUniformBuffers(); - - programD3D->updateUniformBufferCache(context->getCaps(), reservedVertex, reservedFragment); - - const auto &vertexUniformBuffers = programD3D->getVertexUniformBufferCache(); - const auto &fragmentUniformBuffers = programD3D->getFragmentUniformBufferCache(); - const auto &glState = context->getGLState(); - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - ID3D11DeviceContext1 *deviceContext1 = mRenderer->getDeviceContext1IfSupported(); - - for (size_t bufferIndex = 0; bufferIndex < vertexUniformBuffers.size(); bufferIndex++) - { - GLint binding = vertexUniformBuffers[bufferIndex]; - - if (binding == -1) - { - continue; - } - - const auto &uniformBuffer = glState.getIndexedUniformBuffer(binding); - GLintptr uniformBufferOffset = uniformBuffer.getOffset(); - GLsizeiptr uniformBufferSize = uniformBuffer.getSize(); - - if (uniformBuffer.get() == nullptr) - { - continue; - } - - Buffer11 *bufferStorage = GetImplAs<Buffer11>(uniformBuffer.get()); - const d3d11::Buffer *constantBuffer = nullptr; - UINT firstConstant = 0; - UINT numConstants = 0; - - ANGLE_TRY(bufferStorage->getConstantBufferRange(context, uniformBufferOffset, - uniformBufferSize, &constantBuffer, - &firstConstant, &numConstants)); - - ASSERT(constantBuffer); - - if (mCurrentConstantBufferVS[bufferIndex] == constantBuffer->getSerial() && - mCurrentConstantBufferVSOffset[bufferIndex] == uniformBufferOffset && - mCurrentConstantBufferVSSize[bufferIndex] == uniformBufferSize) - { - continue; - } - - unsigned int appliedIndex = reservedVertex + static_cast<unsigned int>(bufferIndex); - - if (firstConstant != 0 && uniformBufferSize != 0) - { - ASSERT(numConstants != 0); - deviceContext1->VSSetConstantBuffers1(appliedIndex, 1, constantBuffer->getPointer(), - &firstConstant, &numConstants); - } - else - { - deviceContext->VSSetConstantBuffers(appliedIndex, 1, constantBuffer->getPointer()); - } - - mCurrentConstantBufferVS[appliedIndex] = constantBuffer->getSerial(); - mCurrentConstantBufferVSOffset[appliedIndex] = uniformBufferOffset; - mCurrentConstantBufferVSSize[appliedIndex] = uniformBufferSize; - } - - for (size_t bufferIndex = 0; bufferIndex < fragmentUniformBuffers.size(); bufferIndex++) - { - GLint binding = fragmentUniformBuffers[bufferIndex]; - - if (binding == -1) - { - continue; - } - - const auto &uniformBuffer = glState.getIndexedUniformBuffer(binding); - GLintptr uniformBufferOffset = uniformBuffer.getOffset(); - GLsizeiptr uniformBufferSize = uniformBuffer.getSize(); - - if (uniformBuffer.get() == nullptr) - { - continue; - } - - Buffer11 *bufferStorage = GetImplAs<Buffer11>(uniformBuffer.get()); - const d3d11::Buffer *constantBuffer = nullptr; - UINT firstConstant = 0; - UINT numConstants = 0; - - ANGLE_TRY(bufferStorage->getConstantBufferRange(context, uniformBufferOffset, - uniformBufferSize, &constantBuffer, - &firstConstant, &numConstants)); - - ASSERT(constantBuffer); - - if (mCurrentConstantBufferPS[bufferIndex] == constantBuffer->getSerial() && - mCurrentConstantBufferPSOffset[bufferIndex] == uniformBufferOffset && - mCurrentConstantBufferPSSize[bufferIndex] == uniformBufferSize) - { - continue; - } - - unsigned int appliedIndex = reservedFragment + static_cast<unsigned int>(bufferIndex); - - if (firstConstant != 0 && uniformBufferSize != 0) - { - deviceContext1->PSSetConstantBuffers1(appliedIndex, 1, constantBuffer->getPointer(), - &firstConstant, &numConstants); - } - else - { - deviceContext->PSSetConstantBuffers(appliedIndex, 1, constantBuffer->getPointer()); - } - - mCurrentConstantBufferPS[appliedIndex] = constantBuffer->getSerial(); - mCurrentConstantBufferPSOffset[appliedIndex] = uniformBufferOffset; - mCurrentConstantBufferPSSize[appliedIndex] = uniformBufferSize; - } - - return gl::NoError(); -} - -gl::Error StateManager11::syncTransformFeedbackBuffers(const gl::Context *context) -{ - const auto &glState = context->getGLState(); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - // If transform feedback is not active, unbind all buffers - if (!glState.isTransformFeedbackActiveUnpaused()) - { - if (mAppliedTFSerial != mEmptySerial) - { - deviceContext->SOSetTargets(0, nullptr, nullptr); - mAppliedTFSerial = mEmptySerial; - } - return gl::NoError(); - } - - gl::TransformFeedback *transformFeedback = glState.getCurrentTransformFeedback(); - TransformFeedback11 *tf11 = GetImplAs<TransformFeedback11>(transformFeedback); - if (mAppliedTFSerial == tf11->getSerial() && !tf11->isDirty()) - { - return gl::NoError(); - } - - const std::vector<ID3D11Buffer *> *soBuffers = nullptr; - ANGLE_TRY_RESULT(tf11->getSOBuffers(context), soBuffers); - const std::vector<UINT> &soOffsets = tf11->getSOBufferOffsets(); - - deviceContext->SOSetTargets(tf11->getNumSOBuffers(), soBuffers->data(), soOffsets.data()); - - mAppliedTFSerial = tf11->getSerial(); - tf11->onApply(); - - return gl::NoError(); -} - -// DrawCallVertexParams implementation. -DrawCallVertexParams::DrawCallVertexParams(GLint firstVertex, - GLsizei vertexCount, - GLsizei instances) - : mHasIndexRange(nullptr), - mFirstVertex(firstVertex), - mVertexCount(vertexCount), - mInstances(instances), - mBaseVertex(0) -{ -} - -// Use when in a drawElements call. -DrawCallVertexParams::DrawCallVertexParams(bool firstVertexDefinitelyZero, - const gl::HasIndexRange &hasIndexRange, - GLint baseVertex, - GLsizei instances) - : mHasIndexRange(&hasIndexRange), - mFirstVertex(), - mVertexCount(0), - mInstances(instances), - mBaseVertex(baseVertex) -{ - if (firstVertexDefinitelyZero) - { - mFirstVertex = baseVertex; - } -} - -GLint DrawCallVertexParams::firstVertex() const -{ - if (!mFirstVertex.valid()) - { - ensureResolved(); - ASSERT(mFirstVertex.valid()); - } - return mFirstVertex.value(); -} - -GLsizei DrawCallVertexParams::vertexCount() const -{ - ensureResolved(); - return mVertexCount; -} - -GLsizei DrawCallVertexParams::instances() const -{ - return mInstances; -} - -void DrawCallVertexParams::ensureResolved() const -{ - if (mHasIndexRange) - { - ASSERT(!mFirstVertex.valid() || mFirstVertex == mBaseVertex); - - // Resolve the index range now if we need to. - const auto &indexRange = mHasIndexRange->getIndexRange().value(); - mFirstVertex = mBaseVertex + static_cast<GLint>(indexRange.start); - mVertexCount = static_cast<GLsizei>(indexRange.vertexCount()); - mHasIndexRange = nullptr; - } -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h deleted file mode 100644 index e48bc83a22..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h +++ /dev/null @@ -1,557 +0,0 @@ -// -// Copyright (c) 2015 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. -// - -// StateManager11.h: Defines a class for caching D3D11 state - -#ifndef LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_ -#define LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_ - -#include <array> - -#include "libANGLE/ContextState.h" -#include "libANGLE/State.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/renderer/d3d/IndexDataManager.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/d3d11/InputLayoutCache.h" -#include "libANGLE/renderer/d3d/d3d11/Query11.h" -#include "libANGLE/renderer/d3d/d3d11/RenderStateCache.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -namespace rx -{ - -struct RenderTargetDesc; -struct Renderer11DeviceCaps; - -class ShaderConstants11 : angle::NonCopyable -{ - public: - ShaderConstants11(); - ~ShaderConstants11(); - - void init(const gl::Caps &caps); - size_t getRequiredBufferSize(gl::SamplerType samplerType) const; - void markDirty(); - - void setComputeWorkGroups(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ); - void setMultiviewWriteToViewportIndex(GLfloat index); - void onViewportChange(const gl::Rectangle &glViewport, - const D3D11_VIEWPORT &dxViewport, - bool is9_3, - bool presentPathFast); - void onSamplerChange(gl::SamplerType samplerType, - unsigned int samplerIndex, - const gl::Texture &texture); - - gl::Error updateBuffer(ID3D11DeviceContext *deviceContext, - gl::SamplerType samplerType, - const ProgramD3D &programD3D, - const d3d11::Buffer &driverConstantBuffer); - - private: - struct Vertex - { - Vertex() - : depthRange{.0f}, - viewAdjust{.0f}, - viewCoords{.0f}, - viewScale{.0f}, - multiviewWriteToViewportIndex{.0f}, - padding{.0f} - { - } - - float depthRange[4]; - float viewAdjust[4]; - float viewCoords[4]; - float viewScale[2]; - // multiviewWriteToViewportIndex is used to select either the side-by-side or layered - // code-path in the GS. It's value, if set, is either 0.0f or 1.0f. The value is updated - // whenever a multi-view draw framebuffer is made active. - float multiviewWriteToViewportIndex; - - // Added here to manually pad the struct. - float padding; - }; - - struct Pixel - { - Pixel() - : depthRange{.0f}, - viewCoords{.0f}, - depthFront{.0f}, - viewScale{.0f}, - multiviewWriteToViewportIndex(0), - padding(0) - { - } - - float depthRange[4]; - float viewCoords[4]; - float depthFront[4]; - float viewScale[2]; - // multiviewWriteToViewportIndex is used to select either the side-by-side or layered - // code-path in the GS. It's value, if set, is either 0.0f or 1.0f. The value is updated - // whenever a multi-view draw framebuffer is made active. - float multiviewWriteToViewportIndex; - - // Added here to manually pad the struct. - float padding; - }; - - struct Compute - { - Compute() : numWorkGroups{0u}, padding(0u) {} - unsigned int numWorkGroups[3]; - unsigned int padding; // This just pads the struct to 16 bytes - }; - - struct SamplerMetadata - { - SamplerMetadata() : baseLevel(0), internalFormatBits(0), wrapModes(0), padding(0) {} - - int baseLevel; - int internalFormatBits; - int wrapModes; - int padding; // This just pads the struct to 16 bytes - }; - - static_assert(sizeof(SamplerMetadata) == 16u, - "Sampler metadata struct must be one 4-vec / 16 bytes."); - - // Return true if dirty. - bool updateSamplerMetadata(SamplerMetadata *data, const gl::Texture &texture); - - Vertex mVertex; - bool mVertexDirty; - Pixel mPixel; - bool mPixelDirty; - Compute mCompute; - bool mComputeDirty; - - std::vector<SamplerMetadata> mSamplerMetadataVS; - bool mSamplerMetadataVSDirty; - std::vector<SamplerMetadata> mSamplerMetadataPS; - bool mSamplerMetadataPSDirty; - std::vector<SamplerMetadata> mSamplerMetadataCS; - bool mSamplerMetadataCSDirty; -}; - -class DrawCallVertexParams final : angle::NonCopyable -{ - public: - // Use when in a drawArrays call. - DrawCallVertexParams(GLint firstVertex, GLsizei vertexCount, GLsizei instances); - - // Use when in a drawElements call. - DrawCallVertexParams(bool firstVertexDefinitelyZero, - const gl::HasIndexRange &hasIndexRange, - GLint baseVertex, - GLsizei instances); - - // It should be possible to also use an overload to handle the 'slow' indirect draw path. - // TODO(jmadill): Indirect draw slow path overload. - - GLint firstVertex() const; - GLsizei vertexCount() const; - GLsizei instances() const; - - private: - void ensureResolved() const; - - mutable const gl::HasIndexRange *mHasIndexRange; - mutable Optional<GLint> mFirstVertex; - mutable GLsizei mVertexCount; - GLsizei mInstances; - GLint mBaseVertex; -}; - -class StateManager11 final : angle::NonCopyable -{ - public: - StateManager11(Renderer11 *renderer); - ~StateManager11(); - - gl::Error initialize(const gl::Caps &caps, const gl::Extensions &extensions); - void deinitialize(); - - void syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits); - - gl::Error updateStateForCompute(const gl::Context *context, - GLuint numGroupsX, - GLuint numGroupsY, - GLuint numGroupsZ); - - void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize); - - // These invalidations methods are called externally. - - // Called from TextureStorage11. - void invalidateBoundViews(); - - // Called from VertexArray11::updateVertexAttribStorage. - void invalidateCurrentValueAttrib(size_t attribIndex); - - // Checks are done on a framebuffer state change to trigger other state changes. - // The Context is allowed to be nullptr for these methods, when called in EGL init code. - void invalidateRenderTarget(); - - // Called by instanced point sprite emulation. - void invalidateVertexBuffer(); - - // Called by Framebuffer11::syncState for the default sized viewport. - void invalidateViewport(const gl::Context *context); - - // Called by TextureStorage11::markLevelDirty. - void invalidateSwizzles(); - - // Called by the Framebuffer11 and VertexArray11. - void invalidateShaders(); - - // Called by VertexArray11 to trigger attribute translation. - void invalidateVertexAttributeTranslation(); - - void setRenderTarget(ID3D11RenderTargetView *rtv, ID3D11DepthStencilView *dsv); - void setRenderTargets(ID3D11RenderTargetView **rtvs, UINT numRtvs, ID3D11DepthStencilView *dsv); - - void onBeginQuery(Query11 *query); - void onDeleteQueryObject(Query11 *query); - gl::Error onMakeCurrent(const gl::Context *context); - - void setInputLayout(const d3d11::InputLayout *inputLayout); - - // TODO(jmadill): Migrate to d3d11::Buffer. - bool queueVertexBufferChange(size_t bufferIndex, - ID3D11Buffer *buffer, - UINT stride, - UINT offset); - bool queueVertexOffsetChange(size_t bufferIndex, UINT offsetOnly); - void applyVertexBufferChanges(); - - void setSingleVertexBuffer(const d3d11::Buffer *buffer, UINT stride, UINT offset); - - gl::Error updateState(const gl::Context *context, GLenum drawMode); - - void setShaderResourceShared(gl::SamplerType shaderType, - UINT resourceSlot, - const d3d11::SharedSRV *srv); - void setShaderResource(gl::SamplerType shaderType, - UINT resourceSlot, - const d3d11::ShaderResourceView *srv); - void setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY primitiveTopology); - - void setDrawShaders(const d3d11::VertexShader *vertexShader, - const d3d11::GeometryShader *geometryShader, - const d3d11::PixelShader *pixelShader); - void setVertexShader(const d3d11::VertexShader *shader); - void setGeometryShader(const d3d11::GeometryShader *shader); - void setPixelShader(const d3d11::PixelShader *shader); - void setComputeShader(const d3d11::ComputeShader *shader); - void setVertexConstantBuffer(unsigned int slot, const d3d11::Buffer *buffer); - void setPixelConstantBuffer(unsigned int slot, const d3d11::Buffer *buffer); - void setDepthStencilState(const d3d11::DepthStencilState *depthStencilState, UINT stencilRef); - void setSimpleBlendState(const d3d11::BlendState *blendState); - void setRasterizerState(const d3d11::RasterizerState *rasterizerState); - void setSimpleViewport(const gl::Extents &viewportExtents); - void setSimpleViewport(int width, int height); - void setSimplePixelTextureAndSampler(const d3d11::SharedSRV &srv, - const d3d11::SamplerState &samplerState); - void setSimpleScissorRect(const gl::Rectangle &glRect); - void setScissorRectD3D(const D3D11_RECT &d3dRect); - - // Not handled by an internal dirty bit because of the extra draw parameters. - gl::Error applyVertexBuffer(const gl::Context *context, - GLenum mode, - const DrawCallVertexParams &vertexParams, - bool isIndexedRendering); - - gl::Error applyIndexBuffer(const gl::Context *context, - const void *indices, - GLsizei count, - GLenum type, - const gl::HasIndexRange &lazyIndexRange, - bool usePrimitiveRestartWorkaround); - - void setIndexBuffer(ID3D11Buffer *buffer, DXGI_FORMAT indexFormat, unsigned int offset); - - gl::Error updateVertexOffsetsForPointSpritesEmulation(GLint startVertex, - GLsizei emulatedInstanceId); - - // TODO(jmadill): Should be private. - gl::Error applyComputeUniforms(ProgramD3D *programD3D); - - // Only used in testing. - InputLayoutCache *getInputLayoutCache() { return &mInputLayoutCache; } - - private: - template <typename SRVType> - void setShaderResourceInternal(gl::SamplerType shaderType, - UINT resourceSlot, - const SRVType *srv); - - bool unsetConflictingView(ID3D11View *view); - bool unsetConflictingSRVs(gl::SamplerType shaderType, - uintptr_t resource, - const gl::ImageIndex *index); - void unsetConflictingAttachmentResources(const gl::FramebufferAttachment *attachment, - ID3D11Resource *resource); - - gl::Error syncBlendState(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::BlendState &blendState, - const gl::ColorF &blendColor, - unsigned int sampleMask); - - gl::Error syncDepthStencilState(const gl::State &glState); - - gl::Error syncRasterizerState(const gl::Context *context, bool pointDrawMode); - - void syncScissorRectangle(const gl::Rectangle &scissor, bool enabled); - - void syncViewport(const gl::Context *context); - - void checkPresentPath(const gl::Context *context); - - gl::Error syncFramebuffer(const gl::Context *context, gl::Framebuffer *framebuffer); - gl::Error syncProgram(const gl::Context *context, GLenum drawMode); - - gl::Error syncTextures(const gl::Context *context); - gl::Error applyTextures(const gl::Context *context, gl::SamplerType shaderType); - - gl::Error setSamplerState(const gl::Context *context, - gl::SamplerType type, - int index, - gl::Texture *texture, - const gl::SamplerState &sampler); - gl::Error setTexture(const gl::Context *context, - gl::SamplerType type, - int index, - gl::Texture *texture); - - // Faster than calling setTexture a jillion times - gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd); - void handleMultiviewDrawFramebufferChange(const gl::Context *context); - - gl::Error syncCurrentValueAttribs(const gl::State &glState); - - gl::Error generateSwizzle(const gl::Context *context, gl::Texture *texture); - gl::Error generateSwizzlesForShader(const gl::Context *context, gl::SamplerType type); - gl::Error generateSwizzles(const gl::Context *context); - - gl::Error applyDriverUniforms(const ProgramD3D &programD3D); - gl::Error applyUniforms(ProgramD3D *programD3D); - - gl::Error syncUniformBuffers(const gl::Context *context, ProgramD3D *programD3D); - gl::Error syncTransformFeedbackBuffers(const gl::Context *context); - - // These are currently only called internally. - void invalidateTexturesAndSamplers(); - void invalidateDriverUniforms(); - void invalidateProgramUniforms(); - void invalidateProgramUniformBuffers(); - void invalidateConstantBuffer(unsigned int slot); - - // Called by the Framebuffer11 directly. - void processFramebufferInvalidation(const gl::Context *context); - - bool syncIndexBuffer(ID3D11Buffer *buffer, DXGI_FORMAT indexFormat, unsigned int offset); - - enum DirtyBitType - { - DIRTY_BIT_RENDER_TARGET, - DIRTY_BIT_VIEWPORT_STATE, - DIRTY_BIT_SCISSOR_STATE, - DIRTY_BIT_RASTERIZER_STATE, - DIRTY_BIT_BLEND_STATE, - DIRTY_BIT_DEPTH_STENCIL_STATE, - DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE, - DIRTY_BIT_PROGRAM_UNIFORMS, - DIRTY_BIT_DRIVER_UNIFORMS, - DIRTY_BIT_PROGRAM_UNIFORM_BUFFERS, - DIRTY_BIT_SHADERS, - DIRTY_BIT_CURRENT_VALUE_ATTRIBS, - DIRTY_BIT_INVALID, - DIRTY_BIT_MAX = DIRTY_BIT_INVALID, - }; - - using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>; - - Renderer11 *mRenderer; - - // Internal dirty bits. - DirtyBits mInternalDirtyBits; - - // Blend State - gl::BlendState mCurBlendState; - gl::ColorF mCurBlendColor; - unsigned int mCurSampleMask; - - // Currently applied depth stencil state - gl::DepthStencilState mCurDepthStencilState; - int mCurStencilRef; - int mCurStencilBackRef; - unsigned int mCurStencilSize; - Optional<bool> mCurDisableDepth; - Optional<bool> mCurDisableStencil; - - // Currently applied rasterizer state - gl::RasterizerState mCurRasterState; - - // Currently applied scissor rectangle state - bool mCurScissorEnabled; - gl::Rectangle mCurScissorRect; - - // Currently applied viewport state - gl::Rectangle mCurViewport; - float mCurNear; - float mCurFar; - - // The viewport offsets are guaranteed to be updated whenever the gl::State::DirtyBits are - // resolved and can be applied to the viewport and scissor whenever the internal viewport and - // scissor bits are resolved. - std::vector<gl::Offset> mViewportOffsets; - - // Things needed in viewport state - ShaderConstants11 mShaderConstants; - - // Render target variables - gl::Extents mViewportBounds; - bool mRenderTargetIsDirty; - - // EGL_ANGLE_experimental_present_path variables - bool mCurPresentPathFastEnabled; - int mCurPresentPathFastColorBufferHeight; - - // Queries that are currently active in this state - std::set<Query11 *> mCurrentQueries; - - // Currently applied textures - struct SRVRecord - { - uintptr_t srv; - uintptr_t resource; - D3D11_SHADER_RESOURCE_VIEW_DESC desc; - }; - - // A cache of current SRVs that also tracks the highest 'used' (non-NULL) SRV - // We might want to investigate a more robust approach that is also fast when there's - // a large gap between used SRVs (e.g. if SRV 0 and 7 are non-NULL, this approach will - // waste time on SRVs 1-6.) - class SRVCache : angle::NonCopyable - { - public: - SRVCache(); - ~SRVCache(); - - void initialize(size_t size) { mCurrentSRVs.resize(size); } - - size_t size() const { return mCurrentSRVs.size(); } - size_t highestUsed() const { return mHighestUsedSRV; } - - const SRVRecord &operator[](size_t index) const { return mCurrentSRVs[index]; } - void clear(); - void update(size_t resourceIndex, ID3D11ShaderResourceView *srv); - - private: - std::vector<SRVRecord> mCurrentSRVs; - size_t mHighestUsedSRV; - }; - - SRVCache mCurVertexSRVs; - SRVCache mCurPixelSRVs; - - // A block of NULL pointers, cached so we don't re-allocate every draw call - std::vector<ID3D11ShaderResourceView *> mNullSRVs; - - // Current translations of "Current-Value" data - owned by Context, not VertexArray. - gl::AttributesMask mDirtyCurrentValueAttribs; - std::vector<TranslatedAttribute> mCurrentValueAttribs; - - // Current applied input layout. - ResourceSerial mCurrentInputLayout; - bool mInputLayoutIsDirty; - bool mVertexAttribsNeedTranslation; - - // Current applied vertex states. - // TODO(jmadill): Figure out how to use ResourceSerial here. - std::array<ID3D11Buffer *, gl::MAX_VERTEX_ATTRIBS> mCurrentVertexBuffers; - std::array<UINT, gl::MAX_VERTEX_ATTRIBS> mCurrentVertexStrides; - std::array<UINT, gl::MAX_VERTEX_ATTRIBS> mCurrentVertexOffsets; - gl::RangeUI mDirtyVertexBufferRange; - - // Currently applied primitive topology - D3D11_PRIMITIVE_TOPOLOGY mCurrentPrimitiveTopology; - - // Currently applied shaders - ResourceSerial mAppliedVertexShader; - ResourceSerial mAppliedGeometryShader; - ResourceSerial mAppliedPixelShader; - ResourceSerial mAppliedComputeShader; - - // Currently applied sampler states - std::vector<bool> mForceSetVertexSamplerStates; - std::vector<gl::SamplerState> mCurVertexSamplerStates; - - std::vector<bool> mForceSetPixelSamplerStates; - std::vector<gl::SamplerState> mCurPixelSamplerStates; - - std::vector<bool> mForceSetComputeSamplerStates; - std::vector<gl::SamplerState> mCurComputeSamplerStates; - - // Special dirty bit for swizzles. Since they use internal shaders, must be done in a pre-pass. - bool mDirtySwizzles; - - // Currently applied index buffer - ID3D11Buffer *mAppliedIB; - DXGI_FORMAT mAppliedIBFormat; - unsigned int mAppliedIBOffset; - bool mIndexBufferIsDirty; - - // Vertex, index and input layouts - VertexDataManager mVertexDataManager; - IndexDataManager mIndexDataManager; - InputLayoutCache mInputLayoutCache; - std::vector<const TranslatedAttribute *> mCurrentAttributes; - Optional<GLint> mLastFirstVertex; - - // ANGLE_multiview. - bool mIsMultiviewEnabled; - - // Driver Constants. - d3d11::Buffer mDriverConstantBufferVS; - d3d11::Buffer mDriverConstantBufferPS; - d3d11::Buffer mDriverConstantBufferCS; - - ResourceSerial mCurrentComputeConstantBuffer; - ResourceSerial mCurrentGeometryConstantBuffer; - - template <typename T> - using VertexConstantBufferArray = - std::array<T, gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS>; - - VertexConstantBufferArray<ResourceSerial> mCurrentConstantBufferVS; - VertexConstantBufferArray<GLintptr> mCurrentConstantBufferVSOffset; - VertexConstantBufferArray<GLsizeiptr> mCurrentConstantBufferVSSize; - - template <typename T> - using FragmentConstantBufferArray = - std::array<T, gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS>; - - FragmentConstantBufferArray<ResourceSerial> mCurrentConstantBufferPS; - FragmentConstantBufferArray<GLintptr> mCurrentConstantBufferPSOffset; - FragmentConstantBufferArray<GLsizeiptr> mCurrentConstantBufferPSSize; - - // Currently applied transform feedback buffers - Serial mAppliedTFSerial; - - Serial mEmptySerial; - - bool mIsTransformFeedbackCurrentlyActiveUnpaused; -}; - -} // namespace rx -#endif // LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp deleted file mode 100644 index 1981b5f7b2..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp +++ /dev/null @@ -1,102 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// StreamProducerNV12.cpp: Implements the stream producer for NV12 textures - -#include "libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h" - -#include "common/utilities.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -namespace rx -{ - -StreamProducerNV12::StreamProducerNV12(Renderer11 *renderer) - : mRenderer(renderer), mTexture(nullptr), mArraySlice(0), mTextureWidth(0), mTextureHeight(0) -{ -} - -StreamProducerNV12::~StreamProducerNV12() -{ - SafeRelease(mTexture); -} - -egl::Error StreamProducerNV12::validateD3DNV12Texture(void *pointer) const -{ - ID3D11Texture2D *textureD3D = static_cast<ID3D11Texture2D *>(pointer); - - // Check that the texture originated from our device - ID3D11Device *device; - textureD3D->GetDevice(&device); - if (device != mRenderer->getDevice()) - { - return egl::EglBadParameter() << "Texture not created on ANGLE D3D device"; - } - - // Get the description and validate it - D3D11_TEXTURE2D_DESC desc; - textureD3D->GetDesc(&desc); - if (desc.Format != DXGI_FORMAT_NV12) - { - return egl::EglBadParameter() << "Texture format not DXGI_FORMAT_NV12"; - } - if (desc.Width < 1 || desc.Height < 1) - { - return egl::EglBadParameter() << "Texture is of size 0"; - } - if ((desc.Width % 2) != 0 || (desc.Height % 2) != 0) - { - return egl::EglBadParameter() << "Texture dimensions are not even"; - } - return egl::NoError(); -} - -void StreamProducerNV12::postD3DNV12Texture(void *pointer, const egl::AttributeMap &attributes) -{ - ASSERT(pointer != nullptr); - ID3D11Texture2D *textureD3D = static_cast<ID3D11Texture2D *>(pointer); - - // Check that the texture originated from our device - ID3D11Device *device; - textureD3D->GetDevice(&device); - - // Get the description - D3D11_TEXTURE2D_DESC desc; - textureD3D->GetDesc(&desc); - - // Release the previous texture if there is one - SafeRelease(mTexture); - - mTexture = textureD3D; - mTexture->AddRef(); - mTextureWidth = desc.Width; - mTextureHeight = desc.Height; - mArraySlice = static_cast<UINT>(attributes.get(EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, 0)); -} - -egl::Stream::GLTextureDescription StreamProducerNV12::getGLFrameDescription(int planeIndex) -{ - // The UV plane of NV12 textures has half the width/height of the Y plane - egl::Stream::GLTextureDescription desc; - desc.width = (planeIndex == 0) ? mTextureWidth : (mTextureWidth / 2); - desc.height = (planeIndex == 0) ? mTextureHeight : (mTextureHeight / 2); - desc.internalFormat = (planeIndex == 0) ? GL_R8 : GL_RG8; - desc.mipLevels = 0; - return desc; -} - -ID3D11Texture2D *StreamProducerNV12::getD3DTexture() -{ - return mTexture; -} - -UINT StreamProducerNV12::getArraySlice() -{ - return mArraySlice; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h deleted file mode 100644 index 304c9dfe53..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// StreamProducerNV12.h: Interface for a NV12 texture stream producer - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_STREAM11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_STREAM11_H_ - -#include "libANGLE/renderer/StreamProducerImpl.h" - -namespace rx -{ -class Renderer11; - -class StreamProducerNV12 : public StreamProducerImpl -{ - public: - StreamProducerNV12(Renderer11 *renderer); - ~StreamProducerNV12() override; - - egl::Error validateD3DNV12Texture(void *pointer) const override; - void postD3DNV12Texture(void *pointer, const egl::AttributeMap &attributes) override; - egl::Stream::GLTextureDescription getGLFrameDescription(int planeIndex) override; - - // Gets a pointer to the internal D3D texture - ID3D11Texture2D *getD3DTexture(); - - // Gets the slice index for the D3D texture that the frame is in - UINT getArraySlice(); - - private: - Renderer11 *mRenderer; - - ID3D11Texture2D *mTexture; - UINT mArraySlice; - UINT mTextureWidth; - UINT mTextureHeight; -}; -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_STREAM11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp deleted file mode 100644 index 9ece77ecbc..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp +++ /dev/null @@ -1,1075 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// SwapChain11.cpp: Implements a back-end specific class for the D3D11 swap chain. - -#include "libANGLE/renderer/d3d/d3d11/SwapChain11.h" - -#include <EGL/eglext.h> - -#include "libANGLE/features.h" -#include "libANGLE/renderer/d3d/d3d11/NativeWindow11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" -#include "third_party/trace_event/trace_event.h" - -// Precompiled shaders -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h" -#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h" - -#ifdef ANGLE_ENABLE_KEYEDMUTEX -#define ANGLE_RESOURCE_SHARE_TYPE D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX -#else -#define ANGLE_RESOURCE_SHARE_TYPE D3D11_RESOURCE_MISC_SHARED -#endif - -namespace rx -{ - -namespace -{ -// To avoid overflow in QPC to Microseconds calculations, since we multiply -// by kMicrosecondsPerSecond, then the QPC value should not exceed -// (2^63 - 1) / 1E6. If it exceeds that threshold, we divide then multiply. -static constexpr int64_t kQPCOverflowThreshold = 0x8637BD05AF7; -static constexpr int64_t kMicrosecondsPerSecond = 1000000; - -bool NeedsOffscreenTexture(Renderer11 *renderer, NativeWindow11 *nativeWindow, EGLint orientation) -{ - // We don't need an offscreen texture if either orientation = INVERT_Y, - // or present path fast is enabled and we're not rendering onto an offscreen surface. - return orientation != EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE && - !(renderer->presentPathFastEnabled() && nativeWindow->getNativeWindow()); -} -} // anonymous namespace - -SwapChain11::SwapChain11(Renderer11 *renderer, - NativeWindow11 *nativeWindow, - HANDLE shareHandle, - IUnknown *d3dTexture, - GLenum backBufferFormat, - GLenum depthBufferFormat, - EGLint orientation, - EGLint samples) - : SwapChainD3D(shareHandle, d3dTexture, backBufferFormat, depthBufferFormat), - mRenderer(renderer), - mWidth(-1), - mHeight(-1), - mOrientation(orientation), - mAppCreatedShareHandle(mShareHandle != nullptr), - mSwapInterval(0), - mPassThroughResourcesInit(false), - mNativeWindow(nativeWindow), - mFirstSwap(true), - mSwapChain(nullptr), - mSwapChain1(nullptr), - mKeyedMutex(nullptr), - mBackBufferTexture(), - mBackBufferRTView(), - mBackBufferSRView(), - mNeedsOffscreenTexture(NeedsOffscreenTexture(renderer, nativeWindow, orientation)), - mOffscreenTexture(), - mOffscreenRTView(), - mOffscreenSRView(), - mNeedsOffscreenTextureCopy(false), - mOffscreenTextureCopyForSRV(), - mDepthStencilTexture(), - mDepthStencilDSView(), - mDepthStencilSRView(), - mQuadVB(), - mPassThroughSampler(), - mPassThroughIL(), - mPassThroughVS(), - mPassThroughPS(), - mPassThroughRS(), - mColorRenderTarget(this, renderer, false), - mDepthStencilRenderTarget(this, renderer, true), - mEGLSamples(samples) -{ - // Sanity check that if present path fast is active then we're using the default orientation - ASSERT(!mRenderer->presentPathFastEnabled() || orientation == 0); - - // Get the performance counter - LARGE_INTEGER counterFreqency = {}; - BOOL success = QueryPerformanceFrequency(&counterFreqency); - ASSERT(success); - - mQPCFrequency = counterFreqency.QuadPart; -} - -SwapChain11::~SwapChain11() -{ - release(); -} - -void SwapChain11::release() -{ - // TODO(jmadill): Should probably signal that the RenderTarget is dirty. - - SafeRelease(mSwapChain1); - SafeRelease(mSwapChain); - SafeRelease(mKeyedMutex); - mBackBufferTexture.reset(); - mBackBufferRTView.reset(); - mBackBufferSRView.reset(); - mOffscreenTexture.reset(); - mOffscreenRTView.reset(); - mOffscreenSRView.reset(); - mDepthStencilTexture.reset(); - mDepthStencilDSView.reset(); - mDepthStencilSRView.reset(); - mQuadVB.reset(); - mPassThroughSampler.reset(); - mPassThroughIL.reset(); - mPassThroughVS.reset(); - mPassThroughPS.reset(); - mPassThroughRS.reset(); - - if (!mAppCreatedShareHandle) - { - mShareHandle = nullptr; - } -} - -void SwapChain11::releaseOffscreenColorBuffer() -{ - mOffscreenTexture.reset(); - mOffscreenRTView.reset(); - mOffscreenSRView.reset(); - mNeedsOffscreenTextureCopy = false; - mOffscreenTextureCopyForSRV.reset(); -} - -void SwapChain11::releaseOffscreenDepthBuffer() -{ - mDepthStencilTexture.reset(); - mDepthStencilDSView.reset(); - mDepthStencilSRView.reset(); -} - -EGLint SwapChain11::resetOffscreenBuffers(const gl::Context *context, - int backbufferWidth, - int backbufferHeight) -{ - if (mNeedsOffscreenTexture) - { - EGLint result = resetOffscreenColorBuffer(context, backbufferWidth, backbufferHeight); - if (result != EGL_SUCCESS) - { - return result; - } - } - - EGLint result = resetOffscreenDepthBuffer(backbufferWidth, backbufferHeight); - if (result != EGL_SUCCESS) - { - return result; - } - - mWidth = backbufferWidth; - mHeight = backbufferHeight; - - return EGL_SUCCESS; -} - -EGLint SwapChain11::resetOffscreenColorBuffer(const gl::Context *context, - int backbufferWidth, - int backbufferHeight) -{ - ASSERT(mNeedsOffscreenTexture); - - TRACE_EVENT0("gpu.angle", "SwapChain11::resetOffscreenTexture"); - ID3D11Device *device = mRenderer->getDevice(); - - ASSERT(device != nullptr); - - // D3D11 does not allow zero size textures - ASSERT(backbufferWidth >= 1); - ASSERT(backbufferHeight >= 1); - - // Preserve the render target content - TextureHelper11 previousOffscreenTexture(std::move(mOffscreenTexture)); - const int previousWidth = mWidth; - const int previousHeight = mHeight; - - releaseOffscreenColorBuffer(); - - const d3d11::Format &backbufferFormatInfo = - d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps()); - D3D11_TEXTURE2D_DESC offscreenTextureDesc = {0}; - - // If the app passed in a share handle or D3D texture, open the resource - // See EGL_ANGLE_d3d_share_handle_client_buffer and EGL_ANGLE_d3d_texture_client_buffer - if (mAppCreatedShareHandle || mD3DTexture != nullptr) - { - if (mAppCreatedShareHandle) - { - ID3D11Resource *tempResource11; - HRESULT result = device->OpenSharedResource(mShareHandle, __uuidof(ID3D11Resource), - (void **)&tempResource11); - ASSERT(SUCCEEDED(result)); - - mOffscreenTexture.set(d3d11::DynamicCastComObject<ID3D11Texture2D>(tempResource11), - backbufferFormatInfo); - SafeRelease(tempResource11); - } - else if (mD3DTexture != nullptr) - { - mOffscreenTexture.set(d3d11::DynamicCastComObject<ID3D11Texture2D>(mD3DTexture), - backbufferFormatInfo); - } - else - { - UNREACHABLE(); - } - ASSERT(mOffscreenTexture.valid()); - mOffscreenTexture.getDesc(&offscreenTextureDesc); - - // Fail if the offscreen texture is not renderable. - if ((offscreenTextureDesc.BindFlags & D3D11_BIND_RENDER_TARGET) == 0) - { - ERR() << "Could not use provided offscreen texture, texture not renderable."; - release(); - return EGL_BAD_SURFACE; - } - } - else - { - const bool useSharedResource = - !mNativeWindow->getNativeWindow() && mRenderer->getShareHandleSupport(); - - offscreenTextureDesc.Width = backbufferWidth; - offscreenTextureDesc.Height = backbufferHeight; - offscreenTextureDesc.Format = backbufferFormatInfo.texFormat; - offscreenTextureDesc.MipLevels = 1; - offscreenTextureDesc.ArraySize = 1; - offscreenTextureDesc.SampleDesc.Count = getD3DSamples(); - offscreenTextureDesc.SampleDesc.Quality = 0; - offscreenTextureDesc.Usage = D3D11_USAGE_DEFAULT; - offscreenTextureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; - offscreenTextureDesc.CPUAccessFlags = 0; - offscreenTextureDesc.MiscFlags = useSharedResource ? ANGLE_RESOURCE_SHARE_TYPE : 0; - - gl::Error err = mRenderer->allocateTexture(offscreenTextureDesc, backbufferFormatInfo, - &mOffscreenTexture); - if (err.isError()) - { - ERR() << "Could not create offscreen texture, " << err; - release(); - return EGL_BAD_ALLOC; - } - - mOffscreenTexture.setDebugName("Offscreen back buffer texture"); - - // EGL_ANGLE_surface_d3d_texture_2d_share_handle requires that we store a share handle for the client - if (useSharedResource) - { - IDXGIResource *offscreenTextureResource = nullptr; - HRESULT result = mOffscreenTexture.get()->QueryInterface( - __uuidof(IDXGIResource), (void **)&offscreenTextureResource); - - // Fall back to no share handle on failure - if (FAILED(result)) - { - ERR() << "Could not query offscreen texture resource, " << gl::FmtHR(result); - } - else - { - result = offscreenTextureResource->GetSharedHandle(&mShareHandle); - SafeRelease(offscreenTextureResource); - - if (FAILED(result)) - { - mShareHandle = nullptr; - ERR() << "Could not get offscreen texture shared handle, " << gl::FmtHR(result); - } - } - } - } - - // This may return null if the original texture was created without a keyed mutex. - mKeyedMutex = d3d11::DynamicCastComObject<IDXGIKeyedMutex>(mOffscreenTexture.get()); - - D3D11_RENDER_TARGET_VIEW_DESC offscreenRTVDesc; - offscreenRTVDesc.Format = backbufferFormatInfo.rtvFormat; - offscreenRTVDesc.ViewDimension = - (mEGLSamples <= 1) ? D3D11_RTV_DIMENSION_TEXTURE2D : D3D11_RTV_DIMENSION_TEXTURE2DMS; - offscreenRTVDesc.Texture2D.MipSlice = 0; - - gl::Error err = - mRenderer->allocateResource(offscreenRTVDesc, mOffscreenTexture.get(), &mOffscreenRTView); - ASSERT(!err.isError()); - mOffscreenRTView.setDebugName("Offscreen back buffer render target"); - - D3D11_SHADER_RESOURCE_VIEW_DESC offscreenSRVDesc; - offscreenSRVDesc.Format = backbufferFormatInfo.srvFormat; - offscreenSRVDesc.ViewDimension = - (mEGLSamples <= 1) ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS; - offscreenSRVDesc.Texture2D.MostDetailedMip = 0; - offscreenSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1); - - if (offscreenTextureDesc.BindFlags & D3D11_BIND_SHADER_RESOURCE) - { - err = mRenderer->allocateResource(offscreenSRVDesc, mOffscreenTexture.get(), - &mOffscreenSRView); - ASSERT(!err.isError()); - mOffscreenSRView.setDebugName("Offscreen back buffer shader resource"); - } - else - { - // Special case for external textures that cannot support sampling. Since internally we - // assume our SwapChain is always readable, we make a copy texture that is compatible. - mNeedsOffscreenTextureCopy = true; - } - - if (previousOffscreenTexture.valid()) - { - D3D11_BOX sourceBox = {0}; - sourceBox.left = 0; - sourceBox.right = std::min(previousWidth, backbufferWidth); - sourceBox.top = std::max(previousHeight - backbufferHeight, 0); - sourceBox.bottom = previousHeight; - sourceBox.front = 0; - sourceBox.back = 1; - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - const int yoffset = std::max(backbufferHeight - previousHeight, 0); - deviceContext->CopySubresourceRegion(mOffscreenTexture.get(), 0, 0, yoffset, 0, - previousOffscreenTexture.get(), 0, &sourceBox); - - if (mSwapChain) - { - swapRect(context, 0, 0, backbufferWidth, backbufferHeight); - } - } - - return EGL_SUCCESS; -} - -EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbufferHeight) -{ - releaseOffscreenDepthBuffer(); - - if (mDepthBufferFormat != GL_NONE) - { - const d3d11::Format &depthBufferFormatInfo = - d3d11::Format::Get(mDepthBufferFormat, mRenderer->getRenderer11DeviceCaps()); - - D3D11_TEXTURE2D_DESC depthStencilTextureDesc; - depthStencilTextureDesc.Width = backbufferWidth; - depthStencilTextureDesc.Height = backbufferHeight; - depthStencilTextureDesc.Format = depthBufferFormatInfo.texFormat; - depthStencilTextureDesc.MipLevels = 1; - depthStencilTextureDesc.ArraySize = 1; - depthStencilTextureDesc.SampleDesc.Count = getD3DSamples(); - depthStencilTextureDesc.Usage = D3D11_USAGE_DEFAULT; - depthStencilTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; - - // If there is a multisampled offscreen color texture, the offscreen depth-stencil texture - // must also have the same quality value. - if (mOffscreenTexture.valid() && getD3DSamples() > 1) - { - D3D11_TEXTURE2D_DESC offscreenTextureDesc = {0}; - mOffscreenTexture.getDesc(&offscreenTextureDesc); - depthStencilTextureDesc.SampleDesc.Quality = offscreenTextureDesc.SampleDesc.Quality; - } - else - { - depthStencilTextureDesc.SampleDesc.Quality = 0; - } - - // Only create an SRV if it is supported - bool depthStencilSRV = - depthBufferFormatInfo.srvFormat != DXGI_FORMAT_UNKNOWN && - (mRenderer->getRenderer11DeviceCaps().supportsMultisampledDepthStencilSRVs || - depthStencilTextureDesc.SampleDesc.Count <= 1); - if (depthStencilSRV) - { - depthStencilTextureDesc.BindFlags |= D3D11_BIND_SHADER_RESOURCE; - } - - depthStencilTextureDesc.CPUAccessFlags = 0; - depthStencilTextureDesc.MiscFlags = 0; - - gl::Error err = mRenderer->allocateTexture(depthStencilTextureDesc, depthBufferFormatInfo, - &mDepthStencilTexture); - if (err.isError()) - { - ERR() << "Could not create depthstencil surface for new swap chain, " << err; - release(); - return EGL_BAD_ALLOC; - } - mDepthStencilTexture.setDebugName("Offscreen depth stencil texture"); - - D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilDesc; - depthStencilDesc.Format = depthBufferFormatInfo.dsvFormat; - depthStencilDesc.ViewDimension = - (mEGLSamples <= 1) ? D3D11_DSV_DIMENSION_TEXTURE2D : D3D11_DSV_DIMENSION_TEXTURE2DMS; - depthStencilDesc.Flags = 0; - depthStencilDesc.Texture2D.MipSlice = 0; - - err = mRenderer->allocateResource(depthStencilDesc, mDepthStencilTexture.get(), - &mDepthStencilDSView); - ASSERT(!err.isError()); - mDepthStencilDSView.setDebugName("Offscreen depth stencil view"); - - if (depthStencilSRV) - { - D3D11_SHADER_RESOURCE_VIEW_DESC depthStencilSRVDesc; - depthStencilSRVDesc.Format = depthBufferFormatInfo.srvFormat; - depthStencilSRVDesc.ViewDimension = (mEGLSamples <= 1) - ? D3D11_SRV_DIMENSION_TEXTURE2D - : D3D11_SRV_DIMENSION_TEXTURE2DMS; - depthStencilSRVDesc.Texture2D.MostDetailedMip = 0; - depthStencilSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1); - - err = mRenderer->allocateResource(depthStencilSRVDesc, mDepthStencilTexture.get(), - &mDepthStencilSRView); - ASSERT(!err.isError()); - mDepthStencilSRView.setDebugName("Offscreen depth stencil shader resource"); - } - } - - return EGL_SUCCESS; -} - -EGLint SwapChain11::resize(const gl::Context *context, - EGLint backbufferWidth, - EGLint backbufferHeight) -{ - TRACE_EVENT0("gpu.angle", "SwapChain11::resize"); - ID3D11Device *device = mRenderer->getDevice(); - - if (device == nullptr) - { - return EGL_BAD_ACCESS; - } - - // EGL allows creating a surface with 0x0 dimension, however, DXGI does not like 0x0 swapchains - if (backbufferWidth < 1 || backbufferHeight < 1) - { - return EGL_SUCCESS; - } - - // Don't resize unnecessarily - if (mWidth == backbufferWidth && mHeight == backbufferHeight) - { - return EGL_SUCCESS; - } - - // Can only call resize if we have already created our swap buffer and resources - ASSERT(mSwapChain && mBackBufferTexture.valid() && mBackBufferRTView.valid() && - mBackBufferSRView.valid()); - - mBackBufferTexture.reset(); - mBackBufferRTView.reset(); - mBackBufferSRView.reset(); - - // Resize swap chain - DXGI_SWAP_CHAIN_DESC desc; - HRESULT result = mSwapChain->GetDesc(&desc); - if (FAILED(result)) - { - ERR() << "Error reading swap chain description, " << gl::FmtHR(result); - release(); - return EGL_BAD_ALLOC; - } - - result = mSwapChain->ResizeBuffers(desc.BufferCount, backbufferWidth, backbufferHeight, getSwapChainNativeFormat(), 0); - - if (FAILED(result)) - { - ERR() << "Error resizing swap chain buffers, " << gl::FmtHR(result); - release(); - - if (d3d11::isDeviceLostError(result)) - { - return EGL_CONTEXT_LOST; - } - else - { - return EGL_BAD_ALLOC; - } - } - - ID3D11Texture2D *backbufferTexture = nullptr; - result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), - reinterpret_cast<void **>(&backbufferTexture)); - ASSERT(SUCCEEDED(result)); - if (SUCCEEDED(result)) - { -#ifndef ANGLE_ENABLE_WINDOWS_STORE - if (mNativeWindow->getNativeWindow()) - InvalidateRect(mNativeWindow->getNativeWindow(), nullptr, FALSE); -#endif - const auto &format = - d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps()); - mBackBufferTexture.set(backbufferTexture, format); - mBackBufferTexture.setDebugName("Back buffer texture"); - - gl::Error err = - mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferRTView); - ASSERT(!err.isError()); - mBackBufferRTView.setDebugName("Back buffer render target"); - - err = mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferSRView); - ASSERT(!err.isError()); - mBackBufferSRView.setDebugName("Back buffer shader resource"); - } - - mFirstSwap = true; - - return resetOffscreenBuffers(context, backbufferWidth, backbufferHeight); -} - -DXGI_FORMAT SwapChain11::getSwapChainNativeFormat() const -{ - // Return a render target format for offscreen rendering is supported by IDXGISwapChain. - // MSDN https://msdn.microsoft.com/en-us/library/windows/desktop/bb173064(v=vs.85).aspx - switch (mOffscreenRenderTargetFormat) - { - case GL_RGBA8: - case GL_RGBA4: - case GL_RGB5_A1: - case GL_RGB8: - case GL_RGB565: - return DXGI_FORMAT_R8G8B8A8_UNORM; - - case GL_BGRA8_EXT: - return DXGI_FORMAT_B8G8R8A8_UNORM; - - case GL_RGB10_A2: - return DXGI_FORMAT_R10G10B10A2_UNORM; - - case GL_RGBA16F: - return DXGI_FORMAT_R16G16B16A16_FLOAT; - - default: - UNREACHABLE(); - return DXGI_FORMAT_UNKNOWN; - } -} - -EGLint SwapChain11::reset(const gl::Context *context, - EGLint backbufferWidth, - EGLint backbufferHeight, - EGLint swapInterval) -{ - mSwapInterval = static_cast<unsigned int>(swapInterval); - if (mSwapInterval > 4) - { - // IDXGISwapChain::Present documentation states that valid sync intervals are in the [0,4] - // range - return EGL_BAD_PARAMETER; - } - - // If the swap chain already exists, just resize - if (mSwapChain != nullptr) - { - return resize(context, backbufferWidth, backbufferHeight); - } - - TRACE_EVENT0("gpu.angle", "SwapChain11::reset"); - ID3D11Device *device = mRenderer->getDevice(); - - if (device == nullptr) - { - return EGL_BAD_ACCESS; - } - - // Release specific resources to free up memory for the new render target, while the - // old render target still exists for the purpose of preserving its contents. - SafeRelease(mSwapChain1); - SafeRelease(mSwapChain); - mBackBufferTexture.reset(); - mBackBufferRTView.reset(); - - // EGL allows creating a surface with 0x0 dimension, however, DXGI does not like 0x0 swapchains - if (backbufferWidth < 1 || backbufferHeight < 1) - { - releaseOffscreenColorBuffer(); - return EGL_SUCCESS; - } - - if (mNativeWindow->getNativeWindow()) - { - HRESULT result = mNativeWindow->createSwapChain( - device, mRenderer->getDxgiFactory(), getSwapChainNativeFormat(), backbufferWidth, - backbufferHeight, getD3DSamples(), &mSwapChain); - - if (FAILED(result)) - { - ERR() << "Could not create additional swap chains or offscreen surfaces, " - << gl::FmtHR(result); - release(); - - if (d3d11::isDeviceLostError(result)) - { - return EGL_CONTEXT_LOST; - } - else - { - return EGL_BAD_ALLOC; - } - } - - if (mRenderer->getRenderer11DeviceCaps().supportsDXGI1_2) - { - mSwapChain1 = d3d11::DynamicCastComObject<IDXGISwapChain1>(mSwapChain); - } - - ID3D11Texture2D *backbufferTex = nullptr; - result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), - reinterpret_cast<LPVOID *>(&backbufferTex)); - ASSERT(SUCCEEDED(result)); - const auto &format = - d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps()); - mBackBufferTexture.set(backbufferTex, format); - mBackBufferTexture.setDebugName("Back buffer texture"); - - gl::Error err = - mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferRTView); - ASSERT(!err.isError()); - mBackBufferRTView.setDebugName("Back buffer render target"); - - err = mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferSRView); - ASSERT(!err.isError()); - mBackBufferSRView.setDebugName("Back buffer shader resource view"); - } - - mFirstSwap = true; - - return resetOffscreenBuffers(context, backbufferWidth, backbufferHeight); -} - -void SwapChain11::initPassThroughResources() -{ - if (mPassThroughResourcesInit) - { - return; - } - - TRACE_EVENT0("gpu.angle", "SwapChain11::initPassThroughResources"); - ID3D11Device *device = mRenderer->getDevice(); - - ASSERT(device != nullptr); - - // Make sure our resources are all not allocated, when we create - ASSERT(!mQuadVB.valid() && !mPassThroughSampler.valid()); - ASSERT(!mPassThroughIL.valid() && !mPassThroughVS.valid() && !mPassThroughPS.valid()); - - D3D11_BUFFER_DESC vbDesc; - vbDesc.ByteWidth = sizeof(d3d11::PositionTexCoordVertex) * 4; - vbDesc.Usage = D3D11_USAGE_DYNAMIC; - vbDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - vbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - vbDesc.MiscFlags = 0; - vbDesc.StructureByteStride = 0; - - gl::Error err = mRenderer->allocateResource(vbDesc, &mQuadVB); - ASSERT(!err.isError()); - mQuadVB.setDebugName("Swap chain quad vertex buffer"); - - D3D11_SAMPLER_DESC samplerDesc; - samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; - samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - samplerDesc.MipLODBias = 0.0f; - samplerDesc.MaxAnisotropy = 0; - samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; - samplerDesc.BorderColor[0] = 0.0f; - samplerDesc.BorderColor[1] = 0.0f; - samplerDesc.BorderColor[2] = 0.0f; - samplerDesc.BorderColor[3] = 0.0f; - samplerDesc.MinLOD = 0; - samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; - - err = mRenderer->allocateResource(samplerDesc, &mPassThroughSampler); - ASSERT(!err.isError()); - mPassThroughSampler.setDebugName("Swap chain pass through sampler"); - - D3D11_INPUT_ELEMENT_DESC quadLayout[] = - { - { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - }; - - InputElementArray quadElements(quadLayout); - ShaderData vertexShaderData(g_VS_Passthrough2D); - - err = mRenderer->allocateResource(quadElements, &vertexShaderData, &mPassThroughIL); - ASSERT(!err.isError()); - mPassThroughIL.setDebugName("Swap chain pass through layout"); - - err = mRenderer->allocateResource(vertexShaderData, &mPassThroughVS); - ASSERT(!err.isError()); - mPassThroughVS.setDebugName("Swap chain pass through vertex shader"); - - if (mEGLSamples <= 1) - { - ShaderData pixelShaderData(g_PS_PassthroughRGBA2D); - err = mRenderer->allocateResource(pixelShaderData, &mPassThroughPS); - } - else - { - ShaderData pixelShaderData(g_PS_PassthroughRGBA2DMS); - err = mRenderer->allocateResource(pixelShaderData, &mPassThroughPS); - } - - ASSERT(!err.isError()); - mPassThroughPS.setDebugName("Swap chain pass through pixel shader"); - - // Use the default rasterizer state but without culling - D3D11_RASTERIZER_DESC rasterizerDesc; - rasterizerDesc.FillMode = D3D11_FILL_SOLID; - rasterizerDesc.CullMode = D3D11_CULL_NONE; - rasterizerDesc.FrontCounterClockwise = FALSE; - rasterizerDesc.DepthBias = 0; - rasterizerDesc.SlopeScaledDepthBias = 0.0f; - rasterizerDesc.DepthBiasClamp = 0.0f; - rasterizerDesc.DepthClipEnable = TRUE; - rasterizerDesc.ScissorEnable = FALSE; - rasterizerDesc.MultisampleEnable = FALSE; - rasterizerDesc.AntialiasedLineEnable = FALSE; - - err = mRenderer->allocateResource(rasterizerDesc, &mPassThroughRS); - ASSERT(!err.isError()); - mPassThroughRS.setDebugName("Swap chain pass through rasterizer state"); - - mPassThroughResourcesInit = true; -} - -// parameters should be validated/clamped by caller -EGLint SwapChain11::swapRect(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height) -{ - if (mNeedsOffscreenTexture) - { - EGLint result = copyOffscreenToBackbuffer(context, x, y, width, height); - if (result != EGL_SUCCESS) - { - return result; - } - } - - EGLint result = present(context, x, y, width, height); - if (result != EGL_SUCCESS) - { - return result; - } - - mRenderer->onSwap(); - - return EGL_SUCCESS; -} - -EGLint SwapChain11::copyOffscreenToBackbuffer(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height) -{ - if (!mSwapChain) - { - return EGL_SUCCESS; - } - - initPassThroughResources(); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - // Set vertices - D3D11_MAPPED_SUBRESOURCE mappedResource; - HRESULT result = - deviceContext->Map(mQuadVB.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(result)) - { - return EGL_BAD_ACCESS; - } - - d3d11::PositionTexCoordVertex *vertices = static_cast<d3d11::PositionTexCoordVertex*>(mappedResource.pData); - - // Create a quad in homogeneous coordinates - float x1 = (x / float(width)) * 2.0f - 1.0f; - float y1 = (y / float(height)) * 2.0f - 1.0f; - float x2 = ((x + width) / float(width)) * 2.0f - 1.0f; - float y2 = ((y + height) / float(height)) * 2.0f - 1.0f; - - float u1 = x / float(width); - float v1 = y / float(height); - float u2 = (x + width) / float(width); - float v2 = (y + height) / float(height); - // Invert the quad vertices depending on the surface orientation. - if ((mOrientation & EGL_SURFACE_ORIENTATION_INVERT_X_ANGLE) != 0) - { - std::swap(x1, x2); - } - if ((mOrientation & EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE) != 0) - { - std::swap(y1, y2); - } - - d3d11::SetPositionTexCoordVertex(&vertices[0], x1, y1, u1, v1); - d3d11::SetPositionTexCoordVertex(&vertices[1], x1, y2, u1, v2); - d3d11::SetPositionTexCoordVertex(&vertices[2], x2, y1, u2, v1); - d3d11::SetPositionTexCoordVertex(&vertices[3], x2, y2, u2, v2); - - deviceContext->Unmap(mQuadVB.get(), 0); - - StateManager11 *stateManager = mRenderer->getStateManager(); - - constexpr UINT stride = sizeof(d3d11::PositionTexCoordVertex); - stateManager->setSingleVertexBuffer(&mQuadVB, stride, 0); - - // Apply state - stateManager->setDepthStencilState(nullptr, 0xFFFFFFFF); - stateManager->setSimpleBlendState(nullptr); - stateManager->setRasterizerState(&mPassThroughRS); - - // Apply shaders - stateManager->setInputLayout(&mPassThroughIL); - stateManager->setPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - stateManager->setDrawShaders(&mPassThroughVS, nullptr, &mPassThroughPS); - - // Apply render targets. Use the proxy context in display. - stateManager->setRenderTarget(mBackBufferRTView.get(), nullptr); - - // Set the viewport - stateManager->setSimpleViewport(width, height); - - // Apply textures - stateManager->setSimplePixelTextureAndSampler(mOffscreenSRView, mPassThroughSampler); - - // Draw - deviceContext->Draw(4, 0); - - return EGL_SUCCESS; -} - -EGLint SwapChain11::present(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height) -{ - if (!mSwapChain) - { - return EGL_SUCCESS; - } - - UINT swapInterval = mSwapInterval; -#if ANGLE_VSYNC == ANGLE_DISABLED - swapInterval = 0; -#endif - - HRESULT result = S_OK; - - // Use IDXGISwapChain1::Present1 with a dirty rect if DXGI 1.2 is available. - // Dirty rect present is not supported with a multisampled swapchain. - if (mSwapChain1 != nullptr && mEGLSamples <= 1) - { - if (mFirstSwap) - { - // Can't swap with a dirty rect if this swap chain has never swapped before - DXGI_PRESENT_PARAMETERS params = {0, nullptr, nullptr, nullptr}; - result = mSwapChain1->Present1(swapInterval, 0, ¶ms); - } - else - { - RECT rect = {static_cast<LONG>(x), static_cast<LONG>(mHeight - y - height), - static_cast<LONG>(x + width), static_cast<LONG>(mHeight - y)}; - DXGI_PRESENT_PARAMETERS params = {1, &rect, nullptr, nullptr}; - result = mSwapChain1->Present1(swapInterval, 0, ¶ms); - } - } - else - { - result = mSwapChain->Present(swapInterval, 0); - } - - mFirstSwap = false; - - // Some swapping mechanisms such as DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL unbind the current render - // target. Mark it dirty. Use the proxy context in display since there is none available. - mRenderer->getStateManager()->invalidateRenderTarget(); - - if (result == DXGI_ERROR_DEVICE_REMOVED) - { - ERR() << "Present failed: the D3D11 device was removed, " - << gl::FmtHR(mRenderer->getDevice()->GetDeviceRemovedReason()); - return EGL_CONTEXT_LOST; - } - else if (result == DXGI_ERROR_DEVICE_RESET) - { - ERR() << "Present failed: the D3D11 device was reset from a bad command."; - return EGL_CONTEXT_LOST; - } - else if (FAILED(result)) - { - ERR() << "Present failed with " << gl::FmtHR(result); - } - - mNativeWindow->commitChange(); - - return EGL_SUCCESS; -} - -const TextureHelper11 &SwapChain11::getOffscreenTexture() -{ - return mNeedsOffscreenTexture ? mOffscreenTexture : mBackBufferTexture; -} - -const d3d11::RenderTargetView &SwapChain11::getRenderTarget() -{ - return mNeedsOffscreenTexture ? mOffscreenRTView : mBackBufferRTView; -} - -const d3d11::SharedSRV &SwapChain11::getRenderTargetShaderResource() -{ - if (!mNeedsOffscreenTexture) - { - ASSERT(mBackBufferSRView.valid()); - return mBackBufferSRView; - } - - if (!mNeedsOffscreenTextureCopy) - { - ASSERT(mOffscreenSRView.valid()); - return mOffscreenSRView; - } - - if (!mOffscreenTextureCopyForSRV.valid()) - { - const d3d11::Format &backbufferFormatInfo = - d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps()); - - D3D11_TEXTURE2D_DESC offscreenCopyDesc; - mOffscreenTexture.getDesc(&offscreenCopyDesc); - - offscreenCopyDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - offscreenCopyDesc.MiscFlags = 0; - offscreenCopyDesc.CPUAccessFlags = 0; - gl::Error err = mRenderer->allocateTexture(offscreenCopyDesc, backbufferFormatInfo, - &mOffscreenTextureCopyForSRV); - ASSERT(!err.isError()); - mOffscreenTextureCopyForSRV.setDebugName("Offscreen back buffer copy for SRV"); - - D3D11_SHADER_RESOURCE_VIEW_DESC offscreenSRVDesc; - offscreenSRVDesc.Format = backbufferFormatInfo.srvFormat; - offscreenSRVDesc.ViewDimension = - (mEGLSamples <= 1) ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS; - offscreenSRVDesc.Texture2D.MostDetailedMip = 0; - offscreenSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1); - - err = mRenderer->allocateResource(offscreenSRVDesc, mOffscreenTextureCopyForSRV.get(), - &mOffscreenSRView); - ASSERT(!err.isError()); - mOffscreenSRView.setDebugName("Offscreen back buffer shader resource"); - } - - // Need to copy the offscreen texture into the shader-readable copy, since it's external and - // we don't know if the copy is up-to-date. This works around the problem we have when the app - // passes in a texture that isn't shader-readable. - mRenderer->getDeviceContext()->CopyResource(mOffscreenTextureCopyForSRV.get(), - mOffscreenTexture.get()); - return mOffscreenSRView; -} - -const d3d11::DepthStencilView &SwapChain11::getDepthStencil() -{ - return mDepthStencilDSView; -} - -const d3d11::SharedSRV &SwapChain11::getDepthStencilShaderResource() -{ - return mDepthStencilSRView; -} - -const TextureHelper11 &SwapChain11::getDepthStencilTexture() -{ - return mDepthStencilTexture; -} - -void *SwapChain11::getKeyedMutex() -{ - return mKeyedMutex; -} - -void SwapChain11::recreate() -{ - // possibly should use this method instead of reset -} - -void *rx::SwapChain11::getDevice() -{ - return mRenderer->getDevice(); -} - -RenderTargetD3D *SwapChain11::getColorRenderTarget() -{ - return &mColorRenderTarget; -} - -RenderTargetD3D *SwapChain11::getDepthStencilRenderTarget() -{ - return &mDepthStencilRenderTarget; -} - -egl::Error SwapChain11::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) -{ - if (!mSwapChain) - { - return egl::EglNotInitialized() << "Swap chain uninitialized"; - } - - DXGI_FRAME_STATISTICS stats = {}; - HRESULT result = mSwapChain->GetFrameStatistics(&stats); - - if (FAILED(result)) - { - return egl::EglBadAlloc() << "Failed to get frame statistics, " << gl::FmtHR(result); - } - - // Conversion from DXGI_FRAME_STATISTICS to the output values: - // stats.SyncRefreshCount -> msc - // stats.PresentCount -> sbc - // stats.SyncQPCTime -> ust with conversion to microseconds via QueryPerformanceFrequency - *msc = stats.SyncRefreshCount; - *sbc = stats.PresentCount; - - LONGLONG syncQPCValue = stats.SyncQPCTime.QuadPart; - // If the QPC Value is below the overflow threshold, we proceed with - // simple multiply and divide. - if (syncQPCValue < kQPCOverflowThreshold) - { - *ust = syncQPCValue * kMicrosecondsPerSecond / mQPCFrequency; - } - else - { - // Otherwise, calculate microseconds in a round about manner to avoid - // overflow and precision issues. - int64_t wholeSeconds = syncQPCValue / mQPCFrequency; - int64_t leftoverTicks = syncQPCValue - (wholeSeconds * mQPCFrequency); - *ust = wholeSeconds * kMicrosecondsPerSecond + - leftoverTicks * kMicrosecondsPerSecond / mQPCFrequency; - } - - return egl::NoError(); -} - -UINT SwapChain11::getD3DSamples() const -{ - return (mEGLSamples == 0) ? 1 : mEGLSamples; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h deleted file mode 100644 index eca068210b..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h +++ /dev/null @@ -1,137 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// SwapChain11.h: Defines a back-end specific class for the D3D11 swap chain. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_SWAPCHAIN11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_SWAPCHAIN11_H_ - -#include "common/angleutils.h" -#include "libANGLE/renderer/d3d/SwapChainD3D.h" -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" - -namespace rx -{ -class Renderer11; -class NativeWindow11; - -class SwapChain11 final : public SwapChainD3D -{ - public: - SwapChain11(Renderer11 *renderer, - NativeWindow11 *nativeWindow, - HANDLE shareHandle, - IUnknown *d3dTexture, - GLenum backBufferFormat, - GLenum depthBufferFormat, - EGLint orientation, - EGLint samples); - ~SwapChain11() override; - - EGLint resize(const gl::Context *context, - EGLint backbufferWidth, - EGLint backbufferHeight) override; - EGLint reset(const gl::Context *context, - EGLint backbufferWidth, - EGLint backbufferHeight, - EGLint swapInterval) override; - EGLint swapRect(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height) override; - void recreate() override; - - RenderTargetD3D *getColorRenderTarget() override; - RenderTargetD3D *getDepthStencilRenderTarget() override; - - const TextureHelper11 &getOffscreenTexture(); - const d3d11::RenderTargetView &getRenderTarget(); - const d3d11::SharedSRV &getRenderTargetShaderResource(); - - const TextureHelper11 &getDepthStencilTexture(); - const d3d11::DepthStencilView &getDepthStencil(); - const d3d11::SharedSRV &getDepthStencilShaderResource(); - - EGLint getWidth() const { return mWidth; } - EGLint getHeight() const { return mHeight; } - void *getKeyedMutex() override; - EGLint getSamples() const { return mEGLSamples; } - - void *getDevice() override; - - egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) override; - - private: - void release(); - void initPassThroughResources(); - - void releaseOffscreenColorBuffer(); - void releaseOffscreenDepthBuffer(); - EGLint resetOffscreenBuffers(const gl::Context *context, - int backbufferWidth, - int backbufferHeight); - EGLint resetOffscreenColorBuffer(const gl::Context *context, - int backbufferWidth, - int backbufferHeight); - EGLint resetOffscreenDepthBuffer(int backbufferWidth, int backbufferHeight); - - DXGI_FORMAT getSwapChainNativeFormat() const; - - EGLint copyOffscreenToBackbuffer(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height); - EGLint present(const gl::Context *context, EGLint x, EGLint y, EGLint width, EGLint height); - UINT getD3DSamples() const; - - Renderer11 *mRenderer; - EGLint mWidth; - EGLint mHeight; - const EGLint mOrientation; - bool mAppCreatedShareHandle; - unsigned int mSwapInterval; - bool mPassThroughResourcesInit; - - NativeWindow11 *mNativeWindow; // Handler for the Window that the surface is created for. - - bool mFirstSwap; - IDXGISwapChain *mSwapChain; - IDXGISwapChain1 *mSwapChain1; - IDXGIKeyedMutex *mKeyedMutex; - - TextureHelper11 mBackBufferTexture; - d3d11::RenderTargetView mBackBufferRTView; - d3d11::SharedSRV mBackBufferSRView; - - const bool mNeedsOffscreenTexture; - TextureHelper11 mOffscreenTexture; - d3d11::RenderTargetView mOffscreenRTView; - d3d11::SharedSRV mOffscreenSRView; - bool mNeedsOffscreenTextureCopy; - TextureHelper11 mOffscreenTextureCopyForSRV; - - TextureHelper11 mDepthStencilTexture; - d3d11::DepthStencilView mDepthStencilDSView; - d3d11::SharedSRV mDepthStencilSRView; - - d3d11::Buffer mQuadVB; - d3d11::SamplerState mPassThroughSampler; - d3d11::InputLayout mPassThroughIL; - d3d11::VertexShader mPassThroughVS; - d3d11::PixelShader mPassThroughPS; - d3d11::RasterizerState mPassThroughRS; - - SurfaceRenderTarget11 mColorRenderTarget; - SurfaceRenderTarget11 mDepthStencilRenderTarget; - - EGLint mEGLSamples; - LONGLONG mQPCFrequency; -}; - -} // namespace rx -#endif // LIBANGLE_RENDERER_D3D_D3D11_SWAPCHAIN11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp deleted file mode 100644 index b702450ded..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp +++ /dev/null @@ -1,3155 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// TextureStorage11.cpp: Implements the abstract rx::TextureStorage11 class and its concrete derived -// classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11 -// texture. - -#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h" - -#include <tuple> - -#include "common/MemoryBuffer.h" -#include "common/utilities.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/ImageIndex.h" -#include "libANGLE/renderer/d3d/d3d11/Blit11.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/Image11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" -#include "libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h" -#include "libANGLE/renderer/d3d/d3d11/SwapChain11.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" -#include "libANGLE/renderer/d3d/EGLImageD3D.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" - -namespace rx -{ - -namespace -{ - -void InvalidateRenderTarget(const gl::Context *context, RenderTarget11 *renderTarget) -{ - if (renderTarget) - { - renderTarget->signalDirty(context); - } -} - -RenderTarget11 *GetRenderTarget(std::unique_ptr<RenderTarget11> *pointer) -{ - return pointer->get(); -} - -template <typename KeyT> -RenderTarget11 *GetRenderTarget(std::pair<KeyT, std::unique_ptr<RenderTarget11>> *pair) -{ - return pair->second.get(); -} - -template <typename T> -void InvalidateRenderTargetContainer(const gl::Context *context, T *renderTargetContainer) -{ - for (auto &rt : *renderTargetContainer) - { - InvalidateRenderTarget(context, GetRenderTarget(&rt)); - } -} - -} // anonymous namespace - -TextureStorage11::SRVKey::SRVKey(int baseLevel, int mipLevels, bool swizzle, bool dropStencil) - : baseLevel(baseLevel), mipLevels(mipLevels), swizzle(swizzle), dropStencil(dropStencil) -{ -} - -bool TextureStorage11::SRVKey::operator<(const SRVKey &rhs) const -{ - return std::tie(baseLevel, mipLevels, swizzle, dropStencil) < - std::tie(rhs.baseLevel, rhs.mipLevels, rhs.swizzle, rhs.dropStencil); -} - -TextureStorage11::TextureStorage11(Renderer11 *renderer, - UINT bindFlags, - UINT miscFlags, - GLenum internalFormat) - : mRenderer(renderer), - mTopLevel(0), - mMipLevels(0), - mFormatInfo(d3d11::Format::Get(internalFormat, mRenderer->getRenderer11DeviceCaps())), - mTextureWidth(0), - mTextureHeight(0), - mTextureDepth(0), - mDropStencilTexture(), - mBindFlags(bindFlags), - mMiscFlags(miscFlags) -{ -} - -TextureStorage11::~TextureStorage11() -{ - mSrvCache.clear(); -} - -DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat, - const Renderer11DeviceCaps &renderer11DeviceCaps, - bool renderTarget) -{ - UINT bindFlags = 0; - - const d3d11::Format &formatInfo = d3d11::Format::Get(internalFormat, renderer11DeviceCaps); - if (formatInfo.srvFormat != DXGI_FORMAT_UNKNOWN) - { - bindFlags |= D3D11_BIND_SHADER_RESOURCE; - } - if (formatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN) - { - bindFlags |= D3D11_BIND_DEPTH_STENCIL; - } - if (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN && renderTarget) - { - bindFlags |= D3D11_BIND_RENDER_TARGET; - } - - return bindFlags; -} - -DWORD TextureStorage11::GetTextureMiscFlags(GLenum internalFormat, - const Renderer11DeviceCaps &renderer11DeviceCaps, - bool renderTarget, - int levels) -{ - UINT miscFlags = 0; - - const d3d11::Format &formatInfo = d3d11::Format::Get(internalFormat, renderer11DeviceCaps); - if (renderTarget && levels > 1) - { - if (d3d11::SupportsMipGen(formatInfo.texFormat, renderer11DeviceCaps.featureLevel)) - { - miscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS; - } - } - - return miscFlags; -} - -UINT TextureStorage11::getBindFlags() const -{ - return mBindFlags; -} - -UINT TextureStorage11::getMiscFlags() const -{ - return mMiscFlags; -} - -int TextureStorage11::getTopLevel() const -{ - // Applying top level is meant to be encapsulated inside TextureStorage11. - UNREACHABLE(); - return mTopLevel; -} - -bool TextureStorage11::isRenderTarget() const -{ - return (mBindFlags & (D3D11_BIND_RENDER_TARGET | D3D11_BIND_DEPTH_STENCIL)) != 0; -} - -bool TextureStorage11::isManaged() const -{ - return false; -} - -bool TextureStorage11::supportsNativeMipmapFunction() const -{ - return (mMiscFlags & D3D11_RESOURCE_MISC_GENERATE_MIPS) != 0; -} - -int TextureStorage11::getLevelCount() const -{ - return mMipLevels - mTopLevel; -} - -int TextureStorage11::getLevelWidth(int mipLevel) const -{ - return std::max(static_cast<int>(mTextureWidth) >> mipLevel, 1); -} - -int TextureStorage11::getLevelHeight(int mipLevel) const -{ - return std::max(static_cast<int>(mTextureHeight) >> mipLevel, 1); -} - -int TextureStorage11::getLevelDepth(int mipLevel) const -{ - return std::max(static_cast<int>(mTextureDepth) >> mipLevel, 1); -} - -gl::Error TextureStorage11::getMippedResource(const gl::Context *context, - const TextureHelper11 **outResource) -{ - return getResource(context, outResource); -} - -UINT TextureStorage11::getSubresourceIndex(const gl::ImageIndex &index) const -{ - UINT mipSlice = static_cast<UINT>(index.mipIndex + mTopLevel); - UINT arraySlice = static_cast<UINT>(index.hasLayer() ? index.layerIndex : 0); - UINT subresource = D3D11CalcSubresource(mipSlice, arraySlice, mMipLevels); - ASSERT(subresource != std::numeric_limits<UINT>::max()); - return subresource; -} - -gl::Error TextureStorage11::getSRV(const gl::Context *context, - const gl::TextureState &textureState, - const d3d11::SharedSRV **outSRV) -{ - // Make sure to add the level offset for our tiny compressed texture workaround - const GLuint effectiveBaseLevel = textureState.getEffectiveBaseLevel(); - bool swizzleRequired = textureState.swizzleRequired(); - bool mipmapping = gl::IsMipmapFiltered(textureState.getSamplerState()); - unsigned int mipLevels = - mipmapping ? (textureState.getEffectiveMaxLevel() - effectiveBaseLevel + 1) : 1; - - // Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level, - // which corresponds to GL level 0) - mipLevels = std::min(mipLevels, mMipLevels - mTopLevel - effectiveBaseLevel); - - if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3) - { - ASSERT(!swizzleRequired); - ASSERT(mipLevels == 1 || mipLevels == mMipLevels); - } - - if (mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - // We must ensure that the level zero texture is in sync with mipped texture. - ANGLE_TRY(useLevelZeroWorkaroundTexture(context, mipLevels == 1)); - } - - if (swizzleRequired) - { - verifySwizzleExists(textureState.getSwizzleState()); - } - - // We drop the stencil when sampling from the SRV if three conditions hold: - // 1. the drop stencil workaround is enabled. - bool workaround = mRenderer->getWorkarounds().emulateTinyStencilTextures; - // 2. this is a stencil texture. - bool hasStencil = (mFormatInfo.format().stencilBits > 0); - // 3. the texture has a 1x1 or 2x2 mip. - int effectiveTopLevel = effectiveBaseLevel + mipLevels - 1; - bool hasSmallMips = - (getLevelWidth(effectiveTopLevel) <= 2 || getLevelHeight(effectiveTopLevel) <= 2); - - bool useDropStencil = (workaround && hasStencil && hasSmallMips); - SRVKey key(effectiveBaseLevel, mipLevels, swizzleRequired, useDropStencil); - if (useDropStencil) - { - // Ensure drop texture gets created. - DropStencil result = DropStencil::CREATED; - ANGLE_TRY_RESULT(ensureDropStencilTexture(context), result); - - // Clear the SRV cache if necessary. - // TODO(jmadill): Re-use find query result. - auto srvEntry = mSrvCache.find(key); - if (result == DropStencil::CREATED && srvEntry != mSrvCache.end()) - { - mSrvCache.erase(key); - } - } - - ANGLE_TRY(getCachedOrCreateSRV(context, key, outSRV)); - - return gl::NoError(); -} - -gl::Error TextureStorage11::getCachedOrCreateSRV(const gl::Context *context, - const SRVKey &key, - const d3d11::SharedSRV **outSRV) -{ - auto iter = mSrvCache.find(key); - if (iter != mSrvCache.end()) - { - *outSRV = &iter->second; - return gl::NoError(); - } - - const TextureHelper11 *texture = nullptr; - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; - - if (key.swizzle) - { - const auto &swizzleFormat = - mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()); - ASSERT(!key.dropStencil || swizzleFormat.format().stencilBits == 0); - ANGLE_TRY(getSwizzleTexture(&texture)); - format = swizzleFormat.srvFormat; - } - else if (key.dropStencil) - { - ASSERT(mDropStencilTexture.valid()); - texture = &mDropStencilTexture; - format = DXGI_FORMAT_R32_FLOAT; - } - else - { - ANGLE_TRY(getResource(context, &texture)); - format = mFormatInfo.srvFormat; - } - - d3d11::SharedSRV srv; - - ANGLE_TRY(createSRV(context, key.baseLevel, key.mipLevels, format, *texture, &srv)); - - const auto &insertIt = mSrvCache.insert(std::make_pair(key, std::move(srv))); - *outSRV = &insertIt.first->second; - - return gl::NoError(); -} - -gl::Error TextureStorage11::getSRVLevel(const gl::Context *context, - int mipLevel, - bool blitSRV, - const d3d11::SharedSRV **outSRV) -{ - ASSERT(mipLevel >= 0 && mipLevel < getLevelCount()); - - auto &levelSRVs = (blitSRV) ? mLevelBlitSRVs : mLevelSRVs; - auto &otherLevelSRVs = (blitSRV) ? mLevelSRVs : mLevelBlitSRVs; - - if (!levelSRVs[mipLevel].valid()) - { - // Only create a different SRV for blit if blit format is different from regular srv format - if (otherLevelSRVs[mipLevel].valid() && mFormatInfo.srvFormat == mFormatInfo.blitSRVFormat) - { - levelSRVs[mipLevel] = otherLevelSRVs[mipLevel].makeCopy(); - } - else - { - const TextureHelper11 *resource = nullptr; - ANGLE_TRY(getResource(context, &resource)); - - DXGI_FORMAT resourceFormat = - blitSRV ? mFormatInfo.blitSRVFormat : mFormatInfo.srvFormat; - ANGLE_TRY( - createSRV(context, mipLevel, 1, resourceFormat, *resource, &levelSRVs[mipLevel])); - } - } - - *outSRV = &levelSRVs[mipLevel]; - - return gl::NoError(); -} - -gl::Error TextureStorage11::getSRVLevels(const gl::Context *context, - GLint baseLevel, - GLint maxLevel, - const d3d11::SharedSRV **outSRV) -{ - unsigned int mipLevels = maxLevel - baseLevel + 1; - - // Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level, - // which corresponds to GL level 0) - mipLevels = std::min(mipLevels, mMipLevels - mTopLevel - baseLevel); - - if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3) - { - ASSERT(mipLevels == 1 || mipLevels == mMipLevels); - } - - if (mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - // We must ensure that the level zero texture is in sync with mipped texture. - ANGLE_TRY(useLevelZeroWorkaroundTexture(context, mipLevels == 1)); - } - - // TODO(jmadill): Assert we don't need to drop stencil. - - SRVKey key(baseLevel, mipLevels, false, false); - ANGLE_TRY(getCachedOrCreateSRV(context, key, outSRV)); - - return gl::NoError(); -} - -const d3d11::Format &TextureStorage11::getFormatSet() const -{ - return mFormatInfo; -} - -gl::Error TextureStorage11::generateSwizzles(const gl::Context *context, - const gl::SwizzleState &swizzleTarget) -{ - for (int level = 0; level < getLevelCount(); level++) - { - // Check if the swizzle for this level is out of date - if (mSwizzleCache[level] != swizzleTarget) - { - // Need to re-render the swizzle for this level - const d3d11::SharedSRV *sourceSRV = nullptr; - ANGLE_TRY(getSRVLevel(context, level, true, &sourceSRV)); - - const d3d11::RenderTargetView *destRTV; - ANGLE_TRY(getSwizzleRenderTarget(level, &destRTV)); - - gl::Extents size(getLevelWidth(level), getLevelHeight(level), getLevelDepth(level)); - - Blit11 *blitter = mRenderer->getBlitter(); - - ANGLE_TRY(blitter->swizzleTexture(context, *sourceSRV, *destRTV, size, swizzleTarget)); - - mSwizzleCache[level] = swizzleTarget; - } - } - - return gl::NoError(); -} - -void TextureStorage11::markLevelDirty(int mipLevel) -{ - if (mipLevel >= 0 && static_cast<size_t>(mipLevel) < mSwizzleCache.size()) - { - // The default constructor of SwizzleState has GL_INVALID_INDEX for all channels which is - // not a valid swizzle combination - if (mSwizzleCache[mipLevel] != gl::SwizzleState()) - { - // TODO(jmadill): Invalidate specific swizzle. - mRenderer->getStateManager()->invalidateSwizzles(); - mSwizzleCache[mipLevel] = gl::SwizzleState(); - } - } - - if (mDropStencilTexture.valid()) - { - mDropStencilTexture.reset(); - } -} - -void TextureStorage11::markDirty() -{ - for (size_t mipLevel = 0; mipLevel < mSwizzleCache.size(); ++mipLevel) - { - markLevelDirty(static_cast<int>(mipLevel)); - } -} - -gl::Error TextureStorage11::updateSubresourceLevel(const gl::Context *context, - const TextureHelper11 &srcTexture, - unsigned int sourceSubresource, - const gl::ImageIndex &index, - const gl::Box ©Area) -{ - ASSERT(srcTexture.valid()); - - const GLint level = index.mipIndex; - - markLevelDirty(level); - - gl::Extents texSize(getLevelWidth(level), getLevelHeight(level), getLevelDepth(level)); - - bool fullCopy = copyArea.x == 0 && copyArea.y == 0 && copyArea.z == 0 && - copyArea.width == texSize.width && copyArea.height == texSize.height && - copyArea.depth == texSize.depth; - - const TextureHelper11 *dstTexture = nullptr; - - // If the zero-LOD workaround is active and we want to update a level greater than zero, then we - // should update the mipmapped texture, even if mapmaps are currently disabled. - if (index.mipIndex > 0 && mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - ANGLE_TRY(getMippedResource(context, &dstTexture)); - } - else - { - ANGLE_TRY(getResource(context, &dstTexture)); - } - - unsigned int dstSubresource = getSubresourceIndex(index); - - ASSERT(dstTexture->valid()); - - const d3d11::DXGIFormatSize &dxgiFormatSizeInfo = - d3d11::GetDXGIFormatSizeInfo(mFormatInfo.texFormat); - if (!fullCopy && mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN) - { - // CopySubresourceRegion cannot copy partial depth stencils, use the blitter instead - Blit11 *blitter = mRenderer->getBlitter(); - return blitter->copyDepthStencil(srcTexture, sourceSubresource, copyArea, texSize, - *dstTexture, dstSubresource, copyArea, texSize, nullptr); - } - - D3D11_BOX srcBox; - srcBox.left = copyArea.x; - srcBox.top = copyArea.y; - srcBox.right = - copyArea.x + roundUp(static_cast<UINT>(copyArea.width), dxgiFormatSizeInfo.blockWidth); - srcBox.bottom = - copyArea.y + roundUp(static_cast<UINT>(copyArea.height), dxgiFormatSizeInfo.blockHeight); - srcBox.front = copyArea.z; - srcBox.back = copyArea.z + copyArea.depth; - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - deviceContext->CopySubresourceRegion(dstTexture->get(), dstSubresource, copyArea.x, copyArea.y, - copyArea.z, srcTexture.get(), sourceSubresource, - fullCopy ? nullptr : &srcBox); - return gl::NoError(); -} - -gl::Error TextureStorage11::copySubresourceLevel(const gl::Context *context, - const TextureHelper11 &dstTexture, - unsigned int dstSubresource, - const gl::ImageIndex &index, - const gl::Box ®ion) -{ - ASSERT(dstTexture.valid()); - - const TextureHelper11 *srcTexture = nullptr; - - // If the zero-LOD workaround is active and we want to update a level greater than zero, then we - // should update the mipmapped texture, even if mapmaps are currently disabled. - if (index.mipIndex > 0 && mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - ANGLE_TRY(getMippedResource(context, &srcTexture)); - } - else - { - ANGLE_TRY(getResource(context, &srcTexture)); - } - - ASSERT(srcTexture->valid()); - - unsigned int srcSubresource = getSubresourceIndex(index); - - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - // D3D11 can't perform partial CopySubresourceRegion on depth/stencil textures, so pSrcBox - // should be nullptr. - D3D11_BOX srcBox; - D3D11_BOX *pSrcBox = nullptr; - if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3) - { - GLsizei width = region.width; - GLsizei height = region.height; - d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, nullptr); - - // Keep srcbox as nullptr if we're dealing with tiny mips of compressed textures. - if (width == region.width && height == region.height) - { - // However, D3D10Level9 doesn't always perform CopySubresourceRegion correctly unless - // the source box is specified. This is okay, since we don't perform - // CopySubresourceRegion on depth/stencil textures on 9_3. - ASSERT(mFormatInfo.dsvFormat == DXGI_FORMAT_UNKNOWN); - srcBox.left = region.x; - srcBox.right = region.x + region.width; - srcBox.top = region.y; - srcBox.bottom = region.y + region.height; - srcBox.front = region.z; - srcBox.back = region.z + region.depth; - pSrcBox = &srcBox; - } - } - - deviceContext->CopySubresourceRegion(dstTexture.get(), dstSubresource, region.x, region.y, - region.z, srcTexture->get(), srcSubresource, pSrcBox); - - return gl::NoError(); -} - -gl::Error TextureStorage11::generateMipmap(const gl::Context *context, - const gl::ImageIndex &sourceIndex, - const gl::ImageIndex &destIndex) -{ - ASSERT(sourceIndex.layerIndex == destIndex.layerIndex); - - markLevelDirty(destIndex.mipIndex); - - RenderTargetD3D *source = nullptr; - ANGLE_TRY(getRenderTarget(context, sourceIndex, &source)); - - RenderTargetD3D *dest = nullptr; - ANGLE_TRY(getRenderTarget(context, destIndex, &dest)); - - RenderTarget11 *rt11 = GetAs<RenderTarget11>(source); - const d3d11::SharedSRV &sourceSRV = rt11->getBlitShaderResourceView(); - const d3d11::RenderTargetView &destRTV = rt11->getRenderTargetView(); - - gl::Box sourceArea(0, 0, 0, source->getWidth(), source->getHeight(), source->getDepth()); - gl::Extents sourceSize(source->getWidth(), source->getHeight(), source->getDepth()); - - gl::Box destArea(0, 0, 0, dest->getWidth(), dest->getHeight(), dest->getDepth()); - gl::Extents destSize(dest->getWidth(), dest->getHeight(), dest->getDepth()); - - Blit11 *blitter = mRenderer->getBlitter(); - GLenum format = gl::GetUnsizedFormat(source->getInternalFormat()); - return blitter->copyTexture(context, sourceSRV, sourceArea, sourceSize, format, destRTV, - destArea, destSize, nullptr, format, GL_LINEAR, false, false, - false); -} - -void TextureStorage11::verifySwizzleExists(const gl::SwizzleState &swizzleState) -{ - for (unsigned int level = 0; level < mMipLevels; level++) - { - ASSERT(mSwizzleCache[level] == swizzleState); - } -} - -void TextureStorage11::clearSRVCache() -{ - markDirty(); - mSrvCache.clear(); - - for (size_t level = 0; level < mLevelSRVs.size(); level++) - { - mLevelSRVs[level].reset(); - mLevelBlitSRVs[level].reset(); - } -} - -gl::Error TextureStorage11::copyToStorage(const gl::Context *context, TextureStorage *destStorage) -{ - ASSERT(destStorage); - - const TextureHelper11 *sourceResouce = nullptr; - ANGLE_TRY(getResource(context, &sourceResouce)); - - TextureStorage11 *dest11 = GetAs<TextureStorage11>(destStorage); - const TextureHelper11 *destResource = nullptr; - ANGLE_TRY(dest11->getResource(context, &destResource)); - - ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext(); - immediateContext->CopyResource(destResource->get(), sourceResouce->get()); - - dest11->markDirty(); - - return gl::NoError(); -} - -gl::Error TextureStorage11::setData(const gl::Context *context, - const gl::ImageIndex &index, - ImageD3D *image, - const gl::Box *destBox, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixelData) -{ - ASSERT(!image->isDirty()); - - markLevelDirty(index.mipIndex); - - const TextureHelper11 *resource = nullptr; - ANGLE_TRY(getResource(context, &resource)); - ASSERT(resource && resource->valid()); - - UINT destSubresource = getSubresourceIndex(index); - - const gl::InternalFormat &internalFormatInfo = - gl::GetInternalFormatInfo(image->getInternalFormat(), type); - - gl::Box levelBox(0, 0, 0, getLevelWidth(index.mipIndex), getLevelHeight(index.mipIndex), - getLevelDepth(index.mipIndex)); - bool fullUpdate = (destBox == nullptr || *destBox == levelBox); - ASSERT(internalFormatInfo.depthBits == 0 || fullUpdate); - - // TODO(jmadill): Handle compressed formats - // Compressed formats have different load syntax, so we'll have to handle them with slightly - // different logic. Will implemnent this in a follow-up patch, and ensure we do not use SetData - // with compressed formats in the calling logic. - ASSERT(!internalFormatInfo.compressed); - - const int imageWidth = static_cast<int>(image->getWidth()); - const int width = destBox ? destBox->width : imageWidth; - const int imageHeight = static_cast<int>(image->getHeight()); - const int height = destBox ? destBox->height : imageHeight; - const int imageDepth = static_cast<int>(image->getDepth()); - const int depth = destBox ? destBox->depth : imageDepth; - if (imageWidth < width || imageHeight < height || imageDepth < depth) - fullUpdate = true; - GLuint srcRowPitch = 0; - ANGLE_TRY_RESULT( - internalFormatInfo.computeRowPitch(type, width, unpack.alignment, unpack.rowLength), - srcRowPitch); - GLuint srcDepthPitch = 0; - ANGLE_TRY_RESULT(internalFormatInfo.computeDepthPitch(height, unpack.imageHeight, srcRowPitch), - srcDepthPitch); - GLuint srcSkipBytes = 0; - ANGLE_TRY_RESULT( - internalFormatInfo.computeSkipBytes(srcRowPitch, srcDepthPitch, unpack, index.is3D()), - srcSkipBytes); - - const d3d11::Format &d3d11Format = - d3d11::Format::Get(image->getInternalFormat(), mRenderer->getRenderer11DeviceCaps()); - const d3d11::DXGIFormatSize &dxgiFormatInfo = - d3d11::GetDXGIFormatSizeInfo(d3d11Format.texFormat); - - const size_t outputPixelSize = dxgiFormatInfo.pixelBytes; - - UINT bufferRowPitch = static_cast<unsigned int>(outputPixelSize) * width; - UINT bufferDepthPitch = bufferRowPitch * height; - - const size_t neededSize = bufferDepthPitch * depth; - angle::MemoryBuffer *conversionBuffer = nullptr; - const uint8_t *data = nullptr; - - LoadImageFunctionInfo loadFunctionInfo = d3d11Format.getLoadFunctions()(type); - if (loadFunctionInfo.requiresConversion) - { - ANGLE_TRY(mRenderer->getScratchMemoryBuffer(neededSize, &conversionBuffer)); - loadFunctionInfo.loadFunction(width, height, depth, pixelData + srcSkipBytes, srcRowPitch, - srcDepthPitch, conversionBuffer->data(), bufferRowPitch, - bufferDepthPitch); - data = conversionBuffer->data(); - } - else - { - data = pixelData + srcSkipBytes; - bufferRowPitch = srcRowPitch; - bufferDepthPitch = srcDepthPitch; - } - - ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext(); - - if (!fullUpdate) - { - ASSERT(destBox); - - D3D11_BOX destD3DBox; - destD3DBox.left = destBox->x; - destD3DBox.right = destBox->x + destBox->width; - destD3DBox.top = destBox->y; - destD3DBox.bottom = destBox->y + destBox->height; - destD3DBox.front = destBox->z; - destD3DBox.back = destBox->z + destBox->depth; - - immediateContext->UpdateSubresource(resource->get(), destSubresource, &destD3DBox, data, - bufferRowPitch, bufferDepthPitch); - } - else - { - immediateContext->UpdateSubresource(resource->get(), destSubresource, nullptr, data, - bufferRowPitch, bufferDepthPitch); - } - - return gl::NoError(); -} - -gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11::ensureDropStencilTexture( - const gl::Context *context) -{ - UNIMPLEMENTED(); - return gl::InternalError() << "Drop stencil texture not implemented."; -} - -TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain) - : TextureStorage11(renderer, - D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE, - 0, - swapchain->getRenderTargetInternalFormat()), - mTexture(swapchain->getOffscreenTexture()), - mLevelZeroTexture(), - mLevelZeroRenderTarget(nullptr), - mUseLevelZeroTexture(false), - mSwizzleTexture() -{ - for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) - { - mAssociatedImages[i] = nullptr; - mRenderTarget[i] = nullptr; - } - - D3D11_TEXTURE2D_DESC texDesc; - mTexture.getDesc(&texDesc); - mMipLevels = texDesc.MipLevels; - mTextureWidth = texDesc.Width; - mTextureHeight = texDesc.Height; - mTextureDepth = 1; - mHasKeyedMutex = (texDesc.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0; -} - -TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, - GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - int levels, - bool hintLevelZeroOnly) - : TextureStorage11( - renderer, - GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget), - GetTextureMiscFlags(internalformat, - renderer->getRenderer11DeviceCaps(), - renderTarget, - levels), - internalformat), - mTexture(), - mHasKeyedMutex(false), - mLevelZeroTexture(), - mLevelZeroRenderTarget(nullptr), - mUseLevelZeroTexture(hintLevelZeroOnly && levels > 1), - mSwizzleTexture() -{ - for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) - { - mAssociatedImages[i] = nullptr; - mRenderTarget[i] = nullptr; - } - - d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, &mTopLevel); - mMipLevels = mTopLevel + levels; - mTextureWidth = width; - mTextureHeight = height; - mTextureDepth = 1; - - // The LevelZeroOnly hint should only be true if the zero max LOD workaround is active. - ASSERT(!mUseLevelZeroTexture || mRenderer->getWorkarounds().zeroMaxLodWorkaround); -} - -gl::Error TextureStorage11_2D::onDestroy(const gl::Context *context) -{ - for (unsigned i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) - { - if (mAssociatedImages[i] != nullptr) - { - mAssociatedImages[i]->verifyAssociatedStorageValid(this); - - // We must let the Images recover their data before we delete it from the - // TextureStorage. - ANGLE_TRY(mAssociatedImages[i]->recoverFromAssociatedStorage(context)); - } - } - - if (mHasKeyedMutex) - { - // If the keyed mutex is released that will unbind it and cause the state cache to become - // desynchronized. - mRenderer->getStateManager()->invalidateBoundViews(); - } - - // Invalidate RenderTargets. - InvalidateRenderTargetContainer(context, &mRenderTarget); - InvalidateRenderTarget(context, mLevelZeroRenderTarget.get()); - - return gl::NoError(); -} - -TextureStorage11_2D::~TextureStorage11_2D() -{ -} - -gl::Error TextureStorage11_2D::copyToStorage(const gl::Context *context, - TextureStorage *destStorage) -{ - ASSERT(destStorage); - - TextureStorage11_2D *dest11 = GetAs<TextureStorage11_2D>(destStorage); - ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext(); - - if (mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - // If either mTexture or mLevelZeroTexture exist, then we need to copy them into the - // corresponding textures in destStorage. - if (mTexture.valid()) - { - ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(context, false)); - - const TextureHelper11 *destResource = nullptr; - ANGLE_TRY(dest11->getResource(context, &destResource)); - - immediateContext->CopyResource(destResource->get(), mTexture.get()); - } - - if (mLevelZeroTexture.valid()) - { - ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(context, true)); - - const TextureHelper11 *destResource = nullptr; - ANGLE_TRY(dest11->getResource(context, &destResource)); - - immediateContext->CopyResource(destResource->get(), mLevelZeroTexture.get()); - } - - return gl::NoError(); - } - - const TextureHelper11 *sourceResouce = nullptr; - ANGLE_TRY(getResource(context, &sourceResouce)); - - const TextureHelper11 *destResource = nullptr; - ANGLE_TRY(dest11->getResource(context, &destResource)); - - immediateContext->CopyResource(destResource->get(), sourceResouce->get()); - dest11->markDirty(); - - return gl::NoError(); -} - -gl::Error TextureStorage11_2D::useLevelZeroWorkaroundTexture(const gl::Context *context, - bool useLevelZeroTexture) -{ - bool lastSetting = mUseLevelZeroTexture; - - if (useLevelZeroTexture && mMipLevels > 1) - { - if (!mUseLevelZeroTexture && mTexture.valid()) - { - ANGLE_TRY(ensureTextureExists(1)); - - // Pull data back from the mipped texture if necessary. - ASSERT(mLevelZeroTexture.valid()); - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - deviceContext->CopySubresourceRegion(mLevelZeroTexture.get(), 0, 0, 0, 0, - mTexture.get(), 0, nullptr); - } - - mUseLevelZeroTexture = true; - } - else - { - if (mUseLevelZeroTexture && mLevelZeroTexture.valid()) - { - ANGLE_TRY(ensureTextureExists(mMipLevels)); - - // Pull data back from the level zero texture if necessary. - ASSERT(mTexture.valid()); - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - deviceContext->CopySubresourceRegion(mTexture.get(), 0, 0, 0, 0, - mLevelZeroTexture.get(), 0, nullptr); - } - - mUseLevelZeroTexture = false; - } - - if (lastSetting != mUseLevelZeroTexture) - { - // Mark everything as dirty to be conservative. - if (mLevelZeroRenderTarget) - { - mLevelZeroRenderTarget->signalDirty(context); - } - for (auto &renderTarget : mRenderTarget) - { - if (renderTarget) - { - renderTarget->signalDirty(context); - } - } - } - - return gl::NoError(); -} - -void TextureStorage11_2D::associateImage(Image11 *image, const gl::ImageIndex &index) -{ - const GLint level = index.mipIndex; - - ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - - if (0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - { - mAssociatedImages[level] = image; - } -} - -void TextureStorage11_2D::verifyAssociatedImageValid(const gl::ImageIndex &index, - Image11 *expectedImage) -{ - const GLint level = index.mipIndex; - - ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - // This validation check should never return false. It means the Image/TextureStorage - // association is broken. - ASSERT(mAssociatedImages[level] == expectedImage); -} - -// disassociateImage allows an Image to end its association with a Storage. -void TextureStorage11_2D::disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) -{ - const GLint level = index.mipIndex; - - ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(mAssociatedImages[level] == expectedImage); - mAssociatedImages[level] = nullptr; -} - -// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image -// recover its data before ending the association. -gl::Error TextureStorage11_2D::releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) -{ - const GLint level = index.mipIndex; - - ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - - if (0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - { - // No need to let the old Image recover its data, if it is also the incoming Image. - if (mAssociatedImages[level] != nullptr && mAssociatedImages[level] != incomingImage) - { - // Ensure that the Image is still associated with this TextureStorage. - mAssociatedImages[level]->verifyAssociatedStorageValid(this); - - // Force the image to recover from storage before its data is overwritten. - // This will reset mAssociatedImages[level] to nullptr too. - ANGLE_TRY(mAssociatedImages[level]->recoverFromAssociatedStorage(context)); - } - } - - return gl::NoError(); -} - -gl::Error TextureStorage11_2D::getResource(const gl::Context *context, - const TextureHelper11 **outResource) -{ - if (mUseLevelZeroTexture && mMipLevels > 1) - { - ANGLE_TRY(ensureTextureExists(1)); - - *outResource = &mLevelZeroTexture; - return gl::NoError(); - } - - ANGLE_TRY(ensureTextureExists(mMipLevels)); - - *outResource = &mTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_2D::getMippedResource(const gl::Context *context, - const TextureHelper11 **outResource) -{ - // This shouldn't be called unless the zero max LOD workaround is active. - ASSERT(mRenderer->getWorkarounds().zeroMaxLodWorkaround); - - ANGLE_TRY(ensureTextureExists(mMipLevels)); - - *outResource = &mTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_2D::ensureTextureExists(int mipLevels) -{ - // If mMipLevels = 1 then always use mTexture rather than mLevelZeroTexture. - bool useLevelZeroTexture = mRenderer->getWorkarounds().zeroMaxLodWorkaround - ? (mipLevels == 1) && (mMipLevels > 1) - : false; - TextureHelper11 *outputTexture = useLevelZeroTexture ? &mLevelZeroTexture : &mTexture; - - // if the width or height is not positive this should be treated as an incomplete texture - // we handle that here by skipping the d3d texture creation - if (!outputTexture->valid() && mTextureWidth > 0 && mTextureHeight > 0) - { - ASSERT(mipLevels > 0); - - D3D11_TEXTURE2D_DESC desc; - desc.Width = mTextureWidth; // Compressed texture size constraints? - desc.Height = mTextureHeight; - desc.MipLevels = mipLevels; - desc.ArraySize = 1; - desc.Format = mFormatInfo.texFormat; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = getBindFlags(); - desc.CPUAccessFlags = 0; - desc.MiscFlags = getMiscFlags(); - - ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, outputTexture)); - outputTexture->setDebugName("TexStorage2D.Texture"); - } - - return gl::NoError(); -} - -gl::Error TextureStorage11_2D::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - ASSERT(!index.hasLayer()); - - const int level = index.mipIndex; - ASSERT(level >= 0 && level < getLevelCount()); - - // In GL ES 2.0, the application can only render to level zero of the texture (Section 4.4.3 of - // the GLES 2.0 spec, page 113 of version 2.0.25). Other parts of TextureStorage11_2D could - // create RTVs on non-zero levels of the texture (e.g. generateMipmap). - // On Feature Level 9_3, this is unlikely to be useful. The renderer can't create SRVs on the - // individual levels of the texture, so methods like generateMipmap can't do anything useful - // with non-zero-level RTVs. Therefore if level > 0 on 9_3 then there's almost certainly - // something wrong. - ASSERT( - !(mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3 && level > 0)); - ASSERT(outRT); - if (mRenderTarget[level]) - { - *outRT = mRenderTarget[level].get(); - return gl::NoError(); - } - - if (mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - ASSERT(index.mipIndex == 0); - ANGLE_TRY(useLevelZeroWorkaroundTexture(context, true)); - } - - const TextureHelper11 *texture = nullptr; - ANGLE_TRY(getResource(context, &texture)); - - const d3d11::SharedSRV *srv = nullptr; - ANGLE_TRY(getSRVLevel(context, level, false, &srv)); - - const d3d11::SharedSRV *blitSRV = nullptr; - ANGLE_TRY(getSRVLevel(context, level, true, &blitSRV)); - - if (mUseLevelZeroTexture) - { - if (!mLevelZeroRenderTarget) - { - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = mFormatInfo.rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - rtvDesc.Texture2D.MipSlice = mTopLevel + level; - - d3d11::RenderTargetView rtv; - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mLevelZeroTexture.get(), &rtv)); - - mLevelZeroRenderTarget.reset(new TextureRenderTarget11( - std::move(rtv), mLevelZeroTexture, d3d11::SharedSRV(), d3d11::SharedSRV(), - mFormatInfo.internalFormat, getFormatSet(), getLevelWidth(level), - getLevelHeight(level), 1, 0)); - } - - *outRT = mLevelZeroRenderTarget.get(); - return gl::NoError(); - } - - if (mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN) - { - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = mFormatInfo.rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - rtvDesc.Texture2D.MipSlice = mTopLevel + level; - - d3d11::RenderTargetView rtv; - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv)); - - mRenderTarget[level].reset(new TextureRenderTarget11( - std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat, getFormatSet(), - getLevelWidth(level), getLevelHeight(level), 1, 0)); - - *outRT = mRenderTarget[level].get(); - return gl::NoError(); - } - - ASSERT(mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN); - - D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; - dsvDesc.Format = mFormatInfo.dsvFormat; - dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; - dsvDesc.Texture2D.MipSlice = mTopLevel + level; - dsvDesc.Flags = 0; - - d3d11::DepthStencilView dsv; - ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv)); - - mRenderTarget[level].reset(new TextureRenderTarget11( - std::move(dsv), *texture, *srv, mFormatInfo.internalFormat, getFormatSet(), - getLevelWidth(level), getLevelHeight(level), 1, 0)); - - *outRT = mRenderTarget[level].get(); - return gl::NoError(); -} - -gl::Error TextureStorage11_2D::createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) -{ - ASSERT(outSRV); - - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = format; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MostDetailedMip = mTopLevel + baseLevel; - srvDesc.Texture2D.MipLevels = mipLevels; - - const TextureHelper11 *srvTexture = &texture; - - if (mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - ASSERT(mTopLevel == 0); - ASSERT(baseLevel == 0); - // This code also assumes that the incoming texture equals either mLevelZeroTexture or - // mTexture. - - if (mipLevels == 1 && mMipLevels > 1) - { - // We must use a SRV on the level-zero-only texture. - ANGLE_TRY(ensureTextureExists(1)); - srvTexture = &mLevelZeroTexture; - } - else - { - ASSERT(mipLevels == static_cast<int>(mMipLevels)); - ASSERT(mTexture.valid() && texture == mTexture); - srvTexture = &mTexture; - } - } - - ANGLE_TRY(mRenderer->allocateResource(srvDesc, srvTexture->get(), outSRV)); - outSRV->setDebugName("TexStorage2D.SRV"); - - return gl::NoError(); -} - -gl::Error TextureStorage11_2D::getSwizzleTexture(const TextureHelper11 **outTexture) -{ - ASSERT(outTexture); - - if (!mSwizzleTexture.valid()) - { - const auto &format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()); - - D3D11_TEXTURE2D_DESC desc; - desc.Width = mTextureWidth; - desc.Height = mTextureHeight; - desc.MipLevels = mMipLevels; - desc.ArraySize = 1; - desc.Format = format.texFormat; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; - desc.CPUAccessFlags = 0; - desc.MiscFlags = 0; - - ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture)); - mSwizzleTexture.setDebugName("TexStorage2D.SwizzleTexture"); - } - - *outTexture = &mSwizzleTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel, - const d3d11::RenderTargetView **outRTV) -{ - ASSERT(mipLevel >= 0 && mipLevel < getLevelCount()); - ASSERT(outRTV); - - if (!mSwizzleRenderTargets[mipLevel].valid()) - { - const TextureHelper11 *swizzleTexture = nullptr; - ANGLE_TRY(getSwizzleTexture(&swizzleTexture)); - - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = - mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel; - - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(), - &mSwizzleRenderTargets[mipLevel])); - } - - *outRTV = &mSwizzleRenderTargets[mipLevel]; - return gl::NoError(); -} - -gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_2D::ensureDropStencilTexture( - const gl::Context *context) -{ - if (mDropStencilTexture.valid()) - { - return DropStencil::ALREADY_EXISTS; - } - - D3D11_TEXTURE2D_DESC dropDesc = {}; - dropDesc.ArraySize = 1; - dropDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_DEPTH_STENCIL; - dropDesc.CPUAccessFlags = 0; - dropDesc.Format = DXGI_FORMAT_R32_TYPELESS; - dropDesc.Height = mTextureHeight; - dropDesc.MipLevels = mMipLevels; - dropDesc.MiscFlags = 0; - dropDesc.SampleDesc.Count = 1; - dropDesc.SampleDesc.Quality = 0; - dropDesc.Usage = D3D11_USAGE_DEFAULT; - dropDesc.Width = mTextureWidth; - - const auto &format = - d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps()); - ANGLE_TRY(mRenderer->allocateTexture(dropDesc, format, &mDropStencilTexture)); - mDropStencilTexture.setDebugName("TexStorage2D.DropStencil"); - - ANGLE_TRY(initDropStencilTexture(context, gl::ImageIndexIterator::Make2D(0, mMipLevels))); - - return DropStencil::CREATED; -} - -TextureStorage11_External::TextureStorage11_External( - Renderer11 *renderer, - egl::Stream *stream, - const egl::Stream::GLTextureDescription &glDesc) - : TextureStorage11(renderer, D3D11_BIND_SHADER_RESOURCE, 0, glDesc.internalFormat) -{ - ASSERT(stream->getProducerType() == egl::Stream::ProducerType::D3D11TextureNV12); - StreamProducerNV12 *producer = static_cast<StreamProducerNV12 *>(stream->getImplementation()); - mTexture.set(producer->getD3DTexture(), mFormatInfo); - mSubresourceIndex = producer->getArraySlice(); - mTexture.get()->AddRef(); - mMipLevels = 1; - - D3D11_TEXTURE2D_DESC desc; - mTexture.getDesc(&desc); - mTextureWidth = desc.Width; - mTextureHeight = desc.Height; - mTextureDepth = 1; - mHasKeyedMutex = (desc.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0; -} - -gl::Error TextureStorage11_External::onDestroy(const gl::Context *context) -{ - if (mHasKeyedMutex) - { - // If the keyed mutex is released that will unbind it and cause the state cache to become - // desynchronized. - mRenderer->getStateManager()->invalidateBoundViews(); - } - - return gl::NoError(); -} - -TextureStorage11_External::~TextureStorage11_External() -{ -} - -gl::Error TextureStorage11_External::copyToStorage(const gl::Context *context, - TextureStorage *destStorage) -{ - UNIMPLEMENTED(); - return gl::NoError(); -} - -void TextureStorage11_External::associateImage(Image11 *image, const gl::ImageIndex &index) -{ - ASSERT(index.mipIndex == 0); - mAssociatedImage = image; -} - -void TextureStorage11_External::verifyAssociatedImageValid(const gl::ImageIndex &index, - Image11 *expectedImage) -{ - ASSERT(index.mipIndex == 0 && mAssociatedImage == expectedImage); -} - -void TextureStorage11_External::disassociateImage(const gl::ImageIndex &index, - Image11 *expectedImage) -{ - ASSERT(index.mipIndex == 0); - ASSERT(mAssociatedImage == expectedImage); - mAssociatedImage = nullptr; -} - -gl::Error TextureStorage11_External::releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) -{ - ASSERT(index.mipIndex == 0); - - if (mAssociatedImage != nullptr && mAssociatedImage != incomingImage) - { - mAssociatedImage->verifyAssociatedStorageValid(this); - - ANGLE_TRY(mAssociatedImage->recoverFromAssociatedStorage(context)); - } - - return gl::NoError(); -} - -gl::Error TextureStorage11_External::getResource(const gl::Context *context, - const TextureHelper11 **outResource) -{ - *outResource = &mTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_External::getMippedResource(const gl::Context *context, - const TextureHelper11 **outResource) -{ - *outResource = &mTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_External::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - // Render targets are not supported for external textures - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureStorage11_External::createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) -{ - // Since external textures are treates as non-mipmapped textures, we ignore mipmap levels and - // use the specified subresource ID the storage was created with. - ASSERT(mipLevels == 1); - ASSERT(outSRV); - - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = format; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; - // subresource index is equal to the mip level for 2D textures - srvDesc.Texture2DArray.MostDetailedMip = 0; - srvDesc.Texture2DArray.MipLevels = 1; - srvDesc.Texture2DArray.FirstArraySlice = mSubresourceIndex; - srvDesc.Texture2DArray.ArraySize = 1; - - ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV)); - outSRV->setDebugName("TexStorage2D.SRV"); - - return gl::NoError(); -} - -gl::Error TextureStorage11_External::getSwizzleTexture(const TextureHelper11 **outTexture) -{ - UNIMPLEMENTED(); - return gl::InternalError(); -} - -gl::Error TextureStorage11_External::getSwizzleRenderTarget(int mipLevel, - const d3d11::RenderTargetView **outRTV) -{ - UNIMPLEMENTED(); - return gl::InternalError(); -} - -TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer, - EGLImageD3D *eglImage, - RenderTarget11 *renderTarget11) - : TextureStorage11(renderer, - D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE, - 0, - renderTarget11->getInternalFormat()), - mImage(eglImage), - mCurrentRenderTarget(0), - mSwizzleTexture(), - mSwizzleRenderTargets(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) -{ - mCurrentRenderTarget = reinterpret_cast<uintptr_t>(renderTarget11); - - mMipLevels = 1; - mTextureWidth = renderTarget11->getWidth(); - mTextureHeight = renderTarget11->getHeight(); - mTextureDepth = 1; -} - -TextureStorage11_EGLImage::~TextureStorage11_EGLImage() -{ -} - -gl::Error TextureStorage11_EGLImage::getResource(const gl::Context *context, - const TextureHelper11 **outResource) -{ - ANGLE_TRY(checkForUpdatedRenderTarget(context)); - - RenderTarget11 *renderTarget11 = nullptr; - ANGLE_TRY(getImageRenderTarget(context, &renderTarget11)); - *outResource = &renderTarget11->getTexture(); - return gl::NoError(); -} - -gl::Error TextureStorage11_EGLImage::getSRV(const gl::Context *context, - const gl::TextureState &textureState, - const d3d11::SharedSRV **outSRV) -{ - ANGLE_TRY(checkForUpdatedRenderTarget(context)); - return TextureStorage11::getSRV(context, textureState, outSRV); -} - -gl::Error TextureStorage11_EGLImage::getMippedResource(const gl::Context *context, - const TextureHelper11 **) -{ - // This shouldn't be called unless the zero max LOD workaround is active. - // EGL images are unavailable in this configuration. - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureStorage11_EGLImage::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - ASSERT(!index.hasLayer()); - ASSERT(index.mipIndex == 0); - - ANGLE_TRY(checkForUpdatedRenderTarget(context)); - - return mImage->getRenderTarget(context, outRT); -} - -gl::Error TextureStorage11_EGLImage::copyToStorage(const gl::Context *context, - TextureStorage *destStorage) -{ - const TextureHelper11 *sourceResouce = nullptr; - ANGLE_TRY(getResource(context, &sourceResouce)); - - ASSERT(destStorage); - TextureStorage11_2D *dest11 = GetAs<TextureStorage11_2D>(destStorage); - const TextureHelper11 *destResource = nullptr; - ANGLE_TRY(dest11->getResource(context, &destResource)); - - ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext(); - immediateContext->CopyResource(destResource->get(), sourceResouce->get()); - - dest11->markDirty(); - - return gl::NoError(); -} - -void TextureStorage11_EGLImage::associateImage(Image11 *, const gl::ImageIndex &) -{ -} - -void TextureStorage11_EGLImage::disassociateImage(const gl::ImageIndex &, Image11 *) -{ -} - -void TextureStorage11_EGLImage::verifyAssociatedImageValid(const gl::ImageIndex &, Image11 *) -{ -} - -gl::Error TextureStorage11_EGLImage::releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &, - Image11 *) -{ - return gl::NoError(); -} - -gl::Error TextureStorage11_EGLImage::useLevelZeroWorkaroundTexture(const gl::Context *context, bool) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureStorage11_EGLImage::getSwizzleTexture(const TextureHelper11 **outTexture) -{ - ASSERT(outTexture); - - if (!mSwizzleTexture.valid()) - { - const auto &format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()); - - D3D11_TEXTURE2D_DESC desc; - desc.Width = mTextureWidth; - desc.Height = mTextureHeight; - desc.MipLevels = mMipLevels; - desc.ArraySize = 1; - desc.Format = format.texFormat; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; - desc.CPUAccessFlags = 0; - desc.MiscFlags = 0; - - ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture)); - mSwizzleTexture.setDebugName("TexStorageEGLImage.SwizzleTexture"); - } - - *outTexture = &mSwizzleTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_EGLImage::getSwizzleRenderTarget(int mipLevel, - const d3d11::RenderTargetView **outRTV) -{ - ASSERT(mipLevel >= 0 && mipLevel < getLevelCount()); - ASSERT(outRTV); - - if (!mSwizzleRenderTargets[mipLevel].valid()) - { - const TextureHelper11 *swizzleTexture = nullptr; - ANGLE_TRY(getSwizzleTexture(&swizzleTexture)); - - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = - mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel; - - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(), - &mSwizzleRenderTargets[mipLevel])); - } - - *outRTV = &mSwizzleRenderTargets[mipLevel]; - return gl::NoError(); -} - -gl::Error TextureStorage11_EGLImage::checkForUpdatedRenderTarget(const gl::Context *context) -{ - RenderTarget11 *renderTarget11 = nullptr; - ANGLE_TRY(getImageRenderTarget(context, &renderTarget11)); - - if (mCurrentRenderTarget != reinterpret_cast<uintptr_t>(renderTarget11)) - { - clearSRVCache(); - mCurrentRenderTarget = reinterpret_cast<uintptr_t>(renderTarget11); - } - - return gl::NoError(); -} - -gl::Error TextureStorage11_EGLImage::createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) -{ - ASSERT(baseLevel == 0); - ASSERT(mipLevels == 1); - ASSERT(outSRV); - - // Create a new SRV only for the swizzle texture. Otherwise just return the Image's - // RenderTarget's SRV. - if (texture == mSwizzleTexture) - { - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = format; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MostDetailedMip = mTopLevel + baseLevel; - srvDesc.Texture2D.MipLevels = mipLevels; - - ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV)); - outSRV->setDebugName("TexStorageEGLImage.SRV"); - } - else - { - RenderTarget11 *renderTarget = nullptr; - ANGLE_TRY(getImageRenderTarget(context, &renderTarget)); - - ASSERT(texture == renderTarget->getTexture()); - - *outSRV = renderTarget->getShaderResourceView().makeCopy(); - } - - return gl::NoError(); -} - -gl::Error TextureStorage11_EGLImage::getImageRenderTarget(const gl::Context *context, - RenderTarget11 **outRT) const -{ - RenderTargetD3D *renderTargetD3D = nullptr; - ANGLE_TRY(mImage->getRenderTarget(context, &renderTargetD3D)); - *outRT = GetAs<RenderTarget11>(renderTargetD3D); - return gl::NoError(); -} - -TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, - GLenum internalformat, - bool renderTarget, - int size, - int levels, - bool hintLevelZeroOnly) - : TextureStorage11( - renderer, - GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget), - GetTextureMiscFlags(internalformat, - renderer->getRenderer11DeviceCaps(), - renderTarget, - levels), - internalformat), - mTexture(), - mLevelZeroTexture(), - mUseLevelZeroTexture(hintLevelZeroOnly && levels > 1), - mSwizzleTexture() -{ - for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) - { - for (unsigned int face = 0; face < gl::CUBE_FACE_COUNT; face++) - { - mAssociatedImages[face][level] = nullptr; - mRenderTarget[face][level] = nullptr; - } - } - - for (unsigned int face = 0; face < gl::CUBE_FACE_COUNT; face++) - { - mLevelZeroRenderTarget[face] = nullptr; - } - - // adjust size if needed for compressed textures - int height = size; - d3d11::MakeValidSize(false, mFormatInfo.texFormat, &size, &height, &mTopLevel); - - mMipLevels = mTopLevel + levels; - mTextureWidth = size; - mTextureHeight = size; - mTextureDepth = 1; - - // The LevelZeroOnly hint should only be true if the zero max LOD workaround is active. - ASSERT(!mUseLevelZeroTexture || mRenderer->getWorkarounds().zeroMaxLodWorkaround); -} - -gl::Error TextureStorage11_Cube::onDestroy(const gl::Context *context) -{ - for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) - { - for (unsigned int face = 0; face < gl::CUBE_FACE_COUNT; face++) - { - if (mAssociatedImages[face][level] != nullptr) - { - mAssociatedImages[face][level]->verifyAssociatedStorageValid(this); - - // We must let the Images recover their data before we delete it from the - // TextureStorage. - ANGLE_TRY(mAssociatedImages[face][level]->recoverFromAssociatedStorage(context)); - } - } - } - - for (auto &faceRenderTargets : mRenderTarget) - { - InvalidateRenderTargetContainer(context, &faceRenderTargets); - } - InvalidateRenderTargetContainer(context, &mLevelZeroRenderTarget); - - return gl::NoError(); -} - -TextureStorage11_Cube::~TextureStorage11_Cube() -{ -} - -UINT TextureStorage11_Cube::getSubresourceIndex(const gl::ImageIndex &index) const -{ - if (mRenderer->getWorkarounds().zeroMaxLodWorkaround && mUseLevelZeroTexture && - index.mipIndex == 0) - { - UINT arraySlice = static_cast<UINT>(index.hasLayer() ? index.layerIndex : 0); - UINT subresource = D3D11CalcSubresource(0, arraySlice, 1); - ASSERT(subresource != std::numeric_limits<UINT>::max()); - return subresource; - } - else - { - UINT mipSlice = static_cast<UINT>(index.mipIndex + mTopLevel); - UINT arraySlice = static_cast<UINT>(index.hasLayer() ? index.layerIndex : 0); - UINT subresource = D3D11CalcSubresource(mipSlice, arraySlice, mMipLevels); - ASSERT(subresource != std::numeric_limits<UINT>::max()); - return subresource; - } -} - -gl::Error TextureStorage11_Cube::copyToStorage(const gl::Context *context, - TextureStorage *destStorage) -{ - ASSERT(destStorage); - - TextureStorage11_Cube *dest11 = GetAs<TextureStorage11_Cube>(destStorage); - - if (mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext(); - - // If either mTexture or mLevelZeroTexture exist, then we need to copy them into the - // corresponding textures in destStorage. - if (mTexture.valid()) - { - ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(context, false)); - - const TextureHelper11 *destResource = nullptr; - ANGLE_TRY(dest11->getResource(context, &destResource)); - - immediateContext->CopyResource(destResource->get(), mTexture.get()); - } - - if (mLevelZeroTexture.valid()) - { - ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(context, true)); - - const TextureHelper11 *destResource = nullptr; - ANGLE_TRY(dest11->getResource(context, &destResource)); - - immediateContext->CopyResource(destResource->get(), mLevelZeroTexture.get()); - } - } - else - { - const TextureHelper11 *sourceResouce = nullptr; - ANGLE_TRY(getResource(context, &sourceResouce)); - - const TextureHelper11 *destResource = nullptr; - ANGLE_TRY(dest11->getResource(context, &destResource)); - - ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext(); - immediateContext->CopyResource(destResource->get(), sourceResouce->get()); - } - - dest11->markDirty(); - - return gl::NoError(); -} - -gl::Error TextureStorage11_Cube::useLevelZeroWorkaroundTexture(const gl::Context *context, - bool useLevelZeroTexture) -{ - if (useLevelZeroTexture && mMipLevels > 1) - { - if (!mUseLevelZeroTexture && mTexture.valid()) - { - ANGLE_TRY(ensureTextureExists(1)); - - // Pull data back from the mipped texture if necessary. - ASSERT(mLevelZeroTexture.valid()); - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - for (int face = 0; face < 6; face++) - { - deviceContext->CopySubresourceRegion(mLevelZeroTexture.get(), - D3D11CalcSubresource(0, face, 1), 0, 0, 0, - mTexture.get(), face * mMipLevels, nullptr); - } - } - - mUseLevelZeroTexture = true; - } - else - { - if (mUseLevelZeroTexture && mLevelZeroTexture.valid()) - { - ANGLE_TRY(ensureTextureExists(mMipLevels)); - - // Pull data back from the level zero texture if necessary. - ASSERT(mTexture.valid()); - ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); - - for (int face = 0; face < 6; face++) - { - deviceContext->CopySubresourceRegion(mTexture.get(), - D3D11CalcSubresource(0, face, mMipLevels), 0, - 0, 0, mLevelZeroTexture.get(), face, nullptr); - } - } - - mUseLevelZeroTexture = false; - } - - return gl::NoError(); -} - -void TextureStorage11_Cube::associateImage(Image11 *image, const gl::ImageIndex &index) -{ - const GLint level = index.mipIndex; - const GLint layerTarget = index.layerIndex; - - ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT)); - - if (0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - { - if (0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT)) - { - mAssociatedImages[layerTarget][level] = image; - } - } -} - -void TextureStorage11_Cube::verifyAssociatedImageValid(const gl::ImageIndex &index, - Image11 *expectedImage) -{ - const GLint level = index.mipIndex; - const GLint layerTarget = index.layerIndex; - - ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT)); - // This validation check should never return false. It means the Image/TextureStorage - // association is broken. - ASSERT(mAssociatedImages[layerTarget][level] == expectedImage); -} - -// disassociateImage allows an Image to end its association with a Storage. -void TextureStorage11_Cube::disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) -{ - const GLint level = index.mipIndex; - const GLint layerTarget = index.layerIndex; - - ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT)); - ASSERT(mAssociatedImages[layerTarget][level] == expectedImage); - mAssociatedImages[layerTarget][level] = nullptr; -} - -// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image -// recover its data before ending the association. -gl::Error TextureStorage11_Cube::releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) -{ - const GLint level = index.mipIndex; - const GLint layerTarget = index.layerIndex; - - ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT)); - - if ((0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)) - { - if (0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT)) - { - // No need to let the old Image recover its data, if it is also the incoming Image. - if (mAssociatedImages[layerTarget][level] != nullptr && - mAssociatedImages[layerTarget][level] != incomingImage) - { - // Ensure that the Image is still associated with this TextureStorage. - mAssociatedImages[layerTarget][level]->verifyAssociatedStorageValid(this); - - // Force the image to recover from storage before its data is overwritten. - // This will reset mAssociatedImages[level] to nullptr too. - ANGLE_TRY( - mAssociatedImages[layerTarget][level]->recoverFromAssociatedStorage(context)); - } - } - } - - return gl::NoError(); -} - -gl::Error TextureStorage11_Cube::getResource(const gl::Context *context, - const TextureHelper11 **outResource) -{ - if (mUseLevelZeroTexture && mMipLevels > 1) - { - ANGLE_TRY(ensureTextureExists(1)); - *outResource = &mLevelZeroTexture; - return gl::NoError(); - } - else - { - ANGLE_TRY(ensureTextureExists(mMipLevels)); - *outResource = &mTexture; - return gl::NoError(); - } -} - -gl::Error TextureStorage11_Cube::getMippedResource(const gl::Context *context, - const TextureHelper11 **outResource) -{ - // This shouldn't be called unless the zero max LOD workaround is active. - ASSERT(mRenderer->getWorkarounds().zeroMaxLodWorkaround); - - ANGLE_TRY(ensureTextureExists(mMipLevels)); - *outResource = &mTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_Cube::ensureTextureExists(int mipLevels) -{ - // If mMipLevels = 1 then always use mTexture rather than mLevelZeroTexture. - bool useLevelZeroTexture = mRenderer->getWorkarounds().zeroMaxLodWorkaround - ? (mipLevels == 1) && (mMipLevels > 1) - : false; - TextureHelper11 *outputTexture = useLevelZeroTexture ? &mLevelZeroTexture : &mTexture; - - // if the size is not positive this should be treated as an incomplete texture - // we handle that here by skipping the d3d texture creation - if (!outputTexture->valid() && mTextureWidth > 0 && mTextureHeight > 0) - { - ASSERT(mMipLevels > 0); - - D3D11_TEXTURE2D_DESC desc; - desc.Width = mTextureWidth; - desc.Height = mTextureHeight; - desc.MipLevels = mipLevels; - desc.ArraySize = gl::CUBE_FACE_COUNT; - desc.Format = mFormatInfo.texFormat; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = getBindFlags(); - desc.CPUAccessFlags = 0; - desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE | getMiscFlags(); - - ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, outputTexture)); - outputTexture->setDebugName("TexStorageCube.Texture"); - } - - return gl::NoError(); -} - -gl::Error TextureStorage11_Cube::createRenderTargetSRV(const TextureHelper11 &texture, - const gl::ImageIndex &index, - DXGI_FORMAT resourceFormat, - d3d11::SharedSRV *srv) const -{ - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = resourceFormat; - srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + index.mipIndex; - srvDesc.Texture2DArray.MipLevels = 1; - srvDesc.Texture2DArray.FirstArraySlice = index.layerIndex; - srvDesc.Texture2DArray.ArraySize = 1; - - if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_10_0) - { - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; - } - else - { - // Will be used with Texture2D sampler, not TextureCube - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; - } - - ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), srv)); - return gl::NoError(); -} - -gl::Error TextureStorage11_Cube::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - const int faceIndex = index.layerIndex; - const int level = index.mipIndex; - - ASSERT(level >= 0 && level < getLevelCount()); - ASSERT(faceIndex >= 0 && faceIndex < static_cast<GLint>(gl::CUBE_FACE_COUNT)); - - if (!mRenderTarget[faceIndex][level]) - { - if (mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - ASSERT(index.mipIndex == 0); - ANGLE_TRY(useLevelZeroWorkaroundTexture(context, true)); - } - - const TextureHelper11 *texture = nullptr; - ANGLE_TRY(getResource(context, &texture)); - - if (mUseLevelZeroTexture) - { - if (!mLevelZeroRenderTarget[faceIndex]) - { - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = mFormatInfo.rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; - rtvDesc.Texture2DArray.MipSlice = mTopLevel + level; - rtvDesc.Texture2DArray.FirstArraySlice = faceIndex; - rtvDesc.Texture2DArray.ArraySize = 1; - - d3d11::RenderTargetView rtv; - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mLevelZeroTexture.get(), &rtv)); - - mLevelZeroRenderTarget[faceIndex].reset(new TextureRenderTarget11( - std::move(rtv), mLevelZeroTexture, d3d11::SharedSRV(), d3d11::SharedSRV(), - mFormatInfo.internalFormat, getFormatSet(), getLevelWidth(level), - getLevelHeight(level), 1, 0)); - } - - ASSERT(outRT); - *outRT = mLevelZeroRenderTarget[faceIndex].get(); - return gl::NoError(); - } - - d3d11::SharedSRV srv; - ANGLE_TRY(createRenderTargetSRV(*texture, index, mFormatInfo.srvFormat, &srv)); - d3d11::SharedSRV blitSRV; - if (mFormatInfo.blitSRVFormat != mFormatInfo.srvFormat) - { - ANGLE_TRY(createRenderTargetSRV(*texture, index, mFormatInfo.blitSRVFormat, &blitSRV)); - } - else - { - blitSRV = srv.makeCopy(); - } - - srv.setDebugName("TexStorageCube.RenderTargetSRV"); - - if (mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN) - { - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = mFormatInfo.rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; - rtvDesc.Texture2DArray.MipSlice = mTopLevel + level; - rtvDesc.Texture2DArray.FirstArraySlice = faceIndex; - rtvDesc.Texture2DArray.ArraySize = 1; - - d3d11::RenderTargetView rtv; - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv)); - rtv.setDebugName("TexStorageCube.RenderTargetRTV"); - - mRenderTarget[faceIndex][level].reset(new TextureRenderTarget11( - std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(), - getLevelWidth(level), getLevelHeight(level), 1, 0)); - } - else if (mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN) - { - D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; - dsvDesc.Format = mFormatInfo.dsvFormat; - dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; - dsvDesc.Flags = 0; - dsvDesc.Texture2DArray.MipSlice = mTopLevel + level; - dsvDesc.Texture2DArray.FirstArraySlice = faceIndex; - dsvDesc.Texture2DArray.ArraySize = 1; - - d3d11::DepthStencilView dsv; - ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv)); - dsv.setDebugName("TexStorageCube.RenderTargetDSV"); - - mRenderTarget[faceIndex][level].reset(new TextureRenderTarget11( - std::move(dsv), *texture, srv, mFormatInfo.internalFormat, getFormatSet(), - getLevelWidth(level), getLevelHeight(level), 1, 0)); - } - else - { - UNREACHABLE(); - } - } - - ASSERT(outRT); - *outRT = mRenderTarget[faceIndex][level].get(); - return gl::NoError(); -} - -gl::Error TextureStorage11_Cube::createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) -{ - ASSERT(outSRV); - - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = format; - - // Unnormalized integer cube maps are not supported by DX11; we emulate them as an array of six - // 2D textures - const GLenum componentType = d3d11::GetComponentType(format); - if (componentType == GL_INT || componentType == GL_UNSIGNED_INT) - { - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; - srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + baseLevel; - srvDesc.Texture2DArray.MipLevels = mipLevels; - srvDesc.Texture2DArray.FirstArraySlice = 0; - srvDesc.Texture2DArray.ArraySize = gl::CUBE_FACE_COUNT; - } - else - { - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; - srvDesc.TextureCube.MipLevels = mipLevels; - srvDesc.TextureCube.MostDetailedMip = mTopLevel + baseLevel; - } - - const TextureHelper11 *srvTexture = &texture; - - if (mRenderer->getWorkarounds().zeroMaxLodWorkaround) - { - ASSERT(mTopLevel == 0); - ASSERT(baseLevel == 0); - // This code also assumes that the incoming texture equals either mLevelZeroTexture or - // mTexture. - - if (mipLevels == 1 && mMipLevels > 1) - { - // We must use a SRV on the level-zero-only texture. - ANGLE_TRY(ensureTextureExists(1)); - srvTexture = &mLevelZeroTexture; - } - else - { - ASSERT(mipLevels == static_cast<int>(mMipLevels)); - ASSERT(mTexture.valid() && texture == mTexture); - srvTexture = &mTexture; - } - } - - ANGLE_TRY(mRenderer->allocateResource(srvDesc, srvTexture->get(), outSRV)); - outSRV->setDebugName("TexStorageCube.SRV"); - - return gl::NoError(); -} - -gl::Error TextureStorage11_Cube::getSwizzleTexture(const TextureHelper11 **outTexture) -{ - ASSERT(outTexture); - - if (!mSwizzleTexture.valid()) - { - const auto &format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()); - - D3D11_TEXTURE2D_DESC desc; - desc.Width = mTextureWidth; - desc.Height = mTextureHeight; - desc.MipLevels = mMipLevels; - desc.ArraySize = gl::CUBE_FACE_COUNT; - desc.Format = format.texFormat; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; - desc.CPUAccessFlags = 0; - desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE; - - ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture)); - mSwizzleTexture.setDebugName("TexStorageCube.SwizzleTexture"); - } - - *outTexture = &mSwizzleTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel, - const d3d11::RenderTargetView **outRTV) -{ - ASSERT(mipLevel >= 0 && mipLevel < getLevelCount()); - ASSERT(outRTV); - - if (!mSwizzleRenderTargets[mipLevel].valid()) - { - const TextureHelper11 *swizzleTexture = nullptr; - ANGLE_TRY(getSwizzleTexture(&swizzleTexture)); - - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = - mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; - rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel; - rtvDesc.Texture2DArray.FirstArraySlice = 0; - rtvDesc.Texture2DArray.ArraySize = gl::CUBE_FACE_COUNT; - - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(), - &mSwizzleRenderTargets[mipLevel])); - } - - *outRTV = &mSwizzleRenderTargets[mipLevel]; - return gl::NoError(); -} - -gl::Error TextureStorage11::initDropStencilTexture(const gl::Context *context, - const gl::ImageIndexIterator &it) -{ - const TextureHelper11 *sourceTexture = nullptr; - ANGLE_TRY(getResource(context, &sourceTexture)); - - gl::ImageIndexIterator itCopy = it; - - while (itCopy.hasNext()) - { - gl::ImageIndex index = itCopy.next(); - gl::Box wholeArea(0, 0, 0, getLevelWidth(index.mipIndex), getLevelHeight(index.mipIndex), - 1); - gl::Extents wholeSize(wholeArea.width, wholeArea.height, 1); - UINT subresource = getSubresourceIndex(index); - ANGLE_TRY(mRenderer->getBlitter()->copyDepthStencil( - *sourceTexture, subresource, wholeArea, wholeSize, mDropStencilTexture, subresource, - wholeArea, wholeSize, nullptr)); - } - - return gl::NoError(); -} - -gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_Cube::ensureDropStencilTexture( - const gl::Context *context) -{ - if (mDropStencilTexture.valid()) - { - return DropStencil::ALREADY_EXISTS; - } - - D3D11_TEXTURE2D_DESC dropDesc = {}; - dropDesc.ArraySize = 6; - dropDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_DEPTH_STENCIL; - dropDesc.CPUAccessFlags = 0; - dropDesc.Format = DXGI_FORMAT_R32_TYPELESS; - dropDesc.Height = mTextureHeight; - dropDesc.MipLevels = mMipLevels; - dropDesc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE; - dropDesc.SampleDesc.Count = 1; - dropDesc.SampleDesc.Quality = 0; - dropDesc.Usage = D3D11_USAGE_DEFAULT; - dropDesc.Width = mTextureWidth; - - const auto &format = - d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps()); - ANGLE_TRY(mRenderer->allocateTexture(dropDesc, format, &mDropStencilTexture)); - mDropStencilTexture.setDebugName("TexStorageCube.DropStencil"); - - ANGLE_TRY(initDropStencilTexture(context, gl::ImageIndexIterator::MakeCube(0, mMipLevels))); - - return DropStencil::CREATED; -} - -TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, - GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - GLsizei depth, - int levels) - : TextureStorage11( - renderer, - GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget), - GetTextureMiscFlags(internalformat, - renderer->getRenderer11DeviceCaps(), - renderTarget, - levels), - internalformat) -{ - for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) - { - mAssociatedImages[i] = nullptr; - mLevelRenderTargets[i] = nullptr; - } - - // adjust size if needed for compressed textures - d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, &mTopLevel); - - mMipLevels = mTopLevel + levels; - mTextureWidth = width; - mTextureHeight = height; - mTextureDepth = depth; -} - -gl::Error TextureStorage11_3D::onDestroy(const gl::Context *context) -{ - for (unsigned i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) - { - if (mAssociatedImages[i] != nullptr) - { - mAssociatedImages[i]->verifyAssociatedStorageValid(this); - - // We must let the Images recover their data before we delete it from the - // TextureStorage. - ANGLE_TRY(mAssociatedImages[i]->recoverFromAssociatedStorage(context)); - } - } - - InvalidateRenderTargetContainer(context, &mLevelRenderTargets); - InvalidateRenderTargetContainer(context, &mLevelLayerRenderTargets); - - return gl::NoError(); -} - -TextureStorage11_3D::~TextureStorage11_3D() -{ -} - -void TextureStorage11_3D::associateImage(Image11 *image, const gl::ImageIndex &index) -{ - const GLint level = index.mipIndex; - - ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - - if (0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - { - mAssociatedImages[level] = image; - } -} - -void TextureStorage11_3D::verifyAssociatedImageValid(const gl::ImageIndex &index, - Image11 *expectedImage) -{ - const GLint level = index.mipIndex; - - ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - // This validation check should never return false. It means the Image/TextureStorage - // association is broken. - ASSERT(mAssociatedImages[level] == expectedImage); -} - -// disassociateImage allows an Image to end its association with a Storage. -void TextureStorage11_3D::disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) -{ - const GLint level = index.mipIndex; - - ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(mAssociatedImages[level] == expectedImage); - mAssociatedImages[level] = nullptr; -} - -// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image -// recover its data before ending the association. -gl::Error TextureStorage11_3D::releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) -{ - const GLint level = index.mipIndex; - - ASSERT((0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)); - - if (0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - { - // No need to let the old Image recover its data, if it is also the incoming Image. - if (mAssociatedImages[level] != nullptr && mAssociatedImages[level] != incomingImage) - { - // Ensure that the Image is still associated with this TextureStorage. - mAssociatedImages[level]->verifyAssociatedStorageValid(this); - - // Force the image to recover from storage before its data is overwritten. - // This will reset mAssociatedImages[level] to nullptr too. - ANGLE_TRY(mAssociatedImages[level]->recoverFromAssociatedStorage(context)); - } - } - - return gl::NoError(); -} - -gl::Error TextureStorage11_3D::getResource(const gl::Context *context, - const TextureHelper11 **outResource) -{ - // If the width, height or depth are not positive this should be treated as an incomplete - // texture. We handle that here by skipping the d3d texture creation. - if (!mTexture.valid() && mTextureWidth > 0 && mTextureHeight > 0 && mTextureDepth > 0) - { - ASSERT(mMipLevels > 0); - - D3D11_TEXTURE3D_DESC desc; - desc.Width = mTextureWidth; - desc.Height = mTextureHeight; - desc.Depth = mTextureDepth; - desc.MipLevels = mMipLevels; - desc.Format = mFormatInfo.texFormat; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = getBindFlags(); - desc.CPUAccessFlags = 0; - desc.MiscFlags = getMiscFlags(); - - ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, &mTexture)); - mTexture.setDebugName("TexStorage3D.Texture"); - } - - *outResource = &mTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_3D::createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) -{ - ASSERT(outSRV); - - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = format; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; - srvDesc.Texture3D.MostDetailedMip = baseLevel; - srvDesc.Texture3D.MipLevels = mipLevels; - - ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV)); - outSRV->setDebugName("TexStorage3D.SRV"); - - return gl::NoError(); -} - -gl::Error TextureStorage11_3D::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - const int mipLevel = index.mipIndex; - ASSERT(mipLevel >= 0 && mipLevel < getLevelCount()); - - ASSERT(mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN); - - if (!index.hasLayer()) - { - if (!mLevelRenderTargets[mipLevel]) - { - const TextureHelper11 *texture = nullptr; - ANGLE_TRY(getResource(context, &texture)); - - const d3d11::SharedSRV *srv = nullptr; - ANGLE_TRY(getSRVLevel(context, mipLevel, false, &srv)); - - const d3d11::SharedSRV *blitSRV = nullptr; - ANGLE_TRY(getSRVLevel(context, mipLevel, true, &blitSRV)); - - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = mFormatInfo.rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; - rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel; - rtvDesc.Texture3D.FirstWSlice = 0; - rtvDesc.Texture3D.WSize = static_cast<UINT>(-1); - - d3d11::RenderTargetView rtv; - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv)); - rtv.setDebugName("TexStorage3D.RTV"); - - mLevelRenderTargets[mipLevel].reset(new TextureRenderTarget11( - std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat, - getFormatSet(), getLevelWidth(mipLevel), getLevelHeight(mipLevel), - getLevelDepth(mipLevel), 0)); - } - - ASSERT(outRT); - *outRT = mLevelRenderTargets[mipLevel].get(); - return gl::NoError(); - } - - const int layer = index.layerIndex; - - LevelLayerKey key(mipLevel, layer); - if (mLevelLayerRenderTargets.find(key) == mLevelLayerRenderTargets.end()) - { - const TextureHelper11 *texture = nullptr; - ANGLE_TRY(getResource(context, &texture)); - - // TODO, what kind of SRV is expected here? - const d3d11::SharedSRV srv; - const d3d11::SharedSRV blitSRV; - - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = mFormatInfo.rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; - rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel; - rtvDesc.Texture3D.FirstWSlice = layer; - rtvDesc.Texture3D.WSize = 1; - - d3d11::RenderTargetView rtv; - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv)); - rtv.setDebugName("TexStorage3D.LayerRTV"); - - mLevelLayerRenderTargets[key].reset(new TextureRenderTarget11( - std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(), - getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0)); - } - - ASSERT(outRT); - *outRT = mLevelLayerRenderTargets[key].get(); - return gl::NoError(); -} - -gl::Error TextureStorage11_3D::getSwizzleTexture(const TextureHelper11 **outTexture) -{ - ASSERT(outTexture); - - if (!mSwizzleTexture.valid()) - { - const auto &format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()); - - D3D11_TEXTURE3D_DESC desc; - desc.Width = mTextureWidth; - desc.Height = mTextureHeight; - desc.Depth = mTextureDepth; - desc.MipLevels = mMipLevels; - desc.Format = format.texFormat; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; - desc.CPUAccessFlags = 0; - desc.MiscFlags = 0; - - ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture)); - mSwizzleTexture.setDebugName("TexStorage3D.SwizzleTexture"); - } - - *outTexture = &mSwizzleTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel, - const d3d11::RenderTargetView **outRTV) -{ - ASSERT(mipLevel >= 0 && mipLevel < getLevelCount()); - ASSERT(outRTV); - - if (!mSwizzleRenderTargets[mipLevel].valid()) - { - const TextureHelper11 *swizzleTexture = nullptr; - ANGLE_TRY(getSwizzleTexture(&swizzleTexture)); - - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = - mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; - rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel; - rtvDesc.Texture3D.FirstWSlice = 0; - rtvDesc.Texture3D.WSize = static_cast<UINT>(-1); - - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(), - &mSwizzleRenderTargets[mipLevel])); - mSwizzleRenderTargets[mipLevel].setDebugName("TexStorage3D.SwizzleRTV"); - } - - *outRTV = &mSwizzleRenderTargets[mipLevel]; - return gl::NoError(); -} - -TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, - GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - GLsizei depth, - int levels) - : TextureStorage11( - renderer, - GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget), - GetTextureMiscFlags(internalformat, - renderer->getRenderer11DeviceCaps(), - renderTarget, - levels), - internalformat) -{ - // adjust size if needed for compressed textures - d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, &mTopLevel); - - mMipLevels = mTopLevel + levels; - mTextureWidth = width; - mTextureHeight = height; - mTextureDepth = depth; -} - -gl::Error TextureStorage11_2DArray::onDestroy(const gl::Context *context) -{ - for (auto iter : mAssociatedImages) - { - if (iter.second) - { - iter.second->verifyAssociatedStorageValid(this); - - // We must let the Images recover their data before we delete it from the - // TextureStorage. - ANGLE_TRY(iter.second->recoverFromAssociatedStorage(context)); - } - } - mAssociatedImages.clear(); - - InvalidateRenderTargetContainer(context, &mRenderTargets); - - return gl::NoError(); -} - -TextureStorage11_2DArray::~TextureStorage11_2DArray() -{ -} - -void TextureStorage11_2DArray::associateImage(Image11 *image, const gl::ImageIndex &index) -{ - const GLint level = index.mipIndex; - const GLint layerTarget = index.layerIndex; - const GLint numLayers = index.numLayers; - - ASSERT(0 <= level && level < getLevelCount()); - - if (0 <= level && level < getLevelCount()) - { - LevelLayerRangeKey key(level, layerTarget, numLayers); - mAssociatedImages[key] = image; - } -} - -void TextureStorage11_2DArray::verifyAssociatedImageValid(const gl::ImageIndex &index, - Image11 *expectedImage) -{ - const GLint level = index.mipIndex; - const GLint layerTarget = index.layerIndex; - const GLint numLayers = index.numLayers; - - LevelLayerRangeKey key(level, layerTarget, numLayers); - - // This validation check should never return false. It means the Image/TextureStorage - // association is broken. - bool retValue = (mAssociatedImages.find(key) != mAssociatedImages.end() && - (mAssociatedImages[key] == expectedImage)); - ASSERT(retValue); -} - -// disassociateImage allows an Image to end its association with a Storage. -void TextureStorage11_2DArray::disassociateImage(const gl::ImageIndex &index, - Image11 *expectedImage) -{ - const GLint level = index.mipIndex; - const GLint layerTarget = index.layerIndex; - const GLint numLayers = index.numLayers; - - LevelLayerRangeKey key(level, layerTarget, numLayers); - - bool imageAssociationCorrect = (mAssociatedImages.find(key) != mAssociatedImages.end() && - (mAssociatedImages[key] == expectedImage)); - ASSERT(imageAssociationCorrect); - mAssociatedImages[key] = nullptr; -} - -// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image -// recover its data before ending the association. -gl::Error TextureStorage11_2DArray::releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) -{ - const GLint level = index.mipIndex; - const GLint layerTarget = index.layerIndex; - const GLint numLayers = index.numLayers; - - LevelLayerRangeKey key(level, layerTarget, numLayers); - - if (mAssociatedImages.find(key) != mAssociatedImages.end()) - { - if (mAssociatedImages[key] != nullptr && mAssociatedImages[key] != incomingImage) - { - // Ensure that the Image is still associated with this TextureStorage. - mAssociatedImages[key]->verifyAssociatedStorageValid(this); - - // Force the image to recover from storage before its data is overwritten. - // This will reset mAssociatedImages[level] to nullptr too. - ANGLE_TRY(mAssociatedImages[key]->recoverFromAssociatedStorage(context)); - } - } - - return gl::NoError(); -} - -gl::Error TextureStorage11_2DArray::getResource(const gl::Context *context, - const TextureHelper11 **outResource) -{ - // if the width, height or depth is not positive this should be treated as an incomplete texture - // we handle that here by skipping the d3d texture creation - if (!mTexture.valid() && mTextureWidth > 0 && mTextureHeight > 0 && mTextureDepth > 0) - { - ASSERT(mMipLevels > 0); - - D3D11_TEXTURE2D_DESC desc; - desc.Width = mTextureWidth; - desc.Height = mTextureHeight; - desc.MipLevels = mMipLevels; - desc.ArraySize = mTextureDepth; - desc.Format = mFormatInfo.texFormat; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = getBindFlags(); - desc.CPUAccessFlags = 0; - desc.MiscFlags = getMiscFlags(); - - ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, &mTexture)); - mTexture.setDebugName("TexStorage2DArray.Texture"); - } - - *outResource = &mTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_2DArray::createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) -{ - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = format; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; - srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + baseLevel; - srvDesc.Texture2DArray.MipLevels = mipLevels; - srvDesc.Texture2DArray.FirstArraySlice = 0; - srvDesc.Texture2DArray.ArraySize = mTextureDepth; - - ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV)); - outSRV->setDebugName("TexStorage2DArray.SRV"); - - return gl::NoError(); -} - -gl::Error TextureStorage11_2DArray::createRenderTargetSRV(const TextureHelper11 &texture, - const gl::ImageIndex &index, - DXGI_FORMAT resourceFormat, - d3d11::SharedSRV *srv) const -{ - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = resourceFormat; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; - srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + index.mipIndex; - srvDesc.Texture2DArray.MipLevels = 1; - srvDesc.Texture2DArray.FirstArraySlice = index.layerIndex; - srvDesc.Texture2DArray.ArraySize = index.numLayers; - - ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), srv)); - - return gl::NoError(); -} - -gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - ASSERT(index.hasLayer()); - - const int mipLevel = index.mipIndex; - const int layer = index.layerIndex; - const int numLayers = index.numLayers; - - ASSERT(mipLevel >= 0 && mipLevel < getLevelCount()); - - LevelLayerRangeKey key(mipLevel, layer, numLayers); - if (mRenderTargets.find(key) == mRenderTargets.end()) - { - const TextureHelper11 *texture = nullptr; - ANGLE_TRY(getResource(context, &texture)); - d3d11::SharedSRV srv; - ANGLE_TRY(createRenderTargetSRV(*texture, index, mFormatInfo.srvFormat, &srv)); - d3d11::SharedSRV blitSRV; - if (mFormatInfo.blitSRVFormat != mFormatInfo.srvFormat) - { - ANGLE_TRY(createRenderTargetSRV(*texture, index, mFormatInfo.blitSRVFormat, &blitSRV)); - } - else - { - blitSRV = srv.makeCopy(); - } - - srv.setDebugName("TexStorage2DArray.RenderTargetSRV"); - - if (mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN) - { - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = mFormatInfo.rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; - rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel; - rtvDesc.Texture2DArray.FirstArraySlice = layer; - rtvDesc.Texture2DArray.ArraySize = numLayers; - - d3d11::RenderTargetView rtv; - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv)); - rtv.setDebugName("TexStorage2DArray.RenderTargetRTV"); - - mRenderTargets[key].reset(new TextureRenderTarget11( - std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(), - getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0)); - } - else - { - ASSERT(mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN); - - D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; - dsvDesc.Format = mFormatInfo.dsvFormat; - dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; - dsvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel; - dsvDesc.Texture2DArray.FirstArraySlice = layer; - dsvDesc.Texture2DArray.ArraySize = numLayers; - dsvDesc.Flags = 0; - - d3d11::DepthStencilView dsv; - ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv)); - dsv.setDebugName("TexStorage2DArray.RenderTargetDSV"); - - mRenderTargets[key].reset(new TextureRenderTarget11( - std::move(dsv), *texture, srv, mFormatInfo.internalFormat, getFormatSet(), - getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0)); - } - } - - ASSERT(outRT); - *outRT = mRenderTargets[key].get(); - return gl::NoError(); -} - -gl::Error TextureStorage11_2DArray::getSwizzleTexture(const TextureHelper11 **outTexture) -{ - if (!mSwizzleTexture.valid()) - { - const auto &format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()); - - D3D11_TEXTURE2D_DESC desc; - desc.Width = mTextureWidth; - desc.Height = mTextureHeight; - desc.MipLevels = mMipLevels; - desc.ArraySize = mTextureDepth; - desc.Format = format.texFormat; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; - desc.CPUAccessFlags = 0; - desc.MiscFlags = 0; - - ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture)); - mSwizzleTexture.setDebugName("TexStorage2DArray.SwizzleTexture"); - } - - *outTexture = &mSwizzleTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_2DArray::getSwizzleRenderTarget(int mipLevel, - const d3d11::RenderTargetView **outRTV) -{ - ASSERT(mipLevel >= 0 && mipLevel < getLevelCount()); - ASSERT(outRTV); - - if (!mSwizzleRenderTargets[mipLevel].valid()) - { - const TextureHelper11 *swizzleTexture = nullptr; - ANGLE_TRY(getSwizzleTexture(&swizzleTexture)); - - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = - mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; - rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel; - rtvDesc.Texture2DArray.FirstArraySlice = 0; - rtvDesc.Texture2DArray.ArraySize = mTextureDepth; - - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(), - &mSwizzleRenderTargets[mipLevel])); - } - - *outRTV = &mSwizzleRenderTargets[mipLevel]; - return gl::NoError(); -} - -gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_2DArray::ensureDropStencilTexture( - const gl::Context *context) -{ - if (mDropStencilTexture.valid()) - { - return DropStencil::ALREADY_EXISTS; - } - - D3D11_TEXTURE2D_DESC dropDesc = {}; - dropDesc.ArraySize = mTextureDepth; - dropDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_DEPTH_STENCIL; - dropDesc.CPUAccessFlags = 0; - dropDesc.Format = DXGI_FORMAT_R32_TYPELESS; - dropDesc.Height = mTextureHeight; - dropDesc.MipLevels = mMipLevels; - dropDesc.MiscFlags = 0; - dropDesc.SampleDesc.Count = 1; - dropDesc.SampleDesc.Quality = 0; - dropDesc.Usage = D3D11_USAGE_DEFAULT; - dropDesc.Width = mTextureWidth; - - const auto &format = - d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps()); - ANGLE_TRY(mRenderer->allocateTexture(dropDesc, format, &mDropStencilTexture)); - mDropStencilTexture.setDebugName("TexStorage2DArray.DropStencil"); - - std::vector<GLsizei> layerCounts(mMipLevels, mTextureDepth); - - ANGLE_TRY(initDropStencilTexture( - context, gl::ImageIndexIterator::Make2DArray(0, mMipLevels, layerCounts.data()))); - - return DropStencil::CREATED; -} - -TextureStorage11_2DMultisample::TextureStorage11_2DMultisample(Renderer11 *renderer, - GLenum internalformat, - GLsizei width, - GLsizei height, - int levels, - int samples, - bool fixedSampleLocations) - : TextureStorage11( - renderer, - GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), true), - GetTextureMiscFlags(internalformat, renderer->getRenderer11DeviceCaps(), true, levels), - internalformat), - mTexture(), - mRenderTarget(nullptr) -{ - // adjust size if needed for compressed textures - d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, &mTopLevel); - - mMipLevels = 1; - mTextureWidth = width; - mTextureHeight = height; - mTextureDepth = 1; - mSamples = samples; - mFixedSampleLocations = fixedSampleLocations; -} - -gl::Error TextureStorage11_2DMultisample::onDestroy(const gl::Context *context) -{ - InvalidateRenderTarget(context, mRenderTarget.get()); - mRenderTarget.reset(); - return gl::NoError(); -} - -TextureStorage11_2DMultisample::~TextureStorage11_2DMultisample() -{ -} - -gl::Error TextureStorage11_2DMultisample::copyToStorage(const gl::Context *context, - TextureStorage *destStorage) -{ - UNIMPLEMENTED(); - return gl::InternalError() << "copyToStorage is unimplemented"; -} - -void TextureStorage11_2DMultisample::associateImage(Image11 *image, const gl::ImageIndex &index) -{ -} - -void TextureStorage11_2DMultisample::verifyAssociatedImageValid(const gl::ImageIndex &index, - Image11 *expectedImage) -{ -} - -void TextureStorage11_2DMultisample::disassociateImage(const gl::ImageIndex &index, - Image11 *expectedImage) -{ -} - -gl::Error TextureStorage11_2DMultisample::releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) -{ - return gl::NoError(); -} - -gl::Error TextureStorage11_2DMultisample::getResource(const gl::Context *context, - const TextureHelper11 **outResource) -{ - ANGLE_TRY(ensureTextureExists(1)); - - *outResource = &mTexture; - return gl::NoError(); -} - -gl::Error TextureStorage11_2DMultisample::ensureTextureExists(int mipLevels) -{ - // For Multisampled textures, mipLevels always equals 1. - ASSERT(mipLevels == 1); - - // if the width or height is not positive this should be treated as an incomplete texture - // we handle that here by skipping the d3d texture creation - if (!mTexture.valid() && mTextureWidth > 0 && mTextureHeight > 0) - { - D3D11_TEXTURE2D_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Width = mTextureWidth; // Compressed texture size constraints? - desc.Height = mTextureHeight; - desc.MipLevels = mipLevels; - desc.ArraySize = 1; - desc.Format = mFormatInfo.texFormat; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = getBindFlags(); - desc.CPUAccessFlags = 0; - desc.MiscFlags = getMiscFlags(); - - const gl::TextureCaps &textureCaps = - mRenderer->getNativeTextureCaps().get(mFormatInfo.internalFormat); - GLuint supportedSamples = textureCaps.getNearestSamples(mSamples); - desc.SampleDesc.Count = (supportedSamples == 0) ? 1 : supportedSamples; - desc.SampleDesc.Quality = static_cast<UINT>(D3D11_STANDARD_MULTISAMPLE_PATTERN); - - ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, &mTexture)); - mTexture.setDebugName("TexStorage2DMS.Texture"); - } - - return gl::NoError(); -} - -gl::Error TextureStorage11_2DMultisample::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - ASSERT(!index.hasLayer()); - - const int level = index.mipIndex; - ASSERT(level == 0); - - ASSERT(outRT); - if (mRenderTarget) - { - *outRT = mRenderTarget.get(); - return gl::NoError(); - } - - const TextureHelper11 *texture = nullptr; - ANGLE_TRY(getResource(context, &texture)); - - const d3d11::SharedSRV *srv = nullptr; - ANGLE_TRY(getSRVLevel(context, level, false, &srv)); - - const d3d11::SharedSRV *blitSRV = nullptr; - ANGLE_TRY(getSRVLevel(context, level, true, &blitSRV)); - - if (mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN) - { - D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; - rtvDesc.Format = mFormatInfo.rtvFormat; - rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS; - - d3d11::RenderTargetView rtv; - ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv)); - - mRenderTarget.reset(new TextureRenderTarget11( - std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat, getFormatSet(), - getLevelWidth(level), getLevelHeight(level), 1, mSamples)); - - *outRT = mRenderTarget.get(); - return gl::NoError(); - } - - ASSERT(mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN); - - D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; - dsvDesc.Format = mFormatInfo.dsvFormat; - dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS; - dsvDesc.Flags = 0; - - d3d11::DepthStencilView dsv; - ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv)); - - mRenderTarget.reset(new TextureRenderTarget11( - std::move(dsv), *texture, *srv, mFormatInfo.internalFormat, getFormatSet(), - getLevelWidth(level), getLevelHeight(level), 1, mSamples)); - - *outRT = mRenderTarget.get(); - return gl::NoError(); -} - -gl::Error TextureStorage11_2DMultisample::createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) -{ - ASSERT(outSRV); - - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - srvDesc.Format = format; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMS; - - ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV)); - outSRV->setDebugName("TexStorage2DMS.SRV"); - return gl::NoError(); -} - -gl::Error TextureStorage11_2DMultisample::getSwizzleTexture(const TextureHelper11 **outTexture) -{ - UNIMPLEMENTED(); - return gl::InternalError() << "getSwizzleTexture is unimplemented."; -} - -gl::Error TextureStorage11_2DMultisample::getSwizzleRenderTarget( - int mipLevel, - const d3d11::RenderTargetView **outRTV) -{ - UNIMPLEMENTED(); - return gl::InternalError() << "getSwizzleRenderTarget is unimplemented."; -} - -gl::ErrorOrResult<TextureStorage11::DropStencil> -TextureStorage11_2DMultisample::ensureDropStencilTexture(const gl::Context *context) -{ - UNIMPLEMENTED(); - return gl::InternalError() << "Drop stencil texture not implemented."; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h deleted file mode 100644 index 336aa495a8..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h +++ /dev/null @@ -1,589 +0,0 @@ -// -// Copyright (c) 2012-2013 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. -// - -// TextureStorage11.h: Defines the abstract rx::TextureStorage11 class and its concrete derived -// classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11 texture. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_ - -#include "libANGLE/Error.h" -#include "libANGLE/Texture.h" -#include "libANGLE/renderer/d3d/TextureStorage.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" - -#include <array> -#include <map> - -namespace gl -{ -struct ImageIndex; -} - -namespace rx -{ -class EGLImageD3D; -class RenderTargetD3D; -class RenderTarget11; -class Renderer11; -class SwapChain11; -class Image11; -struct Renderer11DeviceCaps; - -template <typename T> -using TexLevelArray = std::array<T, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS>; - -template <typename T> -using CubeFaceArray = std::array<T, gl::CUBE_FACE_COUNT>; - -class TextureStorage11 : public TextureStorage -{ - public: - ~TextureStorage11() override; - - static DWORD GetTextureBindFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget); - static DWORD GetTextureMiscFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget, int levels); - - UINT getBindFlags() const; - UINT getMiscFlags() const; - const d3d11::Format &getFormatSet() const; - gl::Error getSRVLevels(const gl::Context *context, - GLint baseLevel, - GLint maxLevel, - const d3d11::SharedSRV **outSRV); - gl::Error generateSwizzles(const gl::Context *context, const gl::SwizzleState &swizzleTarget); - void markLevelDirty(int mipLevel); - void markDirty(); - - gl::Error updateSubresourceLevel(const gl::Context *context, - const TextureHelper11 &texture, - unsigned int sourceSubresource, - const gl::ImageIndex &index, - const gl::Box ©Area); - - gl::Error copySubresourceLevel(const gl::Context *context, - const TextureHelper11 &dstTexture, - unsigned int dstSubresource, - const gl::ImageIndex &index, - const gl::Box ®ion); - - // TextureStorage virtual functions - int getTopLevel() const override; - bool isRenderTarget() const override; - bool isManaged() const override; - bool supportsNativeMipmapFunction() const override; - int getLevelCount() const override; - gl::Error generateMipmap(const gl::Context *context, - const gl::ImageIndex &sourceIndex, - const gl::ImageIndex &destIndex) override; - gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; - gl::Error setData(const gl::Context *context, - const gl::ImageIndex &index, - ImageD3D *image, - const gl::Box *destBox, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixelData) override; - - virtual gl::Error getSRV(const gl::Context *context, - const gl::TextureState &textureState, - const d3d11::SharedSRV **outSRV); - virtual UINT getSubresourceIndex(const gl::ImageIndex &index) const; - virtual gl::Error getResource(const gl::Context *context, - const TextureHelper11 **outResource) = 0; - virtual void associateImage(Image11* image, const gl::ImageIndex &index) = 0; - virtual void disassociateImage(const gl::ImageIndex &index, Image11* expectedImage) = 0; - virtual void verifyAssociatedImageValid(const gl::ImageIndex &index, - Image11 *expectedImage) = 0; - virtual gl::Error releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) = 0; - - protected: - TextureStorage11(Renderer11 *renderer, UINT bindFlags, UINT miscFlags, GLenum internalFormat); - int getLevelWidth(int mipLevel) const; - int getLevelHeight(int mipLevel) const; - int getLevelDepth(int mipLevel) const; - - // Some classes (e.g. TextureStorage11_2D) will override getMippedResource. - virtual gl::Error getMippedResource(const gl::Context *context, - const TextureHelper11 **outResource); - - virtual gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) = 0; - virtual gl::Error getSwizzleRenderTarget(int mipLevel, - const d3d11::RenderTargetView **outRTV) = 0; - gl::Error getSRVLevel(const gl::Context *context, - int mipLevel, - bool blitSRV, - const d3d11::SharedSRV **outSRV); - - // Get a version of a depth texture with only depth information, not stencil. - enum DropStencil - { - CREATED, - ALREADY_EXISTS - }; - virtual gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context); - gl::Error initDropStencilTexture(const gl::Context *context, const gl::ImageIndexIterator &it); - - // The baseLevel parameter should *not* have mTopLevel applied. - virtual gl::Error createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) = 0; - - void verifySwizzleExists(const gl::SwizzleState &swizzleState); - - // Clear all cached non-swizzle SRVs and invalidate the swizzle cache. - void clearSRVCache(); - - Renderer11 *mRenderer; - int mTopLevel; - unsigned int mMipLevels; - - const d3d11::Format &mFormatInfo; - unsigned int mTextureWidth; - unsigned int mTextureHeight; - unsigned int mTextureDepth; - - TexLevelArray<gl::SwizzleState> mSwizzleCache; - TextureHelper11 mDropStencilTexture; - - private: - const UINT mBindFlags; - const UINT mMiscFlags; - - struct SRVKey - { - SRVKey(int baseLevel, int mipLevels, bool swizzle, bool dropStencil); - - bool operator<(const SRVKey &rhs) const; - - int baseLevel = 0; // Without mTopLevel applied. - int mipLevels = 0; - bool swizzle = false; - bool dropStencil = false; - }; - typedef std::map<SRVKey, d3d11::SharedSRV> SRVCache; - - gl::Error getCachedOrCreateSRV(const gl::Context *context, - const SRVKey &key, - const d3d11::SharedSRV **outSRV); - - SRVCache mSrvCache; - TexLevelArray<d3d11::SharedSRV> mLevelSRVs; - TexLevelArray<d3d11::SharedSRV> mLevelBlitSRVs; -}; - -class TextureStorage11_2D : public TextureStorage11 -{ - public: - TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain); - TextureStorage11_2D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly = false); - ~TextureStorage11_2D() override; - - gl::Error onDestroy(const gl::Context *context) override; - - gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; - gl::Error getMippedResource(const gl::Context *context, - const TextureHelper11 **outResource) override; - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) override; - - gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; - - void associateImage(Image11 *image, const gl::ImageIndex &index) override; - void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; - void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; - gl::Error releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) override; - - gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context, - bool useLevelZeroTexture) override; - - protected: - gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; - gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; - - gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override; - - gl::Error ensureTextureExists(int mipLevels); - - private: - gl::Error createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) override; - - TextureHelper11 mTexture; - TexLevelArray<std::unique_ptr<RenderTarget11>> mRenderTarget; - bool mHasKeyedMutex; - - // These are members related to the zero max-LOD workaround. - // D3D11 Feature Level 9_3 can't disable mipmaps on a mipmapped texture (i.e. solely sample from level zero). - // These members are used to work around this limitation. - // Usually only mTexture XOR mLevelZeroTexture will exist. - // For example, if an app creates a texture with only one level, then 9_3 will only create mLevelZeroTexture. - // However, in some scenarios, both textures have to be created. This incurs additional memory overhead. - // One example of this is an application that creates a texture, calls glGenerateMipmap, and then disables mipmaps on the texture. - // A more likely example is an app that creates an empty texture, renders to it, and then calls glGenerateMipmap - // TODO: In this rendering scenario, release the mLevelZeroTexture after mTexture has been created to save memory. - TextureHelper11 mLevelZeroTexture; - std::unique_ptr<RenderTarget11> mLevelZeroRenderTarget; - bool mUseLevelZeroTexture; - - // Swizzle-related variables - TextureHelper11 mSwizzleTexture; - TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; - - TexLevelArray<Image11 *> mAssociatedImages; -}; - -class TextureStorage11_External : public TextureStorage11 -{ - public: - TextureStorage11_External(Renderer11 *renderer, - egl::Stream *stream, - const egl::Stream::GLTextureDescription &glDesc); - ~TextureStorage11_External() override; - - gl::Error onDestroy(const gl::Context *context) override; - - gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; - gl::Error getMippedResource(const gl::Context *context, - const TextureHelper11 **outResource) override; - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) override; - - gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; - - void associateImage(Image11 *image, const gl::ImageIndex &index) override; - void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; - void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; - gl::Error releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) override; - - protected: - gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; - gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; - - private: - gl::Error createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) override; - - TextureHelper11 mTexture; - int mSubresourceIndex; - bool mHasKeyedMutex; - - Image11 *mAssociatedImage; -}; - -class TextureStorage11_EGLImage final : public TextureStorage11 -{ - public: - TextureStorage11_EGLImage(Renderer11 *renderer, - EGLImageD3D *eglImage, - RenderTarget11 *renderTarget11); - ~TextureStorage11_EGLImage() override; - - gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; - gl::Error getSRV(const gl::Context *context, - const gl::TextureState &textureState, - const d3d11::SharedSRV **outSRV) override; - gl::Error getMippedResource(const gl::Context *context, - const TextureHelper11 **outResource) override; - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) override; - - gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; - - void associateImage(Image11 *image, const gl::ImageIndex &index) override; - void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; - void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; - gl::Error releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) override; - - gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context, - bool useLevelZeroTexture) override; - - protected: - gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; - gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; - - private: - // Check if the EGL image's render target has been updated due to orphaning and delete - // any SRVs and other resources based on the image's old render target. - gl::Error checkForUpdatedRenderTarget(const gl::Context *context); - - gl::Error createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) override; - - gl::Error getImageRenderTarget(const gl::Context *context, RenderTarget11 **outRT) const; - - EGLImageD3D *mImage; - uintptr_t mCurrentRenderTarget; - - // Swizzle-related variables - TextureHelper11 mSwizzleTexture; - std::vector<d3d11::RenderTargetView> mSwizzleRenderTargets; -}; - -class TextureStorage11_Cube : public TextureStorage11 -{ - public: - TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly); - ~TextureStorage11_Cube() override; - - gl::Error onDestroy(const gl::Context *context) override; - - UINT getSubresourceIndex(const gl::ImageIndex &index) const override; - - gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; - gl::Error getMippedResource(const gl::Context *context, - const TextureHelper11 **outResource) override; - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) override; - - gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; - - void associateImage(Image11 *image, const gl::ImageIndex &index) override; - void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; - void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; - gl::Error releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) override; - - gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context, - bool useLevelZeroTexture) override; - - protected: - gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; - gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; - - gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override; - - gl::Error ensureTextureExists(int mipLevels); - - private: - gl::Error createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) override; - gl::Error createRenderTargetSRV(const TextureHelper11 &texture, - const gl::ImageIndex &index, - DXGI_FORMAT resourceFormat, - d3d11::SharedSRV *srv) const; - - TextureHelper11 mTexture; - CubeFaceArray<TexLevelArray<std::unique_ptr<RenderTarget11>>> mRenderTarget; - - // Level-zero workaround members. See TextureStorage11_2D's workaround members for a description. - TextureHelper11 mLevelZeroTexture; - CubeFaceArray<std::unique_ptr<RenderTarget11>> mLevelZeroRenderTarget; - bool mUseLevelZeroTexture; - - TextureHelper11 mSwizzleTexture; - TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; - - CubeFaceArray<TexLevelArray<Image11 *>> mAssociatedImages; -}; - -class TextureStorage11_3D : public TextureStorage11 -{ - public: - TextureStorage11_3D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, - GLsizei width, GLsizei height, GLsizei depth, int levels); - ~TextureStorage11_3D() override; - - gl::Error onDestroy(const gl::Context *context) override; - - gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; - - // Handles both layer and non-layer RTs - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) override; - - void associateImage(Image11 *image, const gl::ImageIndex &index) override; - void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; - void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; - gl::Error releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) override; - - protected: - gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; - gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; - - private: - gl::Error createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) override; - - typedef std::pair<int, int> LevelLayerKey; - std::map<LevelLayerKey, std::unique_ptr<RenderTarget11>> mLevelLayerRenderTargets; - - TexLevelArray<std::unique_ptr<RenderTarget11>> mLevelRenderTargets; - - TextureHelper11 mTexture; - TextureHelper11 mSwizzleTexture; - TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; - - TexLevelArray<Image11 *> mAssociatedImages; -}; - -class TextureStorage11_2DArray : public TextureStorage11 -{ - public: - TextureStorage11_2DArray(Renderer11 *renderer, GLenum internalformat, bool renderTarget, - GLsizei width, GLsizei height, GLsizei depth, int levels); - ~TextureStorage11_2DArray() override; - - gl::Error onDestroy(const gl::Context *context) override; - - gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) override; - - void associateImage(Image11 *image, const gl::ImageIndex &index) override; - void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; - void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; - gl::Error releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) override; - - protected: - gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; - gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; - - gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override; - - private: - struct LevelLayerRangeKey - { - LevelLayerRangeKey(int mipLevelIn, int layerIn, int numLayersIn) - : mipLevel(mipLevelIn), layer(layerIn), numLayers(numLayersIn) - { - } - bool operator<(const LevelLayerRangeKey &other) const - { - if (mipLevel != other.mipLevel) - { - return mipLevel < other.mipLevel; - } - if (layer != other.layer) - { - return layer < other.layer; - } - return numLayers < other.numLayers; - } - int mipLevel; - int layer; - int numLayers; - }; - - private: - gl::Error createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) override; - gl::Error createRenderTargetSRV(const TextureHelper11 &texture, - const gl::ImageIndex &index, - DXGI_FORMAT resourceFormat, - d3d11::SharedSRV *srv) const; - - std::map<LevelLayerRangeKey, std::unique_ptr<RenderTarget11>> mRenderTargets; - - TextureHelper11 mTexture; - - TextureHelper11 mSwizzleTexture; - TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; - - typedef std::map<LevelLayerRangeKey, Image11 *> ImageMap; - ImageMap mAssociatedImages; -}; - -class TextureStorage11_2DMultisample : public TextureStorage11 -{ - public: - TextureStorage11_2DMultisample(Renderer11 *renderer, - GLenum internalformat, - GLsizei width, - GLsizei height, - int levels, - int samples, - bool fixedSampleLocations); - ~TextureStorage11_2DMultisample() override; - - gl::Error onDestroy(const gl::Context *context) override; - - gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) override; - - gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; - - void associateImage(Image11 *image, const gl::ImageIndex &index) override; - void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; - void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; - gl::Error releaseAssociatedImage(const gl::Context *context, - const gl::ImageIndex &index, - Image11 *incomingImage) override; - - protected: - gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; - gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; - - gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override; - - gl::Error ensureTextureExists(int mipLevels); - - private: - gl::Error createSRV(const gl::Context *context, - int baseLevel, - int mipLevels, - DXGI_FORMAT format, - const TextureHelper11 &texture, - d3d11::SharedSRV *outSRV) override; - - TextureHelper11 mTexture; - std::unique_ptr<RenderTarget11> mRenderTarget; - - unsigned int mSamples; - GLboolean mFixedSampleLocations; -}; -} - -#endif // LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp deleted file mode 100644 index 4b08edf71f..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp +++ /dev/null @@ -1,124 +0,0 @@ -// -// 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. -// - -// TransformFeedbackD3D.cpp is a no-op implementation for both the D3D9 and D3D11 renderers. - -#include "libANGLE/renderer/d3d/d3d11/TransformFeedback11.h" - -#include "libANGLE/Buffer.h" -#include "libANGLE/renderer/d3d/d3d11/Buffer11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" - -namespace rx -{ - -TransformFeedback11::TransformFeedback11(const gl::TransformFeedbackState &state, - Renderer11 *renderer) - : TransformFeedbackImpl(state), - mRenderer(renderer), - mIsDirty(true), - mBuffers(state.getIndexedBuffers().size(), nullptr), - mBufferOffsets(state.getIndexedBuffers().size(), 0), - mSerial(mRenderer->generateSerial()) -{ -} - -TransformFeedback11::~TransformFeedback11() -{ -} - -void TransformFeedback11::begin(GLenum primitiveMode) -{ - // Reset all the cached offsets to the binding offsets - mIsDirty = true; - for (size_t bindingIdx = 0; bindingIdx < mBuffers.size(); bindingIdx++) - { - const auto &binding = mState.getIndexedBuffer(bindingIdx); - if (binding.get() != nullptr) - { - mBufferOffsets[bindingIdx] = static_cast<UINT>(binding.getOffset()); - } - else - { - mBufferOffsets[bindingIdx] = 0; - } - } -} - -void TransformFeedback11::end() -{ - if (mRenderer->getWorkarounds().flushAfterEndingTransformFeedback) - { - mRenderer->getDeviceContext()->Flush(); - } -} - -void TransformFeedback11::pause() -{ -} - -void TransformFeedback11::resume() -{ -} - -void TransformFeedback11::bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding) -{ -} - -void TransformFeedback11::bindIndexedBuffer(size_t index, - const gl::OffsetBindingPointer<gl::Buffer> &binding) -{ - mIsDirty = true; - mBufferOffsets[index] = static_cast<UINT>(binding.getOffset()); -} - -void TransformFeedback11::onApply() -{ - mIsDirty = false; - - // Change all buffer offsets to -1 so that if any of them need to be re-applied, the are set to - // append - std::fill(mBufferOffsets.begin(), mBufferOffsets.end(), -1); -} - -bool TransformFeedback11::isDirty() const -{ - return mIsDirty; -} - -UINT TransformFeedback11::getNumSOBuffers() const -{ - return static_cast<UINT>(mBuffers.size()); -} - -gl::ErrorOrResult<const std::vector<ID3D11Buffer *> *> TransformFeedback11::getSOBuffers( - const gl::Context *context) -{ - for (size_t bindingIdx = 0; bindingIdx < mBuffers.size(); bindingIdx++) - { - const auto &binding = mState.getIndexedBuffer(bindingIdx); - if (binding.get() != nullptr) - { - Buffer11 *storage = GetImplAs<Buffer11>(binding.get()); - ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK), - mBuffers[bindingIdx]); - } - } - - return &mBuffers; -} - -const std::vector<UINT> &TransformFeedback11::getSOBufferOffsets() const -{ - return mBufferOffsets; -} - -Serial TransformFeedback11::getSerial() const -{ - return mSerial; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h deleted file mode 100644 index cc9fcc335a..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h +++ /dev/null @@ -1,60 +0,0 @@ -// -// 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. -// - -// TransformFeedback11.h: Implements the abstract rx::TransformFeedbackImpl class. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_TRANSFORMFEEDBACK11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_TRANSFORMFEEDBACK11_H_ - -#include "common/platform.h" - -#include "libANGLE/Error.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/renderer/TransformFeedbackImpl.h" -#include "libANGLE/renderer/renderer_utils.h" - -namespace rx -{ - -class Renderer11; - -class TransformFeedback11 : public TransformFeedbackImpl -{ - public: - TransformFeedback11(const gl::TransformFeedbackState &state, Renderer11 *renderer); - ~TransformFeedback11() override; - - void begin(GLenum primitiveMode) override; - void end() override; - void pause() override; - void resume() override; - - void bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding) override; - void bindIndexedBuffer(size_t index, - const gl::OffsetBindingPointer<gl::Buffer> &binding) override; - - void onApply(); - - bool isDirty() const; - - UINT getNumSOBuffers() const; - gl::ErrorOrResult<const std::vector<ID3D11Buffer *> *> getSOBuffers(const gl::Context *context); - const std::vector<UINT> &getSOBufferOffsets() const; - - Serial getSerial() const; - - private: - Renderer11 *mRenderer; - - bool mIsDirty; - std::vector<ID3D11Buffer *> mBuffers; - std::vector<UINT> mBufferOffsets; - - Serial mSerial; -}; -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_TRANSFORMFEEDBACK11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.cpp deleted file mode 100644 index 29185a9d93..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.cpp +++ /dev/null @@ -1,100 +0,0 @@ -// -// Copyright (c) 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. -// - -// Trim11.cpp: Trim support utility class. - -#include "libANGLE/renderer/d3d/d3d11/Trim11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -#if defined (ANGLE_ENABLE_WINDOWS_STORE) -#include <wrl.h> -#include <wrl/wrappers/corewrappers.h> -#include <windows.applicationmodel.core.h> -using namespace Microsoft::WRL; -using namespace Microsoft::WRL::Wrappers; -using namespace ABI::Windows::ApplicationModel; -using namespace ABI::Windows::ApplicationModel::Core; -using namespace ABI::Windows::Foundation; -using namespace ABI::Windows::Foundation::Collections; -#endif - -namespace rx -{ - -Trim11::Trim11(rx::Renderer11 *renderer) - : mRenderer(renderer) -{ - bool result = true; - result = registerForRendererTrimRequest(); - ASSERT(result); -} - -Trim11::~Trim11() -{ - unregisterForRendererTrimRequest(); -} - -void Trim11::trim() -{ - if (!mRenderer) - { - return; - } - -#if defined (ANGLE_ENABLE_WINDOWS_STORE) - ID3D11Device* device = mRenderer->getDevice(); - IDXGIDevice3 *dxgiDevice3 = d3d11::DynamicCastComObject<IDXGIDevice3>(device); - if (dxgiDevice3) - { - dxgiDevice3->Trim(); - } - SafeRelease(dxgiDevice3); -#endif -} - -bool Trim11::registerForRendererTrimRequest() -{ -#if defined (ANGLE_ENABLE_WINDOWS_STORE) - ICoreApplication* coreApplication = nullptr; - HRESULT result = GetActivationFactory(HStringReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(), &coreApplication); - if (SUCCEEDED(result)) - { - auto suspendHandler = Callback<IEventHandler<SuspendingEventArgs*>>( - [this](IInspectable*, ISuspendingEventArgs*) -> HRESULT - { - trim(); - return S_OK; - }); - result = coreApplication->add_Suspending(suspendHandler.Get(), &mApplicationSuspendedEventToken); - } - SafeRelease(coreApplication); - - if (FAILED(result)) - { - return false; - } -#endif - return true; -} - -void Trim11::unregisterForRendererTrimRequest() -{ -#if defined (ANGLE_ENABLE_WINDOWS_STORE) - if (mApplicationSuspendedEventToken.value != 0) - { - ICoreApplication* coreApplication = nullptr; - if (SUCCEEDED(GetActivationFactory(HStringReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(), &coreApplication))) - { - coreApplication->remove_Suspending(mApplicationSuspendedEventToken); - } - mApplicationSuspendedEventToken.value = 0; - SafeRelease(coreApplication); - } -#endif -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.h deleted file mode 100644 index 69fa05a57b..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.h +++ /dev/null @@ -1,43 +0,0 @@ -// -// Copyright (c) 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. -// - -// Trim11.h: Trim support utility class. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_TRIM11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_TRIM11_H_ - -#include "common/angleutils.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/Error.h" - -#if defined(ANGLE_ENABLE_WINDOWS_STORE) -#include <EventToken.h> -#endif - -namespace rx -{ -class Renderer11; - -class Trim11 : angle::NonCopyable -{ - public: - explicit Trim11(Renderer11 *renderer); - ~Trim11(); - - private: - Renderer11 *mRenderer; -#if defined (ANGLE_ENABLE_WINDOWS_STORE) - EventRegistrationToken mApplicationSuspendedEventToken; -#endif - - void trim(); - bool registerForRendererTrimRequest(); - void unregisterForRendererTrimRequest(); -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D11_TRIM11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp deleted file mode 100644 index 97c29415ed..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp +++ /dev/null @@ -1,413 +0,0 @@ -// -// Copyright 2016 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. -// -// VertexArray11: -// Implementation of rx::VertexArray11. -// - -#include "libANGLE/renderer/d3d/d3d11/VertexArray11.h" - -#include "common/bitset_utils.h" -#include "libANGLE/Context.h" -#include "libANGLE/renderer/d3d/d3d11/Buffer11.h" -#include "libANGLE/renderer/d3d/d3d11/Context11.h" - -using namespace angle; - -namespace rx -{ - -namespace -{ -OnBufferDataDirtyChannel *GetBufferBroadcastChannel(Buffer11 *buffer11, - IndexStorageType storageType) -{ - switch (storageType) - { - case IndexStorageType::Direct: - return buffer11->getDirectBroadcastChannel(); - case IndexStorageType::Static: - return buffer11->getStaticBroadcastChannel(); - case IndexStorageType::Dynamic: - return buffer11 ? buffer11->getStaticBroadcastChannel() : nullptr; - default: - UNREACHABLE(); - return nullptr; - } -} -} // anonymous namespace - -VertexArray11::VertexArray11(const gl::VertexArrayState &data) - : VertexArrayImpl(data), - mAttributeStorageTypes(data.getMaxAttribs(), VertexStorageType::CURRENT_VALUE), - mTranslatedAttribs(data.getMaxAttribs()), - mCurrentArrayBuffers(data.getMaxAttribs()), - mCurrentElementArrayBuffer(), - mOnArrayBufferDataDirty(), - mOnElementArrayBufferDataDirty(this, mCurrentArrayBuffers.size()), - mAppliedNumViewsToDivisor(1), - mLastElementType(GL_NONE), - mLastDrawElementsOffset(0), - mCurrentElementArrayStorage(IndexStorageType::Invalid), - mCachedIndexInfoValid(false) -{ - for (size_t attribIndex = 0; attribIndex < mCurrentArrayBuffers.size(); ++attribIndex) - { - mOnArrayBufferDataDirty.emplace_back(this, attribIndex); - } -} - -VertexArray11::~VertexArray11() -{ -} - -void VertexArray11::destroy(const gl::Context *context) -{ - for (auto &buffer : mCurrentArrayBuffers) - { - if (buffer.get()) - { - buffer.set(context, nullptr); - } - } - - mCurrentElementArrayBuffer.set(context, nullptr); -} - -void VertexArray11::syncState(const gl::Context *context, - const gl::VertexArray::DirtyBits &dirtyBits) -{ - ASSERT(dirtyBits.any()); - - // Generate a state serial. This serial is used in the program class to validate the cached - // input layout, and skip recomputation in the fast path. - Renderer11 *renderer = GetImplAs<Context11>(context)->getRenderer(); - mCurrentStateSerial = renderer->generateSerial(); - - // TODO(jmadill): Individual attribute invalidation. - renderer->getStateManager()->invalidateVertexBuffer(); - - for (auto dirtyBit : dirtyBits) - { - if (dirtyBit == gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER) - { - mCachedIndexInfoValid = false; - mLastElementType = GL_NONE; - } - else - { - size_t index = gl::VertexArray::GetVertexIndexFromDirtyBit(dirtyBit); - // TODO(jiawei.shao@intel.com): Vertex Attrib Bindings - ASSERT(index == mState.getBindingIndexFromAttribIndex(index)); - mAttribsToUpdate.set(index); - } - } -} - -bool VertexArray11::flushAttribUpdates(const gl::Context *context) -{ - if (mAttribsToUpdate.any()) - { - const auto &activeLocations = - context->getGLState().getProgram()->getActiveAttribLocationsMask(); - - // Skip attrib locations the program doesn't use. - gl::AttributesMask activeToUpdate = mAttribsToUpdate & activeLocations; - - for (auto toUpdateIndex : activeToUpdate) - { - mAttribsToUpdate.reset(toUpdateIndex); - updateVertexAttribStorage(context, toUpdateIndex); - } - - return true; - } - - return false; -} - -bool VertexArray11::updateElementArrayStorage(const gl::Context *context, - GLenum elementType, - GLenum destElementType, - const void *indices) -{ - unsigned int offset = static_cast<unsigned int>(reinterpret_cast<uintptr_t>(indices)); - - if (mCachedIndexInfoValid && mLastElementType == elementType && - offset == mLastDrawElementsOffset) - { - // Dynamic index buffers must be re-streamed every draw. - return (mCurrentElementArrayStorage == IndexStorageType::Dynamic); - } - - gl::Buffer *newBuffer = mState.getElementArrayBuffer().get(); - gl::Buffer *oldBuffer = mCurrentElementArrayBuffer.get(); - bool needsTranslation = false; - IndexStorageType newStorageType = ClassifyIndexStorage( - context->getGLState(), newBuffer, elementType, destElementType, offset, &needsTranslation); - - if (newBuffer != oldBuffer) - { - mCurrentElementArrayBuffer.set(context, newBuffer); - } - - if (newStorageType != mCurrentElementArrayStorage || newBuffer != oldBuffer) - { - Buffer11 *newBuffer11 = SafeGetImplAs<Buffer11>(newBuffer); - - auto *newChannel = GetBufferBroadcastChannel(newBuffer11, newStorageType); - - mCurrentElementArrayStorage = newStorageType; - mOnElementArrayBufferDataDirty.bind(newChannel); - needsTranslation = true; - } - - if (mLastDrawElementsOffset != offset) - { - needsTranslation = true; - mLastDrawElementsOffset = offset; - } - - if (mLastElementType != elementType) - { - needsTranslation = true; - mLastElementType = elementType; - } - - // TODO(jmadill): We should probably promote static usage immediately, because this can change - // the storage type for dynamic buffers. - return needsTranslation || !mCachedIndexInfoValid; -} - -void VertexArray11::updateVertexAttribStorage(const gl::Context *context, size_t attribIndex) -{ - const auto &attrib = mState.getVertexAttribute(attribIndex); - const auto &binding = mState.getBindingFromAttribIndex(attribIndex); - - // Note: having an unchanged storage type doesn't mean the attribute is clean. - auto oldStorageType = mAttributeStorageTypes[attribIndex]; - auto newStorageType = ClassifyAttributeStorage(attrib, binding); - - mAttributeStorageTypes[attribIndex] = newStorageType; - - StateManager11 *stateManager = GetImplAs<Context11>(context)->getRenderer()->getStateManager(); - - if (newStorageType == VertexStorageType::DYNAMIC) - { - if (oldStorageType != VertexStorageType::DYNAMIC) - { - // Sync dynamic attribs in a different set. - mAttribsToTranslate.reset(attribIndex); - mDynamicAttribsMask.set(attribIndex); - } - } - else - { - mAttribsToTranslate.set(attribIndex); - stateManager->invalidateVertexAttributeTranslation(); - - if (oldStorageType == VertexStorageType::DYNAMIC) - { - ASSERT(mDynamicAttribsMask[attribIndex]); - mDynamicAttribsMask.reset(attribIndex); - } - } - - gl::Buffer *oldBufferGL = mCurrentArrayBuffers[attribIndex].get(); - gl::Buffer *newBufferGL = binding.getBuffer().get(); - Buffer11 *oldBuffer11 = oldBufferGL ? GetImplAs<Buffer11>(oldBufferGL) : nullptr; - Buffer11 *newBuffer11 = newBufferGL ? GetImplAs<Buffer11>(newBufferGL) : nullptr; - - if (oldBuffer11 != newBuffer11 || oldStorageType != newStorageType) - { - OnBufferDataDirtyChannel *newChannel = nullptr; - - if (newStorageType == VertexStorageType::CURRENT_VALUE) - { - stateManager->invalidateCurrentValueAttrib(attribIndex); - } - else if (newBuffer11 != nullptr) - { - // Note that for static callbacks, promotion to a static buffer from a dynamic buffer - // means we need to tag dynamic buffers with static callbacks. - switch (newStorageType) - { - case VertexStorageType::DIRECT: - newChannel = newBuffer11->getDirectBroadcastChannel(); - break; - case VertexStorageType::STATIC: - case VertexStorageType::DYNAMIC: - newChannel = newBuffer11->getStaticBroadcastChannel(); - break; - default: - UNREACHABLE(); - break; - } - } - - mOnArrayBufferDataDirty[attribIndex].bind(newChannel); - mCurrentArrayBuffers[attribIndex].set(context, binding.getBuffer().get()); - } -} - -bool VertexArray11::hasActiveDynamicAttrib(const gl::Context *context) -{ - flushAttribUpdates(context); - const auto &activeLocations = - context->getGLState().getProgram()->getActiveAttribLocationsMask(); - auto activeDynamicAttribs = (mDynamicAttribsMask & activeLocations); - return activeDynamicAttribs.any(); -} - -gl::Error VertexArray11::updateDirtyAndDynamicAttribs(const gl::Context *context, - VertexDataManager *vertexDataManager, - const DrawCallVertexParams &vertexParams) -{ - flushAttribUpdates(context); - - const auto &glState = context->getGLState(); - const gl::Program *program = glState.getProgram(); - const auto &activeLocations = program->getActiveAttribLocationsMask(); - const auto &attribs = mState.getVertexAttributes(); - const auto &bindings = mState.getVertexBindings(); - mAppliedNumViewsToDivisor = - (program != nullptr && program->usesMultiview()) ? program->getNumViews() : 1; - - if (mAttribsToTranslate.any()) - { - // Skip attrib locations the program doesn't use, saving for the next frame. - gl::AttributesMask dirtyActiveAttribs = (mAttribsToTranslate & activeLocations); - - for (auto dirtyAttribIndex : dirtyActiveAttribs) - { - mAttribsToTranslate.reset(dirtyAttribIndex); - - auto *translatedAttrib = &mTranslatedAttribs[dirtyAttribIndex]; - const auto ¤tValue = glState.getVertexAttribCurrentValue(dirtyAttribIndex); - - // Record basic attrib info - translatedAttrib->attribute = &attribs[dirtyAttribIndex]; - translatedAttrib->binding = &bindings[translatedAttrib->attribute->bindingIndex]; - translatedAttrib->currentValueType = currentValue.Type; - translatedAttrib->divisor = - translatedAttrib->binding->getDivisor() * mAppliedNumViewsToDivisor; - - switch (mAttributeStorageTypes[dirtyAttribIndex]) - { - case VertexStorageType::DIRECT: - VertexDataManager::StoreDirectAttrib(translatedAttrib); - break; - case VertexStorageType::STATIC: - { - ANGLE_TRY(VertexDataManager::StoreStaticAttrib(context, translatedAttrib)); - break; - } - case VertexStorageType::CURRENT_VALUE: - // Current value attribs are managed by the StateManager11. - break; - default: - UNREACHABLE(); - break; - } - } - } - - if (mDynamicAttribsMask.any()) - { - auto activeDynamicAttribs = (mDynamicAttribsMask & activeLocations); - if (activeDynamicAttribs.none()) - { - return gl::NoError(); - } - - for (auto dynamicAttribIndex : activeDynamicAttribs) - { - auto *dynamicAttrib = &mTranslatedAttribs[dynamicAttribIndex]; - const auto ¤tValue = glState.getVertexAttribCurrentValue(dynamicAttribIndex); - - // Record basic attrib info - dynamicAttrib->attribute = &attribs[dynamicAttribIndex]; - dynamicAttrib->binding = &bindings[dynamicAttrib->attribute->bindingIndex]; - dynamicAttrib->currentValueType = currentValue.Type; - dynamicAttrib->divisor = - dynamicAttrib->binding->getDivisor() * mAppliedNumViewsToDivisor; - } - - ANGLE_TRY(vertexDataManager->storeDynamicAttribs( - context, &mTranslatedAttribs, activeDynamicAttribs, vertexParams.firstVertex(), - vertexParams.vertexCount(), vertexParams.instances())); - } - - return gl::NoError(); -} - -const std::vector<TranslatedAttribute> &VertexArray11::getTranslatedAttribs() const -{ - return mTranslatedAttribs; -} - -void VertexArray11::signal(size_t channelID, const gl::Context *context) -{ - if (channelID == mAttributeStorageTypes.size()) - { - mCachedIndexInfoValid = false; - mLastElementType = GL_NONE; - mLastDrawElementsOffset = 0; - } - else - { - ASSERT(mAttributeStorageTypes[channelID] != VertexStorageType::CURRENT_VALUE); - - // This can change a buffer's storage, we'll need to re-check. - mAttribsToUpdate.set(channelID); - - // Changing the vertex attribute state can affect the vertex shader. - Renderer11 *renderer = GetImplAs<Context11>(context)->getRenderer(); - renderer->getStateManager()->invalidateShaders(); - } -} - -void VertexArray11::clearDirtyAndPromoteDynamicAttribs(const gl::Context *context, - const DrawCallVertexParams &vertexParams) -{ - const gl::State &state = context->getGLState(); - const gl::Program *program = state.getProgram(); - const auto &activeLocations = program->getActiveAttribLocationsMask(); - mAttribsToUpdate &= ~activeLocations; - - // Promote to static after we clear the dirty attributes, otherwise we can lose dirtyness. - auto activeDynamicAttribs = (mDynamicAttribsMask & activeLocations); - if (activeDynamicAttribs.any()) - { - VertexDataManager::PromoteDynamicAttribs(context, mTranslatedAttribs, activeDynamicAttribs, - vertexParams.vertexCount()); - } -} - -void VertexArray11::markAllAttributeDivisorsForAdjustment(int numViews) -{ - if (mAppliedNumViewsToDivisor != numViews) - { - mAppliedNumViewsToDivisor = numViews; - mAttribsToUpdate.set(); - } -} - -TranslatedIndexData *VertexArray11::getCachedIndexInfo() -{ - return &mCachedIndexInfo; -} - -void VertexArray11::setCachedIndexInfoValid() -{ - mCachedIndexInfoValid = true; -} - -bool VertexArray11::isCachedIndexInfoValid() const -{ - return mCachedIndexInfoValid; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h deleted file mode 100644 index 4cdc92531d..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h +++ /dev/null @@ -1,99 +0,0 @@ -// -// 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. -// - -// VertexArray11.h: Defines the rx::VertexArray11 class which implements rx::VertexArrayImpl. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_VERTEXARRAY11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_VERTEXARRAY11_H_ - -#include "libANGLE/Framebuffer.h" -#include "libANGLE/renderer/VertexArrayImpl.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/signal_utils.h" - -namespace rx -{ -class Renderer11; - -class VertexArray11 : public VertexArrayImpl, public OnBufferDataDirtyReceiver -{ - public: - VertexArray11(const gl::VertexArrayState &data); - ~VertexArray11() override; - void destroy(const gl::Context *context) override; - - void syncState(const gl::Context *context, - const gl::VertexArray::DirtyBits &dirtyBits) override; - // This will flush any pending attrib updates and then check the dynamic attribs mask. - bool hasActiveDynamicAttrib(const gl::Context *context); - gl::Error updateDirtyAndDynamicAttribs(const gl::Context *context, - VertexDataManager *vertexDataManager, - const DrawCallVertexParams &vertexParams); - void clearDirtyAndPromoteDynamicAttribs(const gl::Context *context, - const DrawCallVertexParams &vertexParams); - - const std::vector<TranslatedAttribute> &getTranslatedAttribs() const; - - // SignalReceiver implementation - void signal(size_t channelID, const gl::Context *context) override; - - Serial getCurrentStateSerial() const { return mCurrentStateSerial; } - - // In case of a multi-view program change, we have to update all attributes so that the divisor - // is adjusted. - void markAllAttributeDivisorsForAdjustment(int numViews); - - bool flushAttribUpdates(const gl::Context *context); - - // Returns true if the element array buffer needs to be translated. - bool updateElementArrayStorage(const gl::Context *context, - GLenum elementType, - GLenum destElementType, - const void *indices); - - TranslatedIndexData *getCachedIndexInfo(); - void setCachedIndexInfoValid(); - bool isCachedIndexInfoValid() const; - - private: - void updateVertexAttribStorage(const gl::Context *context, size_t attribIndex); - - std::vector<VertexStorageType> mAttributeStorageTypes; - std::vector<TranslatedAttribute> mTranslatedAttribs; - - // The mask of attributes marked as dynamic. - gl::AttributesMask mDynamicAttribsMask; - - // A mask of attributes that need to be re-evaluated. - gl::AttributesMask mAttribsToUpdate; - - // A set of attributes we know are dirty, and need to be re-translated. - gl::AttributesMask mAttribsToTranslate; - - // We need to keep a safe pointer to the Buffer so we can attach the correct dirty callbacks. - std::vector<gl::BindingPointer<gl::Buffer>> mCurrentArrayBuffers; - gl::BindingPointer<gl::Buffer> mCurrentElementArrayBuffer; - - std::vector<OnBufferDataDirtyBinding> mOnArrayBufferDataDirty; - OnBufferDataDirtyBinding mOnElementArrayBufferDataDirty; - - Serial mCurrentStateSerial; - - // The numViews value used to adjust the divisor. - int mAppliedNumViewsToDivisor; - - // If the index buffer needs re-streaming. - GLenum mLastElementType; - unsigned int mLastDrawElementsOffset; - IndexStorageType mCurrentElementArrayStorage; - TranslatedIndexData mCachedIndexInfo; - bool mCachedIndexInfoValid; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_VERTEXARRAY11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp deleted file mode 100644 index 611bd0f18b..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp +++ /dev/null @@ -1,184 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// VertexBuffer11.cpp: Defines the D3D11 VertexBuffer implementation. - -#include "libANGLE/renderer/d3d/d3d11/VertexBuffer11.h" - -#include "libANGLE/Buffer.h" -#include "libANGLE/VertexAttribute.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/d3d11/Buffer11.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -namespace rx -{ - -VertexBuffer11::VertexBuffer11(Renderer11 *const renderer) - : mRenderer(renderer), - mBuffer(), - mBufferSize(0), - mDynamicUsage(false), - mMappedResourceData(nullptr) -{ -} - -VertexBuffer11::~VertexBuffer11() -{ - ASSERT(mMappedResourceData == nullptr); -} - -gl::Error VertexBuffer11::initialize(unsigned int size, bool dynamicUsage) -{ - mBuffer.reset(); - updateSerial(); - - if (size > 0) - { - D3D11_BUFFER_DESC bufferDesc; - bufferDesc.ByteWidth = size; - bufferDesc.Usage = D3D11_USAGE_DYNAMIC; - bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - bufferDesc.MiscFlags = 0; - bufferDesc.StructureByteStride = 0; - - ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &mBuffer)); - - if (dynamicUsage) - { - mBuffer.setDebugName("VertexBuffer11 (dynamic)"); - } - else - { - mBuffer.setDebugName("VertexBuffer11 (static)"); - } - } - - mBufferSize = size; - mDynamicUsage = dynamicUsage; - - return gl::NoError(); -} - -gl::Error VertexBuffer11::mapResource() -{ - if (mMappedResourceData == nullptr) - { - ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext(); - - D3D11_MAPPED_SUBRESOURCE mappedResource; - - HRESULT result = - dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to map internal vertex buffer, " << gl::FmtHR(result); - } - - mMappedResourceData = reinterpret_cast<uint8_t *>(mappedResource.pData); - } - - return gl::NoError(); -} - -void VertexBuffer11::hintUnmapResource() -{ - if (mMappedResourceData != nullptr) - { - ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext(); - dxContext->Unmap(mBuffer.get(), 0); - - mMappedResourceData = nullptr; - } -} - -gl::Error VertexBuffer11::storeVertexAttributes(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLenum currentValueType, - GLint start, - GLsizei count, - GLsizei instances, - unsigned int offset, - const uint8_t *sourceData) -{ - if (!mBuffer.valid()) - { - return gl::OutOfMemory() << "Internal vertex buffer is not initialized."; - } - - int inputStride = static_cast<int>(ComputeVertexAttributeStride(attrib, binding)); - - // This will map the resource if it isn't already mapped. - ANGLE_TRY(mapResource()); - - uint8_t *output = mMappedResourceData + offset; - - const uint8_t *input = sourceData; - - if (instances == 0 || binding.getDivisor() == 0) - { - input += inputStride * start; - } - - gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, currentValueType); - const D3D_FEATURE_LEVEL featureLevel = mRenderer->getRenderer11DeviceCaps().featureLevel; - const d3d11::VertexFormat &vertexFormatInfo = - d3d11::GetVertexFormatInfo(vertexFormatType, featureLevel); - ASSERT(vertexFormatInfo.copyFunction != nullptr); - vertexFormatInfo.copyFunction(input, inputStride, count, output); - - return gl::NoError(); -} - -unsigned int VertexBuffer11::getBufferSize() const -{ - return mBufferSize; -} - -gl::Error VertexBuffer11::setBufferSize(unsigned int size) -{ - if (size > mBufferSize) - { - return initialize(size, mDynamicUsage); - } - else - { - return gl::NoError(); - } -} - -gl::Error VertexBuffer11::discard() -{ - if (!mBuffer.valid()) - { - return gl::OutOfMemory() << "Internal vertex buffer is not initialized."; - } - - ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext(); - - D3D11_MAPPED_SUBRESOURCE mappedResource; - HRESULT result = dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to map internal buffer for discarding, " - << gl::FmtHR(result); - } - - dxContext->Unmap(mBuffer.get(), 0); - - return gl::NoError(); -} - -const d3d11::Buffer &VertexBuffer11::getBuffer() const -{ - return mBuffer; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h deleted file mode 100644 index ab619ae503..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// VertexBuffer11.h: Defines the D3D11 VertexBuffer implementation. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_VERTEXBUFFER11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_VERTEXBUFFER11_H_ - -#include <stdint.h> - -#include "libANGLE/renderer/d3d/VertexBuffer.h" -#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" - -namespace rx -{ -class Renderer11; - -class VertexBuffer11 : public VertexBuffer -{ - public: - explicit VertexBuffer11(Renderer11 *const renderer); - - gl::Error initialize(unsigned int size, bool dynamicUsage) override; - - // Warning: you should ensure binding really matches attrib.bindingIndex before using this - // function. - gl::Error storeVertexAttributes(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLenum currentValueType, - GLint start, - GLsizei count, - GLsizei instances, - unsigned int offset, - const uint8_t *sourceData) override; - - unsigned int getBufferSize() const override; - gl::Error setBufferSize(unsigned int size) override; - gl::Error discard() override; - - void hintUnmapResource() override; - - const d3d11::Buffer &getBuffer() const; - - private: - ~VertexBuffer11() override; - gl::Error mapResource(); - - Renderer11 *const mRenderer; - - d3d11::Buffer mBuffer; - unsigned int mBufferSize; - bool mDynamicUsage; - - uint8_t *mMappedResourceData; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_VERTEXBUFFER11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.h deleted file mode 100644 index 5501e361f1..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// Copyright (c) 2013-2015 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. -// - -// copyvertex.h: Defines D3D11 vertex buffer copying and conversion functions - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_COPYVERTEX_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_COPYVERTEX_H_ - -#include "common/mathutil.h" - -namespace rx -{ - -// 'alphaDefaultValueBits' gives the default value for the alpha channel (4th component) -template <typename T, size_t inputComponentCount, size_t outputComponentCount, uint32_t alphaDefaultValueBits> -inline void CopyNativeVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output); - -template <size_t inputComponentCount, size_t outputComponentCount> -inline void Copy8SintTo16SintVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output); - -template <size_t componentCount> -inline void Copy8SnormTo16SnormVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output); - -template <size_t inputComponentCount, size_t outputComponentCount> -inline void Copy32FixedTo32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output); - -template <typename T, size_t inputComponentCount, size_t outputComponentCount, bool normalized> -inline void CopyTo32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output); - -template <bool isSigned, bool normalized, bool toFloat> -inline void CopyXYZ10W2ToXYZW32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output); - -} - -#include "copyvertex.inl" - -#endif // LIBANGLE_RENDERER_D3D_D3D11_COPYVERTEX_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.inl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.inl deleted file mode 100644 index 7c5c157c6f..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.inl +++ /dev/null @@ -1,386 +0,0 @@ -// -// Copyright (c) 2014-2015 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. -// - -namespace rx -{ - -template <typename T, size_t inputComponentCount, size_t outputComponentCount, uint32_t alphaDefaultValueBits> -inline void CopyNativeVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output) -{ - const size_t attribSize = sizeof(T)* inputComponentCount; - - if (attribSize == stride && inputComponentCount == outputComponentCount) - { - memcpy(output, input, count * attribSize); - return; - } - - if (inputComponentCount == outputComponentCount) - { - for (size_t i = 0; i < count; i++) - { - const T *offsetInput = reinterpret_cast<const T*>(input + (i * stride)); - T *offsetOutput = reinterpret_cast<T*>(output) + i * outputComponentCount; - - memcpy(offsetOutput, offsetInput, attribSize); - } - return; - } - - const T defaultAlphaValue = gl::bitCast<T>(alphaDefaultValueBits); - const size_t lastNonAlphaOutputComponent = std::min<size_t>(outputComponentCount, 3); - - for (size_t i = 0; i < count; i++) - { - const T *offsetInput = reinterpret_cast<const T*>(input + (i * stride)); - T *offsetOutput = reinterpret_cast<T*>(output) + i * outputComponentCount; - - memcpy(offsetOutput, offsetInput, attribSize); - - if (inputComponentCount < lastNonAlphaOutputComponent) - { - // Set the remaining G/B channels to 0. - size_t numComponents = (lastNonAlphaOutputComponent - inputComponentCount); - memset(&offsetOutput[inputComponentCount], 0, numComponents * sizeof(T)); - } - - if (inputComponentCount < outputComponentCount && outputComponentCount == 4) - { - // Set the remaining alpha channel to the defaultAlphaValue. - offsetOutput[3] = defaultAlphaValue; - } - } -} - -template <size_t inputComponentCount, size_t outputComponentCount> -inline void Copy8SintTo16SintVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output) -{ - const size_t lastNonAlphaOutputComponent = std::min<size_t>(outputComponentCount, 3); - - for (size_t i = 0; i < count; i++) - { - const GLbyte *offsetInput = reinterpret_cast<const GLbyte*>(input + i * stride); - GLshort *offsetOutput = reinterpret_cast<GLshort*>(output)+i * outputComponentCount; - - for (size_t j = 0; j < inputComponentCount; j++) - { - offsetOutput[j] = static_cast<GLshort>(offsetInput[j]); - } - - for (size_t j = inputComponentCount; j < lastNonAlphaOutputComponent; j++) - { - // Set remaining G/B channels to 0. - offsetOutput[j] = 0; - } - - if (inputComponentCount < outputComponentCount && outputComponentCount == 4) - { - // On integer formats, we must set the Alpha channel to 1 if it's unused. - offsetOutput[3] = 1; - } - } -} - -template <size_t inputComponentCount, size_t outputComponentCount> -inline void Copy8SnormTo16SnormVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output) -{ - for (size_t i = 0; i < count; i++) - { - const GLbyte *offsetInput = reinterpret_cast<const GLbyte*>(input + i * stride); - GLshort *offsetOutput = reinterpret_cast<GLshort*>(output) + i * outputComponentCount; - - for (size_t j = 0; j < inputComponentCount; j++) - { - // The original GLbyte value ranges from -128 to +127 (INT8_MAX). - // When converted to GLshort, the value must be scaled to between -32768 and +32767 (INT16_MAX). - if (offsetInput[j] > 0) - { - offsetOutput[j] = offsetInput[j] << 8 | offsetInput[j] << 1 | ((offsetInput[j] & 0x40) >> 6); - } - else - { - offsetOutput[j] = offsetInput[j] << 8; - } - } - - for (size_t j = inputComponentCount; j < std::min<size_t>(outputComponentCount, 3); j++) - { - // Set remaining G/B channels to 0. - offsetOutput[j] = 0; - } - - if (inputComponentCount < outputComponentCount && outputComponentCount == 4) - { - // On normalized formats, we must set the Alpha channel to the max value if it's unused. - offsetOutput[3] = INT16_MAX; - } - } -} - -template <size_t inputComponentCount, size_t outputComponentCount> -inline void Copy32FixedTo32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output) -{ - static const float divisor = 1.0f / (1 << 16); - - for (size_t i = 0; i < count; i++) - { - const GLfixed* offsetInput = reinterpret_cast<const GLfixed*>(input + (stride * i)); - float* offsetOutput = reinterpret_cast<float*>(output) + i * outputComponentCount; - - for (size_t j = 0; j < inputComponentCount; j++) - { - offsetOutput[j] = static_cast<float>(offsetInput[j]) * divisor; - } - - // 4-component output formats would need special padding in the alpha channel. - static_assert(!(inputComponentCount < 4 && outputComponentCount == 4), - "An inputComponentCount less than 4 and an outputComponentCount equal to 4 is not supported."); - - for (size_t j = inputComponentCount; j < outputComponentCount; j++) - { - offsetOutput[j] = 0.0f; - } - } -} - -template <typename T, size_t inputComponentCount, size_t outputComponentCount, bool normalized> -inline void CopyTo32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output) -{ - typedef std::numeric_limits<T> NL; - - for (size_t i = 0; i < count; i++) - { - const T *offsetInput = reinterpret_cast<const T*>(input + (stride * i)); - float *offsetOutput = reinterpret_cast<float*>(output) + i * outputComponentCount; - - for (size_t j = 0; j < inputComponentCount; j++) - { - if (normalized) - { - if (NL::is_signed) - { - const float divisor = 1.0f / (2 * static_cast<float>(NL::max()) + 1); - offsetOutput[j] = (2 * static_cast<float>(offsetInput[j]) + 1) * divisor; - } - else - { - offsetOutput[j] = static_cast<float>(offsetInput[j]) / NL::max(); - } - } - else - { - offsetOutput[j] = static_cast<float>(offsetInput[j]); - } - } - - // This would require special padding. - static_assert(!(inputComponentCount < 4 && outputComponentCount == 4), - "An inputComponentCount less than 4 and an outputComponentCount equal to 4 is not supported."); - - for (size_t j = inputComponentCount; j < outputComponentCount; j++) - { - offsetOutput[j] = 0.0f; - } - } -} - -namespace priv -{ - -template <bool isSigned, bool normalized, bool toFloat> -static inline void CopyPackedRGB(uint32_t data, uint8_t *output) -{ - const uint32_t rgbSignMask = 0x200; // 1 set at the 9 bit - const uint32_t negativeMask = 0xFFFFFC00; // All bits from 10 to 31 set to 1 - - if (toFloat) - { - GLfloat *floatOutput = reinterpret_cast<GLfloat*>(output); - if (isSigned) - { - GLfloat finalValue = 0; - if (data & rgbSignMask) - { - int negativeNumber = data | negativeMask; - finalValue = static_cast<GLfloat>(negativeNumber); - } - else - { - finalValue = static_cast<GLfloat>(data); - } - - if (normalized) - { - const int32_t maxValue = 0x1FF; // 1 set in bits 0 through 8 - const int32_t minValue = 0xFFFFFE01; // Inverse of maxValue - - // A 10-bit two's complement number has the possibility of being minValue - 1 but - // OpenGL's normalization rules dictate that it should be clamped to minValue in this - // case. - if (finalValue < minValue) - { - finalValue = minValue; - } - - const int32_t halfRange = (maxValue - minValue) >> 1; - *floatOutput = ((finalValue - minValue) / halfRange) - 1.0f; - } - else - { - *floatOutput = finalValue; - } - } - else - { - if (normalized) - { - const uint32_t maxValue = 0x3FF; // 1 set in bits 0 through 9 - *floatOutput = static_cast<GLfloat>(data) / static_cast<GLfloat>(maxValue); - } - else - { - *floatOutput = static_cast<GLfloat>(data); - } - } - } - else - { - if (isSigned) - { - GLshort *intOutput = reinterpret_cast<GLshort*>(output); - - if (data & rgbSignMask) - { - *intOutput = static_cast<GLshort>(data | negativeMask); - } - else - { - *intOutput = static_cast<GLshort>(data); - } - } - else - { - GLushort *uintOutput = reinterpret_cast<GLushort*>(output); - *uintOutput = static_cast<GLushort>(data); - } - } -} - -template <bool isSigned, bool normalized, bool toFloat> -inline void CopyPackedAlpha(uint32_t data, uint8_t *output) -{ - if (toFloat) - { - GLfloat *floatOutput = reinterpret_cast<GLfloat*>(output); - if (isSigned) - { - if (normalized) - { - switch (data) - { - case 0x0: *floatOutput = 0.0f; break; - case 0x1: *floatOutput = 1.0f; break; - case 0x2: *floatOutput = -1.0f; break; - case 0x3: *floatOutput = -1.0f; break; - default: UNREACHABLE(); - } - } - else - { - switch (data) - { - case 0x0: *floatOutput = 0.0f; break; - case 0x1: *floatOutput = 1.0f; break; - case 0x2: *floatOutput = -2.0f; break; - case 0x3: *floatOutput = -1.0f; break; - default: UNREACHABLE(); - } - } - } - else - { - if (normalized) - { - switch (data) - { - case 0x0: *floatOutput = 0.0f / 3.0f; break; - case 0x1: *floatOutput = 1.0f / 3.0f; break; - case 0x2: *floatOutput = 2.0f / 3.0f; break; - case 0x3: *floatOutput = 3.0f / 3.0f; break; - default: UNREACHABLE(); - } - } - else - { - switch (data) - { - case 0x0: *floatOutput = 0.0f; break; - case 0x1: *floatOutput = 1.0f; break; - case 0x2: *floatOutput = 2.0f; break; - case 0x3: *floatOutput = 3.0f; break; - default: UNREACHABLE(); - } - } - } - } - else - { - if (isSigned) - { - GLshort *intOutput = reinterpret_cast<GLshort*>(output); - switch (data) - { - case 0x0: *intOutput = 0; break; - case 0x1: *intOutput = 1; break; - case 0x2: *intOutput = -2; break; - case 0x3: *intOutput = -1; break; - default: UNREACHABLE(); - } - } - else - { - GLushort *uintOutput = reinterpret_cast<GLushort*>(output); - switch (data) - { - case 0x0: *uintOutput = 0; break; - case 0x1: *uintOutput = 1; break; - case 0x2: *uintOutput = 2; break; - case 0x3: *uintOutput = 3; break; - default: UNREACHABLE(); - } - } - } -} - -} - -template <bool isSigned, bool normalized, bool toFloat> -inline void CopyXYZ10W2ToXYZW32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output) -{ - const size_t outputComponentSize = toFloat ? 4 : 2; - const size_t componentCount = 4; - - const uint32_t rgbMask = 0x3FF; // 1 set in bits 0 through 9 - const size_t redShift = 0; // red is bits 0 through 9 - const size_t greenShift = 10; // green is bits 10 through 19 - const size_t blueShift = 20; // blue is bits 20 through 29 - - const uint32_t alphaMask = 0x3; // 1 set in bits 0 and 1 - const size_t alphaShift = 30; // Alpha is the 30 and 31 bits - - for (size_t i = 0; i < count; i++) - { - GLuint packedValue = *reinterpret_cast<const GLuint*>(input + (i * stride)); - uint8_t *offsetOutput = output + (i * outputComponentSize * componentCount); - - priv::CopyPackedRGB<isSigned, normalized, toFloat>( (packedValue >> redShift) & rgbMask, offsetOutput + (0 * outputComponentSize)); - priv::CopyPackedRGB<isSigned, normalized, toFloat>( (packedValue >> greenShift) & rgbMask, offsetOutput + (1 * outputComponentSize)); - priv::CopyPackedRGB<isSigned, normalized, toFloat>( (packedValue >> blueShift) & rgbMask, offsetOutput + (2 * outputComponentSize)); - priv::CopyPackedAlpha<isSigned, normalized, toFloat>((packedValue >> alphaShift) & alphaMask, offsetOutput + (3 * outputComponentSize)); - } -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json deleted file mode 100644 index 891d30d252..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "UNKNOWN": "NONE", - "R32G32B32A32_TYPELESS": "", - "R32G32B32A32_FLOAT": "", - "R32G32B32A32_UINT": "", - "R32G32B32A32_SINT": "", - "R32G32B32_TYPELESS": "", - "R32G32B32_FLOAT": "", - "R32G32B32_UINT": "", - "R32G32B32_SINT": "", - "R16G16B16A16_TYPELESS": "", - "R16G16B16A16_FLOAT": "", - "R16G16B16A16_UNORM": "", - "R16G16B16A16_UINT": "", - "R16G16B16A16_SNORM": "", - "R16G16B16A16_SINT": "", - "R32G32_TYPELESS": "", - "R32G32_FLOAT": "", - "R32G32_UINT": "", - "R32G32_SINT": "", - "R32G8X24_TYPELESS": "", - "D32_FLOAT_S8X24_UINT": "", - "R32_FLOAT_X8X24_TYPELESS": "", - "X32_TYPELESS_G8X24_UINT": "", - "R10G10B10A2_TYPELESS": "", - "R10G10B10A2_UNORM": "", - "R10G10B10A2_UINT": "", - "R11G11B10_FLOAT": "", - "R8G8B8A8_TYPELESS": "", - "R8G8B8A8_UNORM": "", - "R8G8B8A8_UNORM_SRGB": "", - "R8G8B8A8_UINT": "", - "R8G8B8A8_SNORM": "", - "R8G8B8A8_SINT": "", - "R16G16_TYPELESS": "", - "R16G16_FLOAT": "", - "R16G16_UNORM": "", - "R16G16_UINT": "", - "R16G16_SNORM": "", - "R16G16_SINT": "", - "R32_TYPELESS": "", - "D32_FLOAT": "", - "R32_FLOAT": "", - "R32_UINT": "", - "R32_SINT": "", - "R24G8_TYPELESS": "", - "D24_UNORM_S8_UINT": "", - "R24_UNORM_X8_TYPELESS": "", - "X24_TYPELESS_G8_UINT": "", - "R8G8_TYPELESS": "", - "R8G8_UNORM": "", - "R8G8_UINT": "", - "R8G8_SNORM": "", - "R8G8_SINT": "", - "R16_TYPELESS": "", - "R16_FLOAT": "", - "D16_UNORM": "", - "R16_UNORM": "", - "R16_UINT": "", - "R16_SNORM": "", - "R16_SINT": "", - "R8_TYPELESS": "", - "R8_UNORM": "", - "R8_UINT": "", - "R8_SNORM": "", - "R8_SINT": "", - "A8_UNORM": "", - "R1_UNORM": "", - "R9G9B9E5_SHAREDEXP": "", - "R8G8_B8G8_UNORM": "", - "G8R8_G8B8_UNORM": "", - "BC1_TYPELESS": "", - "BC1_UNORM": "BC1_RGBA_UNORM_BLOCK", - "BC1_UNORM_SRGB": "BC1_RGBA_UNORM_SRGB_BLOCK", - "BC2_TYPELESS": "", - "BC2_UNORM": "BC2_RGBA_UNORM_BLOCK", - "BC2_UNORM_SRGB": "BC2_RGBA_UNORM_SRGB_BLOCK", - "BC3_TYPELESS": "", - "BC3_UNORM": "BC3_RGBA_UNORM_BLOCK", - "BC3_UNORM_SRGB": "BC3_RGBA_UNORM_SRGB_BLOCK", - "BC4_TYPELESS": "", - "BC4_UNORM": "", - "BC4_SNORM": "", - "BC5_TYPELESS": "", - "BC5_UNORM": "", - "BC5_SNORM": "", - "B5G6R5_UNORM": "", - "B5G5R5A1_UNORM": "", - "B8G8R8A8_UNORM": "", - "B8G8R8X8_UNORM": "", - "R10G10B10_XR_BIAS_A2_UNORM": "", - "B8G8R8A8_TYPELESS": "", - "B8G8R8A8_UNORM_SRGB": "", - "B8G8R8X8_TYPELESS": "", - "B8G8R8X8_UNORM_SRGB": "", - "BC6H_TYPELESS": "", - "BC6H_UF16": "", - "BC6H_SF16": "", - "BC7_TYPELESS": "", - "BC7_UNORM": "", - "BC7_UNORM_SRGB": "", - "AYUV": "", - "Y410": "", - "Y416": "", - "NV12": "", - "P010": "", - "P016": "", - "420_OPAQUE": "", - "YUY2": "", - "Y210": "", - "Y216": "", - "NV11": "", - "AI44": "", - "IA44": "", - "P8": "", - "A8P8": "", - "B4G4R4A4_UNORM": "" -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp deleted file mode 100644 index b0697bc5db..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp +++ /dev/null @@ -1,516 +0,0 @@ -// GENERATED FILE - DO NOT EDIT. -// Generated by gen_dxgi_format_table.py using data from dxgi_format_data.json. -// -// Copyright 2017 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. -// -// DXGI format info: -// Determining metadata about a DXGI format. - -#include "libANGLE/renderer/Format.h" - -using namespace angle; - -namespace rx -{ - -namespace d3d11 -{ - -GLenum GetComponentType(DXGI_FORMAT dxgiFormat) -{ - switch (dxgiFormat) - { - case DXGI_FORMAT_420_OPAQUE: - break; - case DXGI_FORMAT_A8P8: - break; - case DXGI_FORMAT_A8_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_AI44: - break; - case DXGI_FORMAT_AYUV: - break; - case DXGI_FORMAT_B4G4R4A4_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_B5G5R5A1_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_B5G6R5_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - break; - case DXGI_FORMAT_B8G8R8A8_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - break; - case DXGI_FORMAT_B8G8R8X8_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_BC1_TYPELESS: - break; - case DXGI_FORMAT_BC1_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_BC1_UNORM_SRGB: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_BC2_TYPELESS: - break; - case DXGI_FORMAT_BC2_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_BC2_UNORM_SRGB: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_BC3_TYPELESS: - break; - case DXGI_FORMAT_BC3_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_BC3_UNORM_SRGB: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_BC4_SNORM: - return GL_SIGNED_NORMALIZED; - case DXGI_FORMAT_BC4_TYPELESS: - break; - case DXGI_FORMAT_BC4_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_BC5_SNORM: - return GL_SIGNED_NORMALIZED; - case DXGI_FORMAT_BC5_TYPELESS: - break; - case DXGI_FORMAT_BC5_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_BC6H_SF16: - break; - case DXGI_FORMAT_BC6H_TYPELESS: - break; - case DXGI_FORMAT_BC6H_UF16: - break; - case DXGI_FORMAT_BC7_TYPELESS: - break; - case DXGI_FORMAT_BC7_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_BC7_UNORM_SRGB: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_D16_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_D24_UNORM_S8_UINT: - break; - case DXGI_FORMAT_D32_FLOAT: - return GL_FLOAT; - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - break; - case DXGI_FORMAT_G8R8_G8B8_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_IA44: - break; - case DXGI_FORMAT_NV11: - break; - case DXGI_FORMAT_NV12: - break; - case DXGI_FORMAT_P010: - break; - case DXGI_FORMAT_P016: - break; - case DXGI_FORMAT_P8: - break; - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - break; - case DXGI_FORMAT_R10G10B10A2_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_R10G10B10A2_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R11G11B10_FLOAT: - return GL_FLOAT; - case DXGI_FORMAT_R16G16B16A16_FLOAT: - return GL_FLOAT; - case DXGI_FORMAT_R16G16B16A16_SINT: - return GL_INT; - case DXGI_FORMAT_R16G16B16A16_SNORM: - return GL_SIGNED_NORMALIZED; - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - break; - case DXGI_FORMAT_R16G16B16A16_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_R16G16B16A16_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R16G16_FLOAT: - return GL_FLOAT; - case DXGI_FORMAT_R16G16_SINT: - return GL_INT; - case DXGI_FORMAT_R16G16_SNORM: - return GL_SIGNED_NORMALIZED; - case DXGI_FORMAT_R16G16_TYPELESS: - break; - case DXGI_FORMAT_R16G16_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_R16G16_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R16_FLOAT: - return GL_FLOAT; - case DXGI_FORMAT_R16_SINT: - return GL_INT; - case DXGI_FORMAT_R16_SNORM: - return GL_SIGNED_NORMALIZED; - case DXGI_FORMAT_R16_TYPELESS: - break; - case DXGI_FORMAT_R16_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_R16_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R1_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R24G8_TYPELESS: - break; - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R32G32B32A32_FLOAT: - return GL_FLOAT; - case DXGI_FORMAT_R32G32B32A32_SINT: - return GL_INT; - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - break; - case DXGI_FORMAT_R32G32B32A32_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_R32G32B32_FLOAT: - return GL_FLOAT; - case DXGI_FORMAT_R32G32B32_SINT: - return GL_INT; - case DXGI_FORMAT_R32G32B32_TYPELESS: - break; - case DXGI_FORMAT_R32G32B32_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_R32G32_FLOAT: - return GL_FLOAT; - case DXGI_FORMAT_R32G32_SINT: - return GL_INT; - case DXGI_FORMAT_R32G32_TYPELESS: - break; - case DXGI_FORMAT_R32G32_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_R32G8X24_TYPELESS: - break; - case DXGI_FORMAT_R32_FLOAT: - return GL_FLOAT; - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - return GL_FLOAT; - case DXGI_FORMAT_R32_SINT: - return GL_INT; - case DXGI_FORMAT_R32_TYPELESS: - break; - case DXGI_FORMAT_R32_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_R8G8B8A8_SINT: - return GL_INT; - case DXGI_FORMAT_R8G8B8A8_SNORM: - return GL_SIGNED_NORMALIZED; - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - break; - case DXGI_FORMAT_R8G8B8A8_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_R8G8B8A8_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R8G8_B8G8_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R8G8_SINT: - return GL_INT; - case DXGI_FORMAT_R8G8_SNORM: - return GL_SIGNED_NORMALIZED; - case DXGI_FORMAT_R8G8_TYPELESS: - break; - case DXGI_FORMAT_R8G8_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_R8G8_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R8_SINT: - return GL_INT; - case DXGI_FORMAT_R8_SNORM: - return GL_SIGNED_NORMALIZED; - case DXGI_FORMAT_R8_TYPELESS: - break; - case DXGI_FORMAT_R8_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_R8_UNORM: - return GL_UNSIGNED_NORMALIZED; - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - return GL_FLOAT; - case DXGI_FORMAT_UNKNOWN: - break; - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - return GL_UNSIGNED_INT; - case DXGI_FORMAT_Y210: - break; - case DXGI_FORMAT_Y216: - break; - case DXGI_FORMAT_Y410: - break; - case DXGI_FORMAT_Y416: - break; - case DXGI_FORMAT_YUY2: - break; - default: - break; - } - - UNREACHABLE(); - return GL_NONE; -} - -} // namespace d3d11 - -namespace d3d11_angle -{ - -const Format &GetFormat(DXGI_FORMAT dxgiFormat) -{ - switch (dxgiFormat) - { - case DXGI_FORMAT_420_OPAQUE: - break; - case DXGI_FORMAT_A8P8: - break; - case DXGI_FORMAT_A8_UNORM: - return Format::Get(Format::ID::A8_UNORM); - case DXGI_FORMAT_AI44: - break; - case DXGI_FORMAT_AYUV: - break; - case DXGI_FORMAT_B4G4R4A4_UNORM: - return Format::Get(Format::ID::B4G4R4A4_UNORM); - case DXGI_FORMAT_B5G5R5A1_UNORM: - return Format::Get(Format::ID::B5G5R5A1_UNORM); - case DXGI_FORMAT_B5G6R5_UNORM: - return Format::Get(Format::ID::B5G6R5_UNORM); - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - break; - case DXGI_FORMAT_B8G8R8A8_UNORM: - return Format::Get(Format::ID::B8G8R8A8_UNORM); - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - return Format::Get(Format::ID::B8G8R8A8_UNORM_SRGB); - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - break; - case DXGI_FORMAT_B8G8R8X8_UNORM: - return Format::Get(Format::ID::B8G8R8X8_UNORM); - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - break; - case DXGI_FORMAT_BC1_TYPELESS: - break; - case DXGI_FORMAT_BC1_UNORM: - return Format::Get(Format::ID::BC1_RGBA_UNORM_BLOCK); - case DXGI_FORMAT_BC1_UNORM_SRGB: - return Format::Get(Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK); - case DXGI_FORMAT_BC2_TYPELESS: - break; - case DXGI_FORMAT_BC2_UNORM: - return Format::Get(Format::ID::BC2_RGBA_UNORM_BLOCK); - case DXGI_FORMAT_BC2_UNORM_SRGB: - return Format::Get(Format::ID::BC2_RGBA_UNORM_SRGB_BLOCK); - case DXGI_FORMAT_BC3_TYPELESS: - break; - case DXGI_FORMAT_BC3_UNORM: - return Format::Get(Format::ID::BC3_RGBA_UNORM_BLOCK); - case DXGI_FORMAT_BC3_UNORM_SRGB: - return Format::Get(Format::ID::BC3_RGBA_UNORM_SRGB_BLOCK); - case DXGI_FORMAT_BC4_SNORM: - break; - case DXGI_FORMAT_BC4_TYPELESS: - break; - case DXGI_FORMAT_BC4_UNORM: - break; - case DXGI_FORMAT_BC5_SNORM: - break; - case DXGI_FORMAT_BC5_TYPELESS: - break; - case DXGI_FORMAT_BC5_UNORM: - break; - case DXGI_FORMAT_BC6H_SF16: - break; - case DXGI_FORMAT_BC6H_TYPELESS: - break; - case DXGI_FORMAT_BC6H_UF16: - break; - case DXGI_FORMAT_BC7_TYPELESS: - break; - case DXGI_FORMAT_BC7_UNORM: - break; - case DXGI_FORMAT_BC7_UNORM_SRGB: - break; - case DXGI_FORMAT_D16_UNORM: - return Format::Get(Format::ID::D16_UNORM); - case DXGI_FORMAT_D24_UNORM_S8_UINT: - return Format::Get(Format::ID::D24_UNORM_S8_UINT); - case DXGI_FORMAT_D32_FLOAT: - return Format::Get(Format::ID::D32_FLOAT); - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - return Format::Get(Format::ID::D32_FLOAT_S8X24_UINT); - case DXGI_FORMAT_G8R8_G8B8_UNORM: - break; - case DXGI_FORMAT_IA44: - break; - case DXGI_FORMAT_NV11: - break; - case DXGI_FORMAT_NV12: - break; - case DXGI_FORMAT_P010: - break; - case DXGI_FORMAT_P016: - break; - case DXGI_FORMAT_P8: - break; - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - break; - case DXGI_FORMAT_R10G10B10A2_UINT: - return Format::Get(Format::ID::R10G10B10A2_UINT); - case DXGI_FORMAT_R10G10B10A2_UNORM: - return Format::Get(Format::ID::R10G10B10A2_UNORM); - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - break; - case DXGI_FORMAT_R11G11B10_FLOAT: - return Format::Get(Format::ID::R11G11B10_FLOAT); - case DXGI_FORMAT_R16G16B16A16_FLOAT: - return Format::Get(Format::ID::R16G16B16A16_FLOAT); - case DXGI_FORMAT_R16G16B16A16_SINT: - return Format::Get(Format::ID::R16G16B16A16_SINT); - case DXGI_FORMAT_R16G16B16A16_SNORM: - return Format::Get(Format::ID::R16G16B16A16_SNORM); - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - break; - case DXGI_FORMAT_R16G16B16A16_UINT: - return Format::Get(Format::ID::R16G16B16A16_UINT); - case DXGI_FORMAT_R16G16B16A16_UNORM: - return Format::Get(Format::ID::R16G16B16A16_UNORM); - case DXGI_FORMAT_R16G16_FLOAT: - return Format::Get(Format::ID::R16G16_FLOAT); - case DXGI_FORMAT_R16G16_SINT: - return Format::Get(Format::ID::R16G16_SINT); - case DXGI_FORMAT_R16G16_SNORM: - return Format::Get(Format::ID::R16G16_SNORM); - case DXGI_FORMAT_R16G16_TYPELESS: - break; - case DXGI_FORMAT_R16G16_UINT: - return Format::Get(Format::ID::R16G16_UINT); - case DXGI_FORMAT_R16G16_UNORM: - return Format::Get(Format::ID::R16G16_UNORM); - case DXGI_FORMAT_R16_FLOAT: - return Format::Get(Format::ID::R16_FLOAT); - case DXGI_FORMAT_R16_SINT: - return Format::Get(Format::ID::R16_SINT); - case DXGI_FORMAT_R16_SNORM: - return Format::Get(Format::ID::R16_SNORM); - case DXGI_FORMAT_R16_TYPELESS: - break; - case DXGI_FORMAT_R16_UINT: - return Format::Get(Format::ID::R16_UINT); - case DXGI_FORMAT_R16_UNORM: - return Format::Get(Format::ID::R16_UNORM); - case DXGI_FORMAT_R1_UNORM: - break; - case DXGI_FORMAT_R24G8_TYPELESS: - break; - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - break; - case DXGI_FORMAT_R32G32B32A32_FLOAT: - return Format::Get(Format::ID::R32G32B32A32_FLOAT); - case DXGI_FORMAT_R32G32B32A32_SINT: - return Format::Get(Format::ID::R32G32B32A32_SINT); - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - break; - case DXGI_FORMAT_R32G32B32A32_UINT: - return Format::Get(Format::ID::R32G32B32A32_UINT); - case DXGI_FORMAT_R32G32B32_FLOAT: - return Format::Get(Format::ID::R32G32B32_FLOAT); - case DXGI_FORMAT_R32G32B32_SINT: - return Format::Get(Format::ID::R32G32B32_SINT); - case DXGI_FORMAT_R32G32B32_TYPELESS: - break; - case DXGI_FORMAT_R32G32B32_UINT: - return Format::Get(Format::ID::R32G32B32_UINT); - case DXGI_FORMAT_R32G32_FLOAT: - return Format::Get(Format::ID::R32G32_FLOAT); - case DXGI_FORMAT_R32G32_SINT: - return Format::Get(Format::ID::R32G32_SINT); - case DXGI_FORMAT_R32G32_TYPELESS: - break; - case DXGI_FORMAT_R32G32_UINT: - return Format::Get(Format::ID::R32G32_UINT); - case DXGI_FORMAT_R32G8X24_TYPELESS: - break; - case DXGI_FORMAT_R32_FLOAT: - return Format::Get(Format::ID::R32_FLOAT); - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - break; - case DXGI_FORMAT_R32_SINT: - return Format::Get(Format::ID::R32_SINT); - case DXGI_FORMAT_R32_TYPELESS: - break; - case DXGI_FORMAT_R32_UINT: - return Format::Get(Format::ID::R32_UINT); - case DXGI_FORMAT_R8G8B8A8_SINT: - return Format::Get(Format::ID::R8G8B8A8_SINT); - case DXGI_FORMAT_R8G8B8A8_SNORM: - return Format::Get(Format::ID::R8G8B8A8_SNORM); - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - break; - case DXGI_FORMAT_R8G8B8A8_UINT: - return Format::Get(Format::ID::R8G8B8A8_UINT); - case DXGI_FORMAT_R8G8B8A8_UNORM: - return Format::Get(Format::ID::R8G8B8A8_UNORM); - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - return Format::Get(Format::ID::R8G8B8A8_UNORM_SRGB); - case DXGI_FORMAT_R8G8_B8G8_UNORM: - break; - case DXGI_FORMAT_R8G8_SINT: - return Format::Get(Format::ID::R8G8_SINT); - case DXGI_FORMAT_R8G8_SNORM: - return Format::Get(Format::ID::R8G8_SNORM); - case DXGI_FORMAT_R8G8_TYPELESS: - break; - case DXGI_FORMAT_R8G8_UINT: - return Format::Get(Format::ID::R8G8_UINT); - case DXGI_FORMAT_R8G8_UNORM: - return Format::Get(Format::ID::R8G8_UNORM); - case DXGI_FORMAT_R8_SINT: - return Format::Get(Format::ID::R8_SINT); - case DXGI_FORMAT_R8_SNORM: - return Format::Get(Format::ID::R8_SNORM); - case DXGI_FORMAT_R8_TYPELESS: - break; - case DXGI_FORMAT_R8_UINT: - return Format::Get(Format::ID::R8_UINT); - case DXGI_FORMAT_R8_UNORM: - return Format::Get(Format::ID::R8_UNORM); - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - return Format::Get(Format::ID::R9G9B9E5_SHAREDEXP); - case DXGI_FORMAT_UNKNOWN: - return Format::Get(Format::ID::NONE); - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - break; - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - break; - case DXGI_FORMAT_Y210: - break; - case DXGI_FORMAT_Y216: - break; - case DXGI_FORMAT_Y410: - break; - case DXGI_FORMAT_Y416: - break; - case DXGI_FORMAT_YUY2: - break; - default: - break; - } - - UNREACHABLE(); - return Format::Get(Format::ID::NONE); -} - -} // namespace d3d11_angle - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json deleted file mode 100644 index 942745674f..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json +++ /dev/null @@ -1,1279 +0,0 @@ -[ - { - "DXGI_FORMAT_UNKNOWN": - { - "texture2D": "never", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32G32B32A32_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32G32B32A32_FLOAT": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "10_0check10_1always", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "always" - }, - "DXGI_FORMAT_R32G32B32A32_UINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32G32B32A32_SINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32G32B32_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32G32B32_FLOAT": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "11_0check", - "renderTarget": "check", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32G32B32_UINT": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "check", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32G32B32_SINT": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "check", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R16G16B16A16_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R16G16B16A16_FLOAT": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "9_3check_10_0always", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "always" - }, - "DXGI_FORMAT_R16G16B16A16_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "always" - }, - "DXGI_FORMAT_R16G16B16A16_UINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R16G16B16A16_SNORM": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "10_0", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R16G16B16A16_SINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32G32_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32G32_FLOAT": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "10_0check10_1always", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R32G32_UINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32G32_SINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32G8X24_TYPELESS": - { - "texture2D": "10_0", - "texture3D": "never", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_D32_FLOAT_S8X24_UINT": - { - "texture2D": "always", - "texture3D": "never", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "check", - "depthStencil": "10_0", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS": - { - "texture2D": "always", - "texture3D": "never", - "textureCube": "always", - "shaderSample": "10_0check10_1always", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_X32_TYPELESS_G8X24_UINT": - { - "texture2D": "always", - "texture3D": "never", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R10G10B10A2_TYPELESS": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R10G10B10A2_UNORM": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "10_0", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R10G10B10A2_UINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R11G11B10_FLOAT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "10_0", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R8G8B8A8_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R8G8B8A8_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "always" - }, - "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "always" - }, - "DXGI_FORMAT_R8G8B8A8_UINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R8G8B8A8_SNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R8G8B8A8_SINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R16G16_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R16G16_FLOAT": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "10_0", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "always" - }, - "DXGI_FORMAT_R16G16_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "always" - }, - "DXGI_FORMAT_R16G16_UINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R16G16_SNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R16G16_SINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32_TYPELESS": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_D32_FLOAT": - { - "texture2D": "always", - "texture3D": "never", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "check", - "depthStencil": "10_0", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32_FLOAT": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "10_0check10_1always", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "always" - }, - "DXGI_FORMAT_R32_UINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R32_SINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R24G8_TYPELESS": - { - "texture2D": "always", - "texture3D": "never", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_D24_UNORM_S8_UINT": - { - "texture2D": "always", - "texture3D": "never", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "check", - "depthStencil": "always" - }, - "DXGI_FORMAT_R24_UNORM_X8_TYPELESS": - { - "texture2D": "always", - "texture3D": "never", - "textureCube": "always", - "shaderSample": "10_0check10_1always", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_X24_TYPELESS_G8_UINT": - { - "texture2D": "always", - "texture3D": "never", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R8G8_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R8G8_UNORM": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "9_3check_10_0always", - "renderTarget": "9_3check_10_0always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R8G8_UINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R8G8_SNORM": - { - "texture2D": "always", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "always", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R8G8_SINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R16_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R16_FLOAT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "10_0", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_D16_UNORM": - { - "texture2D": "always", - "texture3D": "never", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "check", - "depthStencil": "always", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R16_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R16_UINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R16_SNORM": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "10_0", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R16_SINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R8_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R8_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "9_3check_10_0always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R8_UINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R8_SNORM": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "10_0", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R8_SINT": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "never", - "renderTarget": "10_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_A8_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "10_0", - "renderTarget": "always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "10_0" - }, - "DXGI_FORMAT_R1_UNORM": - { - "texture2D": "always", - "texture3D": "11_0", - "textureCube": "11_0", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R9G9B9E5_SHAREDEXP": - { - "texture2D": "10_0", - "texture3D": "10_0", - "textureCube": "10_0", - "shaderSample": "10_0", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R8G8_B8G8_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "10_0", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_G8R8_G8B8_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "10_0", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC1_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC1_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC1_UNORM_SRGB": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC2_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC2_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC2_UNORM_SRGB": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC3_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC3_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC3_UNORM_SRGB": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "always", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC4_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC4_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "10_0", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC4_SNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "10_0", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC5_TYPELESS": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC5_UNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "10_0", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC5_SNORM": - { - "texture2D": "always", - "texture3D": "always", - "textureCube": "always", - "shaderSample": "10_0", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_B5G6R5_UNORM": - { - "texture2D": "dxgi1_2", - "texture3D": "dxgi1_2", - "textureCube": "dxgi1_2", - "shaderSample": "dxgi1_2", - "renderTarget": "dxgi1_2", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "dxgi1_2" - }, - "DXGI_FORMAT_B5G5R5A1_UNORM": - { - "texture2D": "dxgi1_2", - "texture3D": "dxgi1_2", - "textureCube": "dxgi1_2", - "shaderSample": "dxgi1_2", - "renderTarget": "check", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "dxgi1_2" - }, - "DXGI_FORMAT_B8G8R8A8_UNORM": - { - "texture2D": "check", - "texture3D": "check", - "textureCube": "check", - "shaderSample": "9_3always_10_0check11_0always", - "renderTarget": "9_3always_10_0check11_0always", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "always" - }, - "DXGI_FORMAT_B8G8R8X8_UNORM": - { - "texture2D": "check", - "texture3D": "check", - "textureCube": "check", - "shaderSample": "10_0check11_0always", - "renderTarget": "11_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM": - { - "texture2D": "check", - "texture3D": "check", - "textureCube": "never", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_B8G8R8A8_TYPELESS": - { - "texture2D": "check", - "texture3D": "check", - "textureCube": "check", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB": - { - "texture2D": "check", - "texture3D": "check", - "textureCube": "check", - "shaderSample": "10_0check11_0always", - "renderTarget": "11_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_B8G8R8X8_TYPELESS": - { - "texture2D": "check", - "texture3D": "check", - "textureCube": "check", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_B8G8R8X8_UNORM_SRGB": - { - "texture2D": "check", - "texture3D": "check", - "textureCube": "check", - "shaderSample": "10_0check11_0always", - "renderTarget": "11_0", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC6H_TYPELESS": - { - "texture2D": "11_0", - "texture3D": "11_0", - "textureCube": "11_0", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC6H_UF16": - { - "texture2D": "11_0", - "texture3D": "11_0", - "textureCube": "11_0", - "shaderSample": "11_0", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC6H_SF16": - { - "texture2D": "11_0", - "texture3D": "11_0", - "textureCube": "11_0", - "shaderSample": "11_0", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC7_TYPELESS": - { - "texture2D": "11_0", - "texture3D": "11_0", - "textureCube": "11_0", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC7_UNORM": - { - "texture2D": "11_0", - "texture3D": "11_0", - "textureCube": "11_0", - "shaderSample": "11_0", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_BC7_UNORM_SRGB": - { - "texture2D": "11_0", - "texture3D": "11_0", - "textureCube": "11_0", - "shaderSample": "11_0", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_AYUV": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "11_1", - "renderTarget": "11_1", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_Y410": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "11_1", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_Y416": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "11_1", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_NV12": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "11_1", - "renderTarget": "11_1", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_P010": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "11_1", - "renderTarget": "11_1", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_P016": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "11_1", - "renderTarget": "11_1", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_420_OPAQUE": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_YUY2": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "11_1", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_Y210": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "11_1", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_Y216": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "11_1", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_NV11": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "11_1", - "renderTarget": "11_1", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_AI44": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_IA44": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_P8": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_A8P8": - { - "texture2D": "11_1", - "texture3D": "never", - "textureCube": "never", - "shaderSample": "never", - "renderTarget": "never", - "multisampleRT": "never", - "depthStencil": "never", - "mipAutoGen": "never" - }, - "DXGI_FORMAT_B4G4R4A4_UNORM": - { - "texture2D": "dxgi1_2", - "texture3D": "dxgi1_2", - "textureCube": "dxgi1_2", - "shaderSample": "dxgi1_2", - "renderTarget": "check", - "multisampleRT": "check", - "depthStencil": "never", - "mipAutoGen": "dxgi1_2" - } - } -] diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp deleted file mode 100644 index 4d7e46bdf2..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp +++ /dev/null @@ -1,3042 +0,0 @@ -// GENERATED FILE - DO NOT EDIT. See dxgi_support_data.json. -// -// Copyright 2015 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. -// -// dxgi_support_table: -// Queries for DXGI support of various texture formats. Depends on DXGI -// version, D3D feature level, and is sometimes guaranteed or optional. -// - -#include "libANGLE/renderer/d3d/d3d11/dxgi_support_table.h" - -#include "common/debug.h" - -namespace rx -{ - -namespace d3d11 -{ - -#define F_2D D3D11_FORMAT_SUPPORT_TEXTURE2D -#define F_3D D3D11_FORMAT_SUPPORT_TEXTURE3D -#define F_CUBE D3D11_FORMAT_SUPPORT_TEXTURECUBE -#define F_SAMPLE D3D11_FORMAT_SUPPORT_SHADER_SAMPLE -#define F_RT D3D11_FORMAT_SUPPORT_RENDER_TARGET -#define F_MS D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET -#define F_DS D3D11_FORMAT_SUPPORT_DEPTH_STENCIL -#define F_MIPGEN D3D11_FORMAT_SUPPORT_MIP_AUTOGEN - -namespace -{ - -const DXGISupport &GetDefaultSupport() -{ - static UINT AllSupportFlags = - D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURE3D | - D3D11_FORMAT_SUPPORT_TEXTURECUBE | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE | - D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET | - D3D11_FORMAT_SUPPORT_DEPTH_STENCIL | D3D11_FORMAT_SUPPORT_MIP_AUTOGEN; - static const DXGISupport defaultSupport(0, 0, AllSupportFlags); - return defaultSupport; -} - -const DXGISupport &GetDXGISupport_9_3(DXGI_FORMAT dxgiFormat) -{ - // clang-format off - switch (dxgiFormat) - { - case DXGI_FORMAT_420_OPAQUE: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_A8P8: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_A8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_AI44: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_AYUV: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_B4G4R4A4_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_B5G5R5A1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_B5G6R5_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE); - return info; - } - case DXGI_FORMAT_B8G8R8A8_UNORM: - { - static const DXGISupport info(F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - { - static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE); - return info; - } - case DXGI_FORMAT_B8G8R8X8_UNORM: - { - static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - { - static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_BC1_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC1_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC2_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC2_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC2_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC3_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC3_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC3_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC4_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC4_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC4_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC5_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC5_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC5_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC6H_SF16: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC6H_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC6H_UF16: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC7_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC7_UNORM: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC7_UNORM_SRGB: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_D16_UNORM: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D24_UNORM_S8_UINT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D32_FLOAT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_G8R8_G8B8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_IA44: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_NV11: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_NV12: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P010: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P016: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P8: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R10G10B10A2_UINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R10G10B10A2_UNORM: - { - static const DXGISupport info(0, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - { - static const DXGISupport info(0, F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D); - return info; - } - case DXGI_FORMAT_R11G11B10_FLOAT: - { - static const DXGISupport info(0, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS | F_SAMPLE); - return info; - } - case DXGI_FORMAT_R16G16B16A16_SINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_SNORM: - { - static const DXGISupport info(0, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16G16B16A16_UINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_SINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16G16_UINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_FLOAT: - { - static const DXGISupport info(0, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_SINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16_SNORM: - { - static const DXGISupport info(0, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16_UINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R1_UNORM: - { - static const DXGISupport info(F_2D, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R24G8_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R32G32B32A32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32A32_SINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32B32A32_UINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32B32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32B32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32B32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32G32_SINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32_UINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G8X24_TYPELESS: - { - static const DXGISupport info(0, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R32_SINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32_UINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_SINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_B8G8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R8G8_SINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_SNORM: - { - static const DXGISupport info(F_2D | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8G8_UINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_UNORM: - { - static const DXGISupport info(0, F_DS, F_MS | F_RT | F_SAMPLE); - return info; - } - case DXGI_FORMAT_R8_SINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8_SNORM: - { - static const DXGISupport info(0, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8_UINT: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_UNKNOWN: - { - static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_Y210: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y216: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y410: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y416: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_YUY2: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - - default: - UNREACHABLE(); - return GetDefaultSupport(); - } - // clang-format on -} - -const DXGISupport &GetDXGISupport_10_0(DXGI_FORMAT dxgiFormat) -{ - // clang-format off - switch (dxgiFormat) - { - case DXGI_FORMAT_420_OPAQUE: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_A8P8: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_A8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_AI44: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_AYUV: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_B4G4R4A4_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_B5G5R5A1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_B5G6R5_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE); - return info; - } - case DXGI_FORMAT_B8G8R8A8_UNORM: - { - static const DXGISupport info(F_MIPGEN, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_RT | F_SAMPLE); - return info; - } - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - { - static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE); - return info; - } - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE); - return info; - } - case DXGI_FORMAT_B8G8R8X8_UNORM: - { - static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE); - return info; - } - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - { - static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE); - return info; - } - case DXGI_FORMAT_BC1_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC1_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC2_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC2_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC2_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC3_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC3_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC3_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC4_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC4_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC4_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC5_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC5_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC5_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC6H_SF16: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC6H_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC6H_UF16: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC7_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC7_UNORM: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC7_UNORM_SRGB: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_D16_UNORM: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D24_UNORM_S8_UINT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D32_FLOAT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_G8R8_G8B8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_IA44: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_NV11: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_NV12: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P010: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P016: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P8: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R10G10B10A2_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R10G10B10A2_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - { - static const DXGISupport info(0, F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D); - return info; - } - case DXGI_FORMAT_R11G11B10_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16G16B16A16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16G16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R1_UNORM: - { - static const DXGISupport info(F_2D, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R24G8_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, F_SAMPLE); - return info; - } - case DXGI_FORMAT_R32G32B32A32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS | F_SAMPLE); - return info; - } - case DXGI_FORMAT_R32G32B32A32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32B32A32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32B32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32B32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32B32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS | F_SAMPLE); - return info; - } - case DXGI_FORMAT_R32G32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G8X24_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS | F_SAMPLE); - return info; - } - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, F_SAMPLE); - return info; - } - case DXGI_FORMAT_R32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_B8G8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R8G8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8G8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_UNKNOWN: - { - static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_Y210: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y216: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y410: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y416: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_YUY2: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - - default: - UNREACHABLE(); - return GetDefaultSupport(); - } - // clang-format on -} - -const DXGISupport &GetDXGISupport_10_1(DXGI_FORMAT dxgiFormat) -{ - // clang-format off - switch (dxgiFormat) - { - case DXGI_FORMAT_420_OPAQUE: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_A8P8: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_A8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_AI44: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_AYUV: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_B4G4R4A4_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_B5G5R5A1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_B5G6R5_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE); - return info; - } - case DXGI_FORMAT_B8G8R8A8_UNORM: - { - static const DXGISupport info(F_MIPGEN, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_RT | F_SAMPLE); - return info; - } - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - { - static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE); - return info; - } - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE); - return info; - } - case DXGI_FORMAT_B8G8R8X8_UNORM: - { - static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE); - return info; - } - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - { - static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE); - return info; - } - case DXGI_FORMAT_BC1_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC1_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC2_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC2_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC2_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC3_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC3_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC3_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC4_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC4_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC4_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC5_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC5_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC5_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC6H_SF16: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC6H_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC6H_UF16: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC7_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC7_UNORM: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC7_UNORM_SRGB: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_D16_UNORM: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D24_UNORM_S8_UINT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D32_FLOAT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_G8R8_G8B8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_IA44: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_NV11: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_NV12: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P010: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P016: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P8: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R10G10B10A2_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R10G10B10A2_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - { - static const DXGISupport info(0, F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D); - return info; - } - case DXGI_FORMAT_R11G11B10_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16G16B16A16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16G16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R1_UNORM: - { - static const DXGISupport info(F_2D, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R24G8_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R32G32B32A32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32A32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32B32A32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32B32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32B32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32B32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32G32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G8X24_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_B8G8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R8G8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8G8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_UNKNOWN: - { - static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_Y210: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y216: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y410: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y416: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_YUY2: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - - default: - UNREACHABLE(); - return GetDefaultSupport(); - } - // clang-format on -} - -const DXGISupport &GetDXGISupport_11_0(DXGI_FORMAT dxgiFormat) -{ - // clang-format off - switch (dxgiFormat) - { - case DXGI_FORMAT_420_OPAQUE: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_A8P8: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_A8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_AI44: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_AYUV: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_B4G4R4A4_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_B5G5R5A1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_B5G6R5_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE); - return info; - } - case DXGI_FORMAT_B8G8R8A8_UNORM: - { - static const DXGISupport info(F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - { - static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE); - return info; - } - case DXGI_FORMAT_B8G8R8X8_UNORM: - { - static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - { - static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_BC1_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC1_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC2_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC2_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC2_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC3_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC3_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC3_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC4_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC4_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC4_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC5_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC5_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC5_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC6H_SF16: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC6H_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC6H_UF16: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC7_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC7_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC7_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_D16_UNORM: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D24_UNORM_S8_UINT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D32_FLOAT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_G8R8_G8B8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_IA44: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_NV11: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_NV12: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P010: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P016: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P8: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R10G10B10A2_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R10G10B10A2_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - { - static const DXGISupport info(0, F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D); - return info; - } - case DXGI_FORMAT_R11G11B10_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16G16B16A16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16G16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R24G8_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R32G32B32A32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32A32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32B32A32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32B32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32B32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32B32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32G32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G8X24_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_B8G8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R8G8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8G8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_UNKNOWN: - { - static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_Y210: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y216: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y410: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y416: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_YUY2: - { - static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - - default: - UNREACHABLE(); - return GetDefaultSupport(); - } - // clang-format on -} - -const DXGISupport &GetDXGISupport_11_1(DXGI_FORMAT dxgiFormat) -{ - // clang-format off - switch (dxgiFormat) - { - case DXGI_FORMAT_420_OPAQUE: - { - static const DXGISupport info(F_2D, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_A8P8: - { - static const DXGISupport info(F_2D, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_A8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_AI44: - { - static const DXGISupport info(F_2D, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_AYUV: - { - static const DXGISupport info(F_2D | F_RT | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_B4G4R4A4_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_B5G5R5A1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_B5G6R5_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE); - return info; - } - case DXGI_FORMAT_B8G8R8A8_UNORM: - { - static const DXGISupport info(F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - { - static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - { - static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE); - return info; - } - case DXGI_FORMAT_B8G8R8X8_UNORM: - { - static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - { - static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS); - return info; - } - case DXGI_FORMAT_BC1_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC1_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC2_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC2_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC2_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC3_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC3_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC3_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC4_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC4_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC4_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC5_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC5_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC5_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC6H_SF16: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC6H_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC6H_UF16: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC7_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_BC7_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_BC7_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_D16_UNORM: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D24_UNORM_S8_UINT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D32_FLOAT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - { - static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_G8R8_G8B8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_IA44: - { - static const DXGISupport info(F_2D, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_NV11: - { - static const DXGISupport info(F_2D | F_RT | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_NV12: - { - static const DXGISupport info(F_2D | F_RT | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P010: - { - static const DXGISupport info(F_2D | F_RT | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P016: - { - static const DXGISupport info(F_2D | F_RT | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS); - return info; - } - case DXGI_FORMAT_P8: - { - static const DXGISupport info(F_2D, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R10G10B10A2_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R10G10B10A2_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - { - static const DXGISupport info(0, F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D); - return info; - } - case DXGI_FORMAT_R11G11B10_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16G16B16A16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16B16A16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16G16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16G16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R16_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R16_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R16_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R1_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R24G8_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R32G32B32A32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32A32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32B32A32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32B32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32B32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32B32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32B32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT); - return info; - } - case DXGI_FORMAT_R32G32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32G32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32G32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32G8X24_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32_FLOAT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - { - static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R32_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R32_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R32_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_B8G8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_R8G8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8G8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8G8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8_SINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8_SNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R8_TYPELESS: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_R8_UINT: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS); - return info; - } - case DXGI_FORMAT_R8_UNORM: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS); - return info; - } - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - { - static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_UNKNOWN: - { - static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - { - static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0); - return info; - } - case DXGI_FORMAT_Y210: - { - static const DXGISupport info(F_2D | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y216: - { - static const DXGISupport info(F_2D | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y410: - { - static const DXGISupport info(F_2D | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_Y416: - { - static const DXGISupport info(F_2D | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - case DXGI_FORMAT_YUY2: - { - static const DXGISupport info(F_2D | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0); - return info; - } - - default: - UNREACHABLE(); - return GetDefaultSupport(); - } - // clang-format on -} - -} - -#undef F_2D -#undef F_3D -#undef F_CUBE -#undef F_SAMPLE -#undef F_RT -#undef F_MS -#undef F_DS -#undef F_MIPGEN - -const DXGISupport &GetDXGISupport(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_9_3: - return GetDXGISupport_9_3(dxgiFormat); - case D3D_FEATURE_LEVEL_10_0: - return GetDXGISupport_10_0(dxgiFormat); - case D3D_FEATURE_LEVEL_10_1: - return GetDXGISupport_10_1(dxgiFormat); - case D3D_FEATURE_LEVEL_11_0: - return GetDXGISupport_11_0(dxgiFormat); - case D3D_FEATURE_LEVEL_11_1: - return GetDXGISupport_11_1(dxgiFormat); - default: - return GetDefaultSupport(); - } -} - -} // namespace d3d11 - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h deleted file mode 100644 index a818f376ef..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h +++ /dev/null @@ -1,49 +0,0 @@ -// -// Copyright 2015 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. -// -// dxgi_support_table: -// Queries for DXGI support of various texture formats. Depends on DXGI -// version, D3D feature level, and is sometimes guaranteed or optional. -// - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_DXGI_SUPPORT_TABLE_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_DXGI_SUPPORT_TABLE_H_ - -#include "common/platform.h" - -namespace rx -{ - -namespace d3d11 -{ - -struct DXGISupport -{ - DXGISupport() - : alwaysSupportedFlags(0), - neverSupportedFlags(0), - optionallySupportedFlags(0) - { - } - - DXGISupport(UINT alwaysSupportedIn, UINT neverSupportedIn, UINT optionallySupportedIn) - : alwaysSupportedFlags(alwaysSupportedIn), - neverSupportedFlags(neverSupportedIn), - optionallySupportedFlags(optionallySupportedIn) - { - } - - UINT alwaysSupportedFlags; - UINT neverSupportedFlags; - UINT optionallySupportedFlags; -}; - -const DXGISupport &GetDXGISupport(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel); - -} // namespace d3d11 - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_DXGI_SUPPORT_TABLE_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp deleted file mode 100644 index ce4edd26db..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp +++ /dev/null @@ -1,1023 +0,0 @@ -// -// Copyright (c) 2013-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. -// - -// formatutils11.cpp: Queries for GL image formats and their translations to D3D11 -// formats. - -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" - -#include "image_util/copyimage.h" -#include "image_util/generatemip.h" -#include "image_util/loadimage.h" - -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/d3d11/copyvertex.h" -#include "libANGLE/renderer/d3d/d3d11/dxgi_support_table.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" - -namespace rx -{ - -namespace d3d11 -{ - -bool SupportsMipGen(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel) -{ - const auto &support = GetDXGISupport(dxgiFormat, featureLevel); - ASSERT((support.optionallySupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) == 0); - return ((support.alwaysSupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) != 0); -} - -DXGIFormatSize::DXGIFormatSize(GLuint pixelBits, GLuint blockWidth, GLuint blockHeight) - : pixelBytes(pixelBits / 8), blockWidth(blockWidth), blockHeight(blockHeight) -{ -} - -const DXGIFormatSize &GetDXGIFormatSizeInfo(DXGI_FORMAT format) -{ - static const DXGIFormatSize sizeUnknown(0, 0, 0); - static const DXGIFormatSize size128(128, 1, 1); - static const DXGIFormatSize size96(96, 1, 1); - static const DXGIFormatSize size64(64, 1, 1); - static const DXGIFormatSize size32(32, 1, 1); - static const DXGIFormatSize size16(16, 1, 1); - static const DXGIFormatSize size8(8, 1, 1); - static const DXGIFormatSize sizeBC1(64, 4, 4); - static const DXGIFormatSize sizeBC2(128, 4, 4); - static const DXGIFormatSize sizeBC3(128, 4, 4); - static const DXGIFormatSize sizeBC4(64, 4, 4); - static const DXGIFormatSize sizeBC5(128, 4, 4); - static const DXGIFormatSize sizeBC6H(128, 4, 4); - static const DXGIFormatSize sizeBC7(128, 4, 4); - switch (format) - { - case DXGI_FORMAT_UNKNOWN: - return sizeUnknown; - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - case DXGI_FORMAT_R32G32B32A32_FLOAT: - case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - return size128; - case DXGI_FORMAT_R32G32B32_TYPELESS: - case DXGI_FORMAT_R32G32B32_FLOAT: - case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - return size96; - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - case DXGI_FORMAT_R16G16B16A16_FLOAT: - case DXGI_FORMAT_R16G16B16A16_UNORM: - case DXGI_FORMAT_R16G16B16A16_UINT: - case DXGI_FORMAT_R16G16B16A16_SNORM: - case DXGI_FORMAT_R16G16B16A16_SINT: - case DXGI_FORMAT_R32G32_TYPELESS: - case DXGI_FORMAT_R32G32_FLOAT: - case DXGI_FORMAT_R32G32_UINT: - case DXGI_FORMAT_R32G32_SINT: - case DXGI_FORMAT_R32G8X24_TYPELESS: - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - return size64; - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_R10G10B10A2_UINT: - case DXGI_FORMAT_R11G11B10_FLOAT: - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - case DXGI_FORMAT_R8G8B8A8_UINT: - case DXGI_FORMAT_R8G8B8A8_SNORM: - case DXGI_FORMAT_R8G8B8A8_SINT: - case DXGI_FORMAT_R16G16_TYPELESS: - case DXGI_FORMAT_R16G16_FLOAT: - case DXGI_FORMAT_R16G16_UNORM: - case DXGI_FORMAT_R16G16_UINT: - case DXGI_FORMAT_R16G16_SNORM: - case DXGI_FORMAT_R16G16_SINT: - case DXGI_FORMAT_R32_TYPELESS: - case DXGI_FORMAT_D32_FLOAT: - case DXGI_FORMAT_R32_FLOAT: - case DXGI_FORMAT_R32_UINT: - case DXGI_FORMAT_R32_SINT: - case DXGI_FORMAT_R24G8_TYPELESS: - case DXGI_FORMAT_D24_UNORM_S8_UINT: - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - return size32; - case DXGI_FORMAT_R8G8_TYPELESS: - case DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT_R8G8_UINT: - case DXGI_FORMAT_R8G8_SNORM: - case DXGI_FORMAT_R8G8_SINT: - case DXGI_FORMAT_R16_TYPELESS: - case DXGI_FORMAT_R16_FLOAT: - case DXGI_FORMAT_D16_UNORM: - case DXGI_FORMAT_R16_UNORM: - case DXGI_FORMAT_R16_UINT: - case DXGI_FORMAT_R16_SNORM: - case DXGI_FORMAT_R16_SINT: - return size16; - case DXGI_FORMAT_R8_TYPELESS: - case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_R8_UINT: - case DXGI_FORMAT_R8_SNORM: - case DXGI_FORMAT_R8_SINT: - case DXGI_FORMAT_A8_UNORM: - return size8; - case DXGI_FORMAT_R1_UNORM: - UNREACHABLE(); - return sizeUnknown; - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - case DXGI_FORMAT_R8G8_B8G8_UNORM: - case DXGI_FORMAT_G8R8_G8B8_UNORM: - return size32; - case DXGI_FORMAT_BC1_TYPELESS: - case DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT_BC1_UNORM_SRGB: - return sizeBC1; - case DXGI_FORMAT_BC2_TYPELESS: - case DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT_BC2_UNORM_SRGB: - return sizeBC2; - case DXGI_FORMAT_BC3_TYPELESS: - case DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT_BC3_UNORM_SRGB: - return sizeBC3; - case DXGI_FORMAT_BC4_TYPELESS: - case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: - return sizeBC4; - case DXGI_FORMAT_BC5_TYPELESS: - case DXGI_FORMAT_BC5_UNORM: - case DXGI_FORMAT_BC5_SNORM: - return sizeBC5; - case DXGI_FORMAT_B5G6R5_UNORM: - case DXGI_FORMAT_B5G5R5A1_UNORM: - return size16; - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8X8_UNORM: - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - return size32; - case DXGI_FORMAT_BC6H_TYPELESS: - case DXGI_FORMAT_BC6H_UF16: - case DXGI_FORMAT_BC6H_SF16: - return sizeBC6H; - case DXGI_FORMAT_BC7_TYPELESS: - case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - return sizeBC7; - case DXGI_FORMAT_AYUV: - case DXGI_FORMAT_Y410: - case DXGI_FORMAT_Y416: - case DXGI_FORMAT_NV12: - case DXGI_FORMAT_P010: - case DXGI_FORMAT_P016: - case DXGI_FORMAT_420_OPAQUE: - case DXGI_FORMAT_YUY2: - case DXGI_FORMAT_Y210: - case DXGI_FORMAT_Y216: - case DXGI_FORMAT_NV11: - case DXGI_FORMAT_AI44: - case DXGI_FORMAT_IA44: - case DXGI_FORMAT_P8: - case DXGI_FORMAT_A8P8: - UNREACHABLE(); - return sizeUnknown; - case DXGI_FORMAT_B4G4R4A4_UNORM: - return size16; - default: - UNREACHABLE(); - return sizeUnknown; - } -} - -constexpr VertexFormat::VertexFormat() - : conversionType(VERTEX_CONVERT_NONE), nativeFormat(DXGI_FORMAT_UNKNOWN), copyFunction(nullptr) -{ -} - -constexpr VertexFormat::VertexFormat(VertexConversionType conversionTypeIn, - DXGI_FORMAT nativeFormatIn, - VertexCopyFunction copyFunctionIn) - : conversionType(conversionTypeIn), nativeFormat(nativeFormatIn), copyFunction(copyFunctionIn) -{ -} - -const VertexFormat *GetVertexFormatInfo_FL_9_3(gl::VertexFormatType vertexFormatType) -{ - // D3D11 Feature Level 9_3 doesn't support as many formats for vertex buffer resource as Feature - // Level 10_0+. - // http://msdn.microsoft.com/en-us/library/windows/desktop/ff471324(v=vs.85).aspx - - switch (vertexFormatType) - { - // GL_BYTE -- unnormalized - case gl::VERTEX_FORMAT_SBYTE1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT, - &Copy8SintTo16SintVertexData<1, 2>); - return &info; - } - case gl::VERTEX_FORMAT_SBYTE2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT, - &Copy8SintTo16SintVertexData<2, 2>); - return &info; - } - case gl::VERTEX_FORMAT_SBYTE3: - { - static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT, - &Copy8SintTo16SintVertexData<3, 4>); - return &info; - } - case gl::VERTEX_FORMAT_SBYTE4: - { - static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT, - &Copy8SintTo16SintVertexData<4, 4>); - return &info; - } - - // GL_BYTE -- normalized - case gl::VERTEX_FORMAT_SBYTE1_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM, - &Copy8SnormTo16SnormVertexData<1, 2>); - return &info; - } - case gl::VERTEX_FORMAT_SBYTE2_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM, - &Copy8SnormTo16SnormVertexData<2, 2>); - return &info; - } - case gl::VERTEX_FORMAT_SBYTE3_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM, - &Copy8SnormTo16SnormVertexData<3, 4>); - return &info; - } - case gl::VERTEX_FORMAT_SBYTE4_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM, - &Copy8SnormTo16SnormVertexData<4, 4>); - return &info; - } - - // GL_UNSIGNED_BYTE -- un-normalized - // NOTE: 3 and 4 component unnormalized GL_UNSIGNED_BYTE should use the default format - // table. - case gl::VERTEX_FORMAT_UBYTE1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT, - &CopyNativeVertexData<GLubyte, 1, 4, 1>); - return &info; - } - case gl::VERTEX_FORMAT_UBYTE2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT, - &CopyNativeVertexData<GLubyte, 2, 4, 1>); - return &info; - } - - // GL_UNSIGNED_BYTE -- normalized - // NOTE: 3 and 4 component normalized GL_UNSIGNED_BYTE should use the default format table. - - // GL_UNSIGNED_BYTE -- normalized - case gl::VERTEX_FORMAT_UBYTE1_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM, - &CopyNativeVertexData<GLubyte, 1, 4, UINT8_MAX>); - return &info; - } - case gl::VERTEX_FORMAT_UBYTE2_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM, - &CopyNativeVertexData<GLubyte, 2, 4, UINT8_MAX>); - return &info; - } - - // GL_SHORT -- un-normalized - // NOTE: 2, 3 and 4 component unnormalized GL_SHORT should use the default format table. - case gl::VERTEX_FORMAT_SSHORT1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT, - &CopyNativeVertexData<GLshort, 1, 2, 0>); - return &info; - } - - // GL_SHORT -- normalized - // NOTE: 2, 3 and 4 component normalized GL_SHORT should use the default format table. - case gl::VERTEX_FORMAT_SSHORT1_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM, - &CopyNativeVertexData<GLshort, 1, 2, 0>); - return &info; - } - - // GL_UNSIGNED_SHORT -- un-normalized - case gl::VERTEX_FORMAT_USHORT1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, - &CopyTo32FVertexData<GLushort, 1, 2, false>); - return &info; - } - case gl::VERTEX_FORMAT_USHORT2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, - &CopyTo32FVertexData<GLushort, 2, 2, false>); - return &info; - } - case gl::VERTEX_FORMAT_USHORT3: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, - &CopyTo32FVertexData<GLushort, 3, 3, false>); - return &info; - } - case gl::VERTEX_FORMAT_USHORT4: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, - &CopyTo32FVertexData<GLushort, 4, 4, false>); - return &info; - } - - // GL_UNSIGNED_SHORT -- normalized - case gl::VERTEX_FORMAT_USHORT1_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, - &CopyTo32FVertexData<GLushort, 1, 2, true>); - return &info; - } - case gl::VERTEX_FORMAT_USHORT2_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, - &CopyTo32FVertexData<GLushort, 2, 2, true>); - return &info; - } - case gl::VERTEX_FORMAT_USHORT3_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, - &CopyTo32FVertexData<GLushort, 3, 3, true>); - return &info; - } - case gl::VERTEX_FORMAT_USHORT4_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, - &CopyTo32FVertexData<GLushort, 4, 4, true>); - return &info; - } - - // GL_FIXED - // TODO: Add test to verify that this works correctly. - // NOTE: 2, 3 and 4 component GL_FIXED should use the default format table. - case gl::VERTEX_FORMAT_FIXED1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, - &Copy32FixedTo32FVertexData<1, 2>); - return &info; - } - - // GL_FLOAT - // TODO: Add test to verify that this works correctly. - // NOTE: 2, 3 and 4 component GL_FLOAT should use the default format table. - case gl::VERTEX_FORMAT_FLOAT1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, - &CopyNativeVertexData<GLfloat, 1, 2, 0>); - return &info; - } - - default: - return nullptr; - } -} - -const VertexFormat &GetVertexFormatInfo(gl::VertexFormatType vertexFormatType, D3D_FEATURE_LEVEL featureLevel) -{ - if (featureLevel == D3D_FEATURE_LEVEL_9_3) - { - const VertexFormat *result = GetVertexFormatInfo_FL_9_3(vertexFormatType); - if (result) - { - return *result; - } - } - - switch (vertexFormatType) - { - // - // Float formats - // - - // GL_BYTE -- un-normalized - case gl::VERTEX_FORMAT_SBYTE1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_SINT, - &CopyNativeVertexData<GLbyte, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_SBYTE2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_SINT, - &CopyNativeVertexData<GLbyte, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_SBYTE3: - { - static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_SINT, - &CopyNativeVertexData<GLbyte, 3, 4, 1>); - return info; - } - case gl::VERTEX_FORMAT_SBYTE4: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_SINT, - &CopyNativeVertexData<GLbyte, 4, 4, 0>); - return info; - } - - // GL_BYTE -- normalized - case gl::VERTEX_FORMAT_SBYTE1_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SNORM, - &CopyNativeVertexData<GLbyte, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_SBYTE2_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SNORM, - &CopyNativeVertexData<GLbyte, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_SBYTE3_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SNORM, - &CopyNativeVertexData<GLbyte, 3, 4, INT8_MAX>); - return info; - } - case gl::VERTEX_FORMAT_SBYTE4_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SNORM, - &CopyNativeVertexData<GLbyte, 4, 4, 0>); - return info; - } - - // GL_UNSIGNED_BYTE -- un-normalized - case gl::VERTEX_FORMAT_UBYTE1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_UINT, - &CopyNativeVertexData<GLubyte, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_UBYTE2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_UINT, - &CopyNativeVertexData<GLubyte, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_UBYTE3: - { - static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT, - &CopyNativeVertexData<GLubyte, 3, 4, 1>); - return info; - } - case gl::VERTEX_FORMAT_UBYTE4: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_UINT, - &CopyNativeVertexData<GLubyte, 4, 4, 0>); - return info; - } - - // GL_UNSIGNED_BYTE -- normalized - case gl::VERTEX_FORMAT_UBYTE1_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UNORM, - &CopyNativeVertexData<GLubyte, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_UBYTE2_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UNORM, - &CopyNativeVertexData<GLubyte, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_UBYTE3_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM, - &CopyNativeVertexData<GLubyte, 3, 4, UINT8_MAX>); - return info; - } - case gl::VERTEX_FORMAT_UBYTE4_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UNORM, - &CopyNativeVertexData<GLubyte, 4, 4, 0>); - return info; - } - - // GL_SHORT -- un-normalized - case gl::VERTEX_FORMAT_SSHORT1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_SINT, - &CopyNativeVertexData<GLshort, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_SSHORT2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_SINT, - &CopyNativeVertexData<GLshort, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_SSHORT3: - { - static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT, - &CopyNativeVertexData<GLshort, 3, 4, 1>); - return info; - } - case gl::VERTEX_FORMAT_SSHORT4: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_SINT, - &CopyNativeVertexData<GLshort, 4, 4, 0>); - return info; - } - - // GL_SHORT -- normalized - case gl::VERTEX_FORMAT_SSHORT1_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SNORM, - &CopyNativeVertexData<GLshort, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_SSHORT2_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SNORM, - &CopyNativeVertexData<GLshort, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_SSHORT3_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM, - &CopyNativeVertexData<GLshort, 3, 4, INT16_MAX>); - return info; - } - case gl::VERTEX_FORMAT_SSHORT4_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SNORM, - &CopyNativeVertexData<GLshort, 4, 4, 0>); - return info; - } - - // GL_UNSIGNED_SHORT -- un-normalized - case gl::VERTEX_FORMAT_USHORT1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_UINT, - &CopyNativeVertexData<GLushort, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_USHORT2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_UINT, - &CopyNativeVertexData<GLushort, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_USHORT3: - { - static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_UINT, - &CopyNativeVertexData<GLushort, 3, 4, 1>); - return info; - } - case gl::VERTEX_FORMAT_USHORT4: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_UINT, - &CopyNativeVertexData<GLushort, 4, 4, 0>); - return info; - } - - // GL_UNSIGNED_SHORT -- normalized - case gl::VERTEX_FORMAT_USHORT1_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UNORM, - &CopyNativeVertexData<GLushort, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_USHORT2_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UNORM, - &CopyNativeVertexData<GLushort, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_USHORT3_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UNORM, - &CopyNativeVertexData<GLushort, 3, 4, UINT16_MAX>); - return info; - } - case gl::VERTEX_FORMAT_USHORT4_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UNORM, - &CopyNativeVertexData<GLushort, 4, 4, 0>); - return info; - } - - // GL_INT -- un-normalized - case gl::VERTEX_FORMAT_SINT1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_SINT, - &CopyNativeVertexData<GLint, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_SINT2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_SINT, - &CopyNativeVertexData<GLint, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_SINT3: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_SINT, - &CopyNativeVertexData<GLint, 3, 3, 0>); - return info; - } - case gl::VERTEX_FORMAT_SINT4: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_SINT, - &CopyNativeVertexData<GLint, 4, 4, 0>); - return info; - } - - // GL_INT -- normalized - case gl::VERTEX_FORMAT_SINT1_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT, - &CopyTo32FVertexData<GLint, 1, 1, true>); - return info; - } - case gl::VERTEX_FORMAT_SINT2_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, - &CopyTo32FVertexData<GLint, 2, 2, true>); - return info; - } - case gl::VERTEX_FORMAT_SINT3_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, - &CopyTo32FVertexData<GLint, 3, 3, true>); - return info; - } - case gl::VERTEX_FORMAT_SINT4_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, - &CopyTo32FVertexData<GLint, 4, 4, true>); - return info; - } - - // GL_UNSIGNED_INT -- un-normalized - case gl::VERTEX_FORMAT_UINT1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_UINT, - &CopyNativeVertexData<GLuint, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_UINT2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_UINT, - &CopyNativeVertexData<GLuint, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_UINT3: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_UINT, - &CopyNativeVertexData<GLuint, 3, 3, 0>); - return info; - } - case gl::VERTEX_FORMAT_UINT4: - { - static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_UINT, - &CopyNativeVertexData<GLuint, 4, 4, 0>); - return info; - } - - // GL_UNSIGNED_INT -- normalized - case gl::VERTEX_FORMAT_UINT1_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT, - &CopyTo32FVertexData<GLuint, 1, 1, true>); - return info; - } - case gl::VERTEX_FORMAT_UINT2_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, - &CopyTo32FVertexData<GLuint, 2, 2, true>); - return info; - } - case gl::VERTEX_FORMAT_UINT3_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, - &CopyTo32FVertexData<GLuint, 3, 3, true>); - return info; - } - case gl::VERTEX_FORMAT_UINT4_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, - &CopyTo32FVertexData<GLuint, 4, 4, true>); - return info; - } - - // GL_FIXED - case gl::VERTEX_FORMAT_FIXED1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT, - &Copy32FixedTo32FVertexData<1, 1>); - return info; - } - case gl::VERTEX_FORMAT_FIXED2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, - &Copy32FixedTo32FVertexData<2, 2>); - return info; - } - case gl::VERTEX_FORMAT_FIXED3: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, - &Copy32FixedTo32FVertexData<3, 3>); - return info; - } - case gl::VERTEX_FORMAT_FIXED4: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, - &Copy32FixedTo32FVertexData<4, 4>); - return info; - } - - // GL_HALF_FLOAT - case gl::VERTEX_FORMAT_HALF1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_FLOAT, - &CopyNativeVertexData<GLhalf, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_HALF2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_FLOAT, - &CopyNativeVertexData<GLhalf, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_HALF3: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_FLOAT, - &CopyNativeVertexData<GLhalf, 3, 4, gl::Float16One>); - return info; - } - case gl::VERTEX_FORMAT_HALF4: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_FLOAT, - &CopyNativeVertexData<GLhalf, 4, 4, 0>); - return info; - } - - // GL_FLOAT - case gl::VERTEX_FORMAT_FLOAT1: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT, - &CopyNativeVertexData<GLfloat, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_FLOAT2: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT, - &CopyNativeVertexData<GLfloat, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_FLOAT3: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_FLOAT, - &CopyNativeVertexData<GLfloat, 3, 3, 0>); - return info; - } - case gl::VERTEX_FORMAT_FLOAT4: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT, - &CopyNativeVertexData<GLfloat, 4, 4, 0>); - return info; - } - - // GL_INT_2_10_10_10_REV - case gl::VERTEX_FORMAT_SINT210: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, - &CopyXYZ10W2ToXYZW32FVertexData<true, false, true>); - return info; - } - case gl::VERTEX_FORMAT_SINT210_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, - &CopyXYZ10W2ToXYZW32FVertexData<true, true, true>); - return info; - } - - // GL_UNSIGNED_INT_2_10_10_10_REV - case gl::VERTEX_FORMAT_UINT210: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, - &CopyXYZ10W2ToXYZW32FVertexData<false, false, true>); - return info; - } - case gl::VERTEX_FORMAT_UINT210_NORM: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UNORM, - &CopyNativeVertexData<GLuint, 1, 1, 0>); - return info; - } - - // - // Integer Formats - // - - // GL_BYTE - case gl::VERTEX_FORMAT_SBYTE1_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SINT, - &CopyNativeVertexData<GLbyte, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_SBYTE2_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SINT, - &CopyNativeVertexData<GLbyte, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_SBYTE3_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SINT, - &CopyNativeVertexData<GLbyte, 3, 4, 1>); - return info; - } - case gl::VERTEX_FORMAT_SBYTE4_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SINT, - &CopyNativeVertexData<GLbyte, 4, 4, 0>); - return info; - } - - // GL_UNSIGNED_BYTE - case gl::VERTEX_FORMAT_UBYTE1_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UINT, - &CopyNativeVertexData<GLubyte, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_UBYTE2_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UINT, - &CopyNativeVertexData<GLubyte, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_UBYTE3_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UINT, - &CopyNativeVertexData<GLubyte, 3, 4, 1>); - return info; - } - case gl::VERTEX_FORMAT_UBYTE4_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UINT, - &CopyNativeVertexData<GLubyte, 4, 4, 0>); - return info; - } - - // GL_SHORT - case gl::VERTEX_FORMAT_SSHORT1_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SINT, - &CopyNativeVertexData<GLshort, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_SSHORT2_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SINT, - &CopyNativeVertexData<GLshort, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_SSHORT3_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT, - &CopyNativeVertexData<GLshort, 3, 4, 1>); - return info; - } - case gl::VERTEX_FORMAT_SSHORT4_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SINT, - &CopyNativeVertexData<GLshort, 4, 4, 0>); - return info; - } - - // GL_UNSIGNED_SHORT - case gl::VERTEX_FORMAT_USHORT1_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UINT, - &CopyNativeVertexData<GLushort, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_USHORT2_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UINT, - &CopyNativeVertexData<GLushort, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_USHORT3_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UINT, - &CopyNativeVertexData<GLushort, 3, 4, 1>); - return info; - } - case gl::VERTEX_FORMAT_USHORT4_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UINT, - &CopyNativeVertexData<GLushort, 4, 4, 0>); - return info; - } - - // GL_INT - case gl::VERTEX_FORMAT_SINT1_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT, - &CopyNativeVertexData<GLint, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_SINT2_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT, - &CopyNativeVertexData<GLint, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_SINT3_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT, - &CopyNativeVertexData<GLint, 3, 3, 0>); - return info; - } - case gl::VERTEX_FORMAT_SINT4_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT, - &CopyNativeVertexData<GLint, 4, 4, 0>); - return info; - } - - // GL_UNSIGNED_INT - case gl::VERTEX_FORMAT_UINT1_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT, - &CopyNativeVertexData<GLuint, 1, 1, 0>); - return info; - } - case gl::VERTEX_FORMAT_UINT2_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT, - &CopyNativeVertexData<GLuint, 2, 2, 0>); - return info; - } - case gl::VERTEX_FORMAT_UINT3_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT, - &CopyNativeVertexData<GLuint, 3, 3, 0>); - return info; - } - case gl::VERTEX_FORMAT_UINT4_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT, - &CopyNativeVertexData<GLuint, 4, 4, 0>); - return info; - } - - // GL_INT_2_10_10_10_REV - case gl::VERTEX_FORMAT_SINT210_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT, - &CopyXYZ10W2ToXYZW32FVertexData<true, true, false>); - return info; - } - - // GL_UNSIGNED_INT_2_10_10_10_REV - case gl::VERTEX_FORMAT_UINT210_INT: - { - static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UINT, - &CopyNativeVertexData<GLuint, 1, 1, 0>); - return info; - } - - default: - { - static constexpr VertexFormat info; - return info; - } - } -} - -} // namespace d3d11 - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.h deleted file mode 100644 index 883d338377..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.h +++ /dev/null @@ -1,71 +0,0 @@ -// -// Copyright (c) 2013-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. -// - -// formatutils11.h: Queries for GL image formats and their translations to D3D11 -// formats. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_FORMATUTILS11_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_FORMATUTILS11_H_ - -#include <map> - -#include "common/platform.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/renderer_utils.h" -#include "libANGLE/renderer/d3d/formatutilsD3D.h" - -namespace rx -{ -struct Renderer11DeviceCaps; - -namespace d3d11 -{ - -// A texture might be stored as DXGI_FORMAT_R16_TYPELESS but store integer components, -// which are accessed through an DXGI_FORMAT_R16_SINT view. It's easy to write code which queries -// information about the wrong format. Therefore, use of this should be avoided where possible. - -bool SupportsMipGen(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel); - -struct DXGIFormatSize -{ - DXGIFormatSize(GLuint pixelBits, GLuint blockWidth, GLuint blockHeight); - - GLuint pixelBytes; - GLuint blockWidth; - GLuint blockHeight; -}; -const DXGIFormatSize &GetDXGIFormatSizeInfo(DXGI_FORMAT format); - -struct VertexFormat : private angle::NonCopyable -{ - constexpr VertexFormat(); - constexpr VertexFormat(VertexConversionType conversionType, - DXGI_FORMAT nativeFormat, - VertexCopyFunction copyFunction); - - VertexConversionType conversionType; - DXGI_FORMAT nativeFormat; - VertexCopyFunction copyFunction; -}; - -const VertexFormat &GetVertexFormatInfo(gl::VertexFormatType vertexFormatType, - D3D_FEATURE_LEVEL featureLevel); - -// Auto-generated in dxgi_format_map_autogen.cpp. -GLenum GetComponentType(DXGI_FORMAT dxgiFormat); - -} // namespace d3d11 - -namespace d3d11_angle -{ -const angle::Format &GetFormat(DXGI_FORMAT dxgiFormat); -} - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_FORMATUTILS11_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp deleted file mode 100644 index d059b36120..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp +++ /dev/null @@ -1,2421 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// renderer11_utils.cpp: Conversion functions and other utility routines -// specific to the D3D11 renderer. - -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -#include <algorithm> - -#include "common/debug.h" -#include "libANGLE/Buffer.h" -#include "libANGLE/Context.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/Program.h" -#include "libANGLE/State.h" -#include "libANGLE/VertexArray.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/BufferD3D.h" -#include "libANGLE/renderer/d3d/FramebufferD3D.h" -#include "libANGLE/renderer/d3d/IndexBuffer.h" -#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" -#include "libANGLE/renderer/d3d/d3d11/dxgi_support_table.h" -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" -#include "libANGLE/renderer/driver_utils.h" -#include "platform/Platform.h" -#include "platform/WorkaroundsD3D.h" - -namespace rx -{ - -namespace d3d11_gl -{ -namespace -{ -// Standard D3D sample positions from -// https://msdn.microsoft.com/en-us/library/windows/desktop/ff476218.aspx -using SamplePositionsArray = std::array<float, 32>; -static constexpr std::array<SamplePositionsArray, 5> kSamplePositions = { - {{{0.5f, 0.5f}}, - {{0.75f, 0.75f, 0.25f, 0.25f}}, - {{0.375f, 0.125f, 0.875f, 0.375f, 0.125f, 0.625f, 0.625f, 0.875f}}, - {{0.5625f, 0.3125f, 0.4375f, 0.6875f, 0.8125f, 0.5625f, 0.3125f, 0.1875f, 0.1875f, 0.8125f, - 0.0625f, 0.4375f, 0.6875f, 0.9375f, 0.9375f, 0.0625f}}, - {{0.5625f, 0.5625f, 0.4375f, 0.3125f, 0.3125f, 0.625f, 0.75f, 0.4375f, - 0.1875f, 0.375f, 0.625f, 0.8125f, 0.8125f, 0.6875f, 0.6875f, 0.1875f, - 0.375f, 0.875f, 0.5f, 0.0625f, 0.25f, 0.125f, 0.125f, 0.75f, - 0.0f, 0.5f, 0.9375f, 0.25f, 0.875f, 0.9375f, 0.0625f, 0.0f}}}}; - -// Helper functor for querying DXGI support. Saves passing the parameters repeatedly. -class DXGISupportHelper : angle::NonCopyable -{ - public: - DXGISupportHelper(ID3D11Device *device, D3D_FEATURE_LEVEL featureLevel) - : mDevice(device), mFeatureLevel(featureLevel) - { - } - - bool query(DXGI_FORMAT dxgiFormat, UINT supportMask) - { - if (dxgiFormat == DXGI_FORMAT_UNKNOWN) - return false; - - auto dxgiSupport = d3d11::GetDXGISupport(dxgiFormat, mFeatureLevel); - - UINT supportedBits = dxgiSupport.alwaysSupportedFlags; - - if ((dxgiSupport.optionallySupportedFlags & supportMask) != 0) - { - UINT formatSupport; - if (SUCCEEDED(mDevice->CheckFormatSupport(dxgiFormat, &formatSupport))) - { - supportedBits |= (formatSupport & supportMask); - } - else - { - // TODO(jmadill): find out why we fail this call sometimes in FL9_3 - // ERR() << "Error checking format support for format 0x" << std::hex << dxgiFormat; - } - } - - return ((supportedBits & supportMask) == supportMask); - } - - private: - ID3D11Device *mDevice; - D3D_FEATURE_LEVEL mFeatureLevel; -}; - -gl::TextureCaps GenerateTextureFormatCaps(gl::Version maxClientVersion, - GLenum internalFormat, - ID3D11Device *device, - const Renderer11DeviceCaps &renderer11DeviceCaps) -{ - gl::TextureCaps textureCaps; - - DXGISupportHelper support(device, renderer11DeviceCaps.featureLevel); - const d3d11::Format &formatInfo = d3d11::Format::Get(internalFormat, renderer11DeviceCaps); - - const gl::InternalFormat &internalFormatInfo = gl::GetSizedInternalFormatInfo(internalFormat); - - UINT texSupportMask = D3D11_FORMAT_SUPPORT_TEXTURE2D; - if (internalFormatInfo.depthBits == 0 && internalFormatInfo.stencilBits == 0) - { - texSupportMask |= D3D11_FORMAT_SUPPORT_TEXTURECUBE; - if (maxClientVersion.major > 2) - { - texSupportMask |= D3D11_FORMAT_SUPPORT_TEXTURE3D; - } - } - - textureCaps.texturable = support.query(formatInfo.texFormat, texSupportMask); - textureCaps.filterable = - support.query(formatInfo.srvFormat, D3D11_FORMAT_SUPPORT_SHADER_SAMPLE); - textureCaps.renderable = - (support.query(formatInfo.rtvFormat, D3D11_FORMAT_SUPPORT_RENDER_TARGET)) || - (support.query(formatInfo.dsvFormat, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL)); - - DXGI_FORMAT renderFormat = DXGI_FORMAT_UNKNOWN; - if (formatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN) - { - renderFormat = formatInfo.dsvFormat; - } - else if (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN) - { - renderFormat = formatInfo.rtvFormat; - } - if (renderFormat != DXGI_FORMAT_UNKNOWN && - support.query(renderFormat, D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET)) - { - // Assume 1x - textureCaps.sampleCounts.insert(1); - - for (unsigned int sampleCount = 2; sampleCount <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; - sampleCount *= 2) - { - UINT qualityCount = 0; - if (SUCCEEDED(device->CheckMultisampleQualityLevels(renderFormat, sampleCount, - &qualityCount))) - { - // Assume we always support lower sample counts - if (qualityCount == 0) - { - break; - } - textureCaps.sampleCounts.insert(sampleCount); - } - } - } - - return textureCaps; -} - -bool GetNPOTTextureSupport(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return true; - - // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876.aspx - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return false; - - default: - UNREACHABLE(); - return false; - } -} - -float GetMaximumAnisotropy(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_MAX_MAXANISOTROPY; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_MAX_MAXANISOTROPY; - - // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876.aspx - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - return 16; - - case D3D_FEATURE_LEVEL_9_1: - return D3D_FL9_1_DEFAULT_MAX_ANISOTROPY; - - default: - UNREACHABLE(); - return 0; - } -} - -bool GetOcclusionQuerySupport(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return true; - - // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476150.aspx - // ID3D11Device::CreateQuery - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - return true; - case D3D_FEATURE_LEVEL_9_1: - return false; - - default: - UNREACHABLE(); - return false; - } -} - -bool GetEventQuerySupport(D3D_FEATURE_LEVEL featureLevel) -{ - // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476150.aspx - // ID3D11Device::CreateQuery - - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return true; - - default: - UNREACHABLE(); - return false; - } -} - -bool GetInstancingSupport(D3D_FEATURE_LEVEL featureLevel) -{ - // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476150.aspx - // ID3D11Device::CreateInputLayout - - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return true; - - // Feature Level 9_3 supports instancing, but slot 0 in the input layout must not be - // instanced. - // D3D9 has a similar restriction, where stream 0 must not be instanced. - // This restriction can be worked around by remapping any non-instanced slot to slot - // 0. - // This works because HLSL uses shader semantics to match the vertex inputs to the - // elements in the input layout, rather than the slots. - // Note that we only support instancing via ANGLE_instanced_array on 9_3, since 9_3 - // doesn't support OpenGL ES 3.0 - case D3D_FEATURE_LEVEL_9_3: - return true; - - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return false; - - default: - UNREACHABLE(); - return false; - } -} - -bool GetFramebufferMultisampleSupport(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return true; - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return false; - - default: - UNREACHABLE(); - return false; - } -} - -bool GetFramebufferBlitSupport(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return true; - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return false; - - default: - UNREACHABLE(); - return false; - } -} - -bool GetDerivativeInstructionSupport(D3D_FEATURE_LEVEL featureLevel) -{ - // http://msdn.microsoft.com/en-us/library/windows/desktop/bb509588.aspx states that - // shader model - // ps_2_x is required for the ddx (and other derivative functions). - - // http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876.aspx states that - // feature level - // 9.3 supports shader model ps_2_x. - - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - case D3D_FEATURE_LEVEL_9_3: - return true; - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return false; - - default: - UNREACHABLE(); - return false; - } -} - -bool GetShaderTextureLODSupport(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return true; - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return false; - - default: - UNREACHABLE(); - return false; - } -} - -size_t GetMaximumSimultaneousRenderTargets(D3D_FEATURE_LEVEL featureLevel) -{ - // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476150.aspx - // ID3D11Device::CreateInputLayout - - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT; - - case D3D_FEATURE_LEVEL_9_3: - return D3D_FL9_3_SIMULTANEOUS_RENDER_TARGET_COUNT; - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return D3D_FL9_1_SIMULTANEOUS_RENDER_TARGET_COUNT; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximum2DTextureSize(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; - - case D3D_FEATURE_LEVEL_9_3: - return D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION; - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumCubeMapTextureSize(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_REQ_TEXTURECUBE_DIMENSION; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_REQ_TEXTURECUBE_DIMENSION; - - case D3D_FEATURE_LEVEL_9_3: - return D3D_FL9_3_REQ_TEXTURECUBE_DIMENSION; - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximum2DTextureArraySize(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION; - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 0; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximum3DTextureSize(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION; - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumViewportSize(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_VIEWPORT_BOUNDS_MAX; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_VIEWPORT_BOUNDS_MAX; - - // No constants for D3D11 Feature Level 9 viewport size limits, use the maximum - // texture sizes - case D3D_FEATURE_LEVEL_9_3: - return D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION; - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumDrawIndexedIndexCount(D3D_FEATURE_LEVEL featureLevel) -{ - // D3D11 allows up to 2^32 elements, but we report max signed int for convenience since - // that's what's - // returned from glGetInteger - static_assert(D3D11_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP == 32, - "Unexpected D3D11 constant value."); - static_assert(D3D10_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP == 32, - "Unexpected D3D11 constant value."); - - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return std::numeric_limits<GLint>::max(); - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - return D3D_FL9_2_IA_PRIMITIVE_MAX_COUNT; - case D3D_FEATURE_LEVEL_9_1: - return D3D_FL9_1_IA_PRIMITIVE_MAX_COUNT; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumDrawVertexCount(D3D_FEATURE_LEVEL featureLevel) -{ - // D3D11 allows up to 2^32 elements, but we report max signed int for convenience since - // that's what's - // returned from glGetInteger - static_assert(D3D11_REQ_DRAW_VERTEX_COUNT_2_TO_EXP == 32, "Unexpected D3D11 constant value."); - static_assert(D3D10_REQ_DRAW_VERTEX_COUNT_2_TO_EXP == 32, "Unexpected D3D11 constant value."); - - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return std::numeric_limits<GLint>::max(); - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - return D3D_FL9_2_IA_PRIMITIVE_MAX_COUNT; - case D3D_FEATURE_LEVEL_9_1: - return D3D_FL9_1_IA_PRIMITIVE_MAX_COUNT; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumVertexInputSlots(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_STANDARD_VERTEX_ELEMENT_COUNT; - - case D3D_FEATURE_LEVEL_10_1: - return D3D10_1_STANDARD_VERTEX_ELEMENT_COUNT; - case D3D_FEATURE_LEVEL_10_0: - return D3D10_STANDARD_VERTEX_ELEMENT_COUNT; - - // From http://http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876.aspx - // "Max Input Slots" - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 16; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumVertexUniformVectors(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT; - - // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx - // ID3D11DeviceContext::VSSetConstantBuffers - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 255 - d3d11_gl::GetReservedVertexUniformVectors(featureLevel); - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumVertexUniformBlocks(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - - d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - - d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT; - - // Uniform blocks not supported on D3D11 Feature Level 9 - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 0; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetReservedVertexOutputVectors(D3D_FEATURE_LEVEL featureLevel) -{ - // According to The OpenGL ES Shading Language specifications - // (Language Version 1.00 section 10.16, Language Version 3.10 section 12.21) - // built-in special variables (e.g. gl_FragCoord, or gl_PointCoord) - // which are statically used in the shader should be included in the variable packing - // algorithm. - // Therefore, we should not reserve output vectors for them. - - switch (featureLevel) - { - // We must reserve one output vector for dx_Position. - // We also reserve one for gl_Position, which we unconditionally output on Feature - // Levels 10_0+, - // even if it's unused in the shader (e.g. for transform feedback). TODO: This could - // be improved. - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return 2; - - // Just reserve dx_Position on Feature Level 9, since we don't ever need to output - // gl_Position. - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 1; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumVertexOutputVectors(D3D_FEATURE_LEVEL featureLevel) -{ - static_assert(gl::IMPLEMENTATION_MAX_VARYING_VECTORS == D3D11_VS_OUTPUT_REGISTER_COUNT, - "Unexpected D3D11 constant value."); - - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_VS_OUTPUT_REGISTER_COUNT - GetReservedVertexOutputVectors(featureLevel); - - case D3D_FEATURE_LEVEL_10_1: - return D3D10_1_VS_OUTPUT_REGISTER_COUNT - GetReservedVertexOutputVectors(featureLevel); - case D3D_FEATURE_LEVEL_10_0: - return D3D10_VS_OUTPUT_REGISTER_COUNT - GetReservedVertexOutputVectors(featureLevel); - - // Use Shader Model 2.X limits - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 8 - GetReservedVertexOutputVectors(featureLevel); - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumVertexTextureUnits(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT; - - // Vertex textures not supported on D3D11 Feature Level 9 according to - // http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx - // ID3D11DeviceContext::VSSetSamplers and ID3D11DeviceContext::VSSetShaderResources - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 0; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumPixelUniformVectors(D3D_FEATURE_LEVEL featureLevel) -{ - // TODO(geofflang): Remove hard-coded limit once the gl-uniform-arrays test can pass - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return 1024; // D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return 1024; // D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT; - - // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx - // ID3D11DeviceContext::PSSetConstantBuffers - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 32 - d3d11_gl::GetReservedFragmentUniformVectors(featureLevel); - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumPixelUniformBlocks(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - - d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - - d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT; - - // Uniform blocks not supported on D3D11 Feature Level 9 - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 0; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumPixelInputVectors(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_PS_INPUT_REGISTER_COUNT - GetReservedVertexOutputVectors(featureLevel); - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_PS_INPUT_REGISTER_COUNT - GetReservedVertexOutputVectors(featureLevel); - - // Use Shader Model 2.X limits - case D3D_FEATURE_LEVEL_9_3: - return 8 - GetReservedVertexOutputVectors(featureLevel); - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 8 - GetReservedVertexOutputVectors(featureLevel); - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumPixelTextureUnits(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT; - - // http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx - // ID3D11DeviceContext::PSSetShaderResources - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 16; - - default: - UNREACHABLE(); - return 0; - } -} - -std::array<GLuint, 3> GetMaxComputeWorkGroupCount(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return {{D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION, - D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION, - D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION}}; - break; - default: - return {{0, 0, 0}}; - } -} - -std::array<GLuint, 3> GetMaxComputeWorkGroupSize(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return {{D3D11_CS_THREAD_GROUP_MAX_X, D3D11_CS_THREAD_GROUP_MAX_Y, - D3D11_CS_THREAD_GROUP_MAX_Z}}; - break; - default: - return {{0, 0, 0}}; - } -} - -size_t GetMaxComputeWorkGroupInvocations(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP; - default: - return 0; - } -} - -size_t GetMaximumComputeUniformVectors(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT; - default: - return 0; - } -} - -size_t GetMaximumComputeUniformBlocks(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - - d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT; - default: - return 0; - } -} - -size_t GetMaximumComputeTextureUnits(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT; - default: - return 0; - } -} - -size_t GetMaximumImageUnits(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - // TODO(xinghua.cao@intel.com): Get a more accurate limit. For now using - // the minimum requirement for GLES 3.1. - return 4; - default: - return 0; - } -} - -size_t GetMaximumComputeImageUniforms(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - // TODO(xinghua.cao@intel.com): Get a more accurate limit. For now using - // the minimum requirement for GLES 3.1. - return 4; - default: - return 0; - } -} - -int GetMinimumTexelOffset(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_COMMONSHADER_TEXEL_OFFSET_MAX_NEGATIVE; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_COMMONSHADER_TEXEL_OFFSET_MAX_NEGATIVE; - - // Sampling functions with offsets are not available below shader model 4.0. - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 0; - - default: - UNREACHABLE(); - return 0; - } -} - -int GetMaximumTexelOffset(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_COMMONSHADER_TEXEL_OFFSET_MAX_POSITIVE; - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D11_COMMONSHADER_TEXEL_OFFSET_MAX_POSITIVE; - - // Sampling functions with offsets are not available below shader model 4.0. - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 0; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumConstantBufferSize(D3D_FEATURE_LEVEL featureLevel) -{ - // Returns a size_t despite the limit being a GLuint64 because size_t is the maximum - // size of - // any buffer that could be allocated. - - const size_t bytesPerComponent = 4 * sizeof(float); - - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * bytesPerComponent; - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * bytesPerComponent; - - // Limits from http://msdn.microsoft.com/en-us/library/windows/desktop/ff476501.aspx - // remarks section - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 4096 * bytesPerComponent; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumStreamOutputBuffers(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_SO_BUFFER_SLOT_COUNT; - - case D3D_FEATURE_LEVEL_10_1: - return D3D10_1_SO_BUFFER_SLOT_COUNT; - case D3D_FEATURE_LEVEL_10_0: - return D3D10_SO_BUFFER_SLOT_COUNT; - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 0; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumStreamOutputInterleavedComponents(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return GetMaximumVertexOutputVectors(featureLevel) * 4; - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 0; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumStreamOutputSeparateComponents(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return GetMaximumStreamOutputInterleavedComponents(featureLevel) / - GetMaximumStreamOutputBuffers(featureLevel); - - // D3D 10 and 10.1 only allow one output per output slot if an output slot other - // than zero is used. - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return 4; - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 0; - - default: - UNREACHABLE(); - return 0; - } -} - -size_t GetMaximumRenderToBufferWindowSize(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_REQ_RENDER_TO_BUFFER_WINDOW_WIDTH; - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return D3D10_REQ_RENDER_TO_BUFFER_WINDOW_WIDTH; - - // REQ_RENDER_TO_BUFFER_WINDOW_WIDTH not supported on D3D11 Feature Level 9, - // use the maximum texture sizes - case D3D_FEATURE_LEVEL_9_3: - return D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION; - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION; - - default: - UNREACHABLE(); - return 0; - } -} - -IntelDriverVersion GetIntelDriverVersion(const Optional<LARGE_INTEGER> driverVersion) -{ - if (!driverVersion.valid()) - return IntelDriverVersion(0); - - // According to http://www.intel.com/content/www/us/en/support/graphics-drivers/000005654.html, - // only the fourth part is necessary since it stands for the driver specific unique version - // number. - WORD part = LOWORD(driverVersion.value().LowPart); - return IntelDriverVersion(part); -} - -} // anonymous namespace - -unsigned int GetReservedVertexUniformVectors(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return 0; - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 3; // dx_ViewAdjust, dx_ViewCoords and dx_ViewScale - - default: - UNREACHABLE(); - return 0; - } -} - -unsigned int GetReservedFragmentUniformVectors(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return 0; - - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 3; - - default: - UNREACHABLE(); - return 0; - } -} - -gl::Version GetMaximumClientVersion(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return gl::Version(3, 1); - case D3D_FEATURE_LEVEL_10_1: - return gl::Version(3, 0); - - case D3D_FEATURE_LEVEL_10_0: - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return gl::Version(2, 0); - - default: - UNREACHABLE(); - return gl::Version(0, 0); - } -} - -unsigned int GetMaxViewportAndScissorRectanglesPerPipeline(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 1; - default: - UNREACHABLE(); - return 0; - } -} - -bool IsMultiviewSupported(D3D_FEATURE_LEVEL featureLevel) -{ - // The ANGLE_multiview extension can always be supported in D3D11 through geometry shaders. - switch (featureLevel) - { - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - return true; - default: - return false; - } -} - -unsigned int GetMaxSampleMaskWords(D3D_FEATURE_LEVEL featureLevel) -{ - switch (featureLevel) - { - // D3D10+ only allows 1 sample mask. - case D3D_FEATURE_LEVEL_11_1: - case D3D_FEATURE_LEVEL_11_0: - case D3D_FEATURE_LEVEL_10_1: - case D3D_FEATURE_LEVEL_10_0: - return 1u; - case D3D_FEATURE_LEVEL_9_3: - case D3D_FEATURE_LEVEL_9_2: - case D3D_FEATURE_LEVEL_9_1: - return 0u; - default: - UNREACHABLE(); - return 0u; - } -} - -void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, const Renderer11DeviceCaps &renderer11DeviceCaps, gl::Caps *caps, - gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions, gl::Limitations *limitations) -{ - D3D_FEATURE_LEVEL featureLevel = renderer11DeviceCaps.featureLevel; - const gl::FormatSet &allFormats = gl::GetAllSizedInternalFormats(); - for (GLenum internalFormat : allFormats) - { - gl::TextureCaps textureCaps = GenerateTextureFormatCaps( - GetMaximumClientVersion(featureLevel), internalFormat, device, renderer11DeviceCaps); - textureCapsMap->insert(internalFormat, textureCaps); - - if (gl::GetSizedInternalFormatInfo(internalFormat).compressed) - { - caps->compressedTextureFormats.push_back(internalFormat); - } - } - - // GL core feature limits - // Reserve MAX_UINT for D3D11's primitive restart. - caps->maxElementIndex = static_cast<GLint64>(std::numeric_limits<unsigned int>::max() - 1); - caps->max3DTextureSize = static_cast<GLuint>(GetMaximum3DTextureSize(featureLevel)); - caps->max2DTextureSize = static_cast<GLuint>(GetMaximum2DTextureSize(featureLevel)); - caps->maxCubeMapTextureSize = static_cast<GLuint>(GetMaximumCubeMapTextureSize(featureLevel)); - caps->maxArrayTextureLayers = static_cast<GLuint>(GetMaximum2DTextureArraySize(featureLevel)); - - // Unimplemented, set to minimum required - caps->maxLODBias = 2.0f; - - // No specific limits on render target size, maximum 2D texture size is equivalent - caps->maxRenderbufferSize = caps->max2DTextureSize; - - // Maximum draw buffers and color attachments are the same, max color attachments could eventually be - // increased to 16 - caps->maxDrawBuffers = static_cast<GLuint>(GetMaximumSimultaneousRenderTargets(featureLevel)); - caps->maxColorAttachments = - static_cast<GLuint>(GetMaximumSimultaneousRenderTargets(featureLevel)); - - // D3D11 has the same limit for viewport width and height - caps->maxViewportWidth = static_cast<GLuint>(GetMaximumViewportSize(featureLevel)); - caps->maxViewportHeight = caps->maxViewportWidth; - - // Choose a reasonable maximum, enforced in the shader. - caps->minAliasedPointSize = 1.0f; - caps->maxAliasedPointSize = 1024.0f; - - // Wide lines not supported - caps->minAliasedLineWidth = 1.0f; - caps->maxAliasedLineWidth = 1.0f; - - // Primitive count limits - caps->maxElementsIndices = static_cast<GLuint>(GetMaximumDrawIndexedIndexCount(featureLevel)); - caps->maxElementsVertices = static_cast<GLuint>(GetMaximumDrawVertexCount(featureLevel)); - - // Program and shader binary formats (no supported shader binary formats) - caps->programBinaryFormats.push_back(GL_PROGRAM_BINARY_ANGLE); - - caps->vertexHighpFloat.setIEEEFloat(); - caps->vertexMediumpFloat.setIEEEFloat(); - caps->vertexLowpFloat.setIEEEFloat(); - caps->fragmentHighpFloat.setIEEEFloat(); - caps->fragmentMediumpFloat.setIEEEFloat(); - caps->fragmentLowpFloat.setIEEEFloat(); - - // 32-bit integers are natively supported - caps->vertexHighpInt.setTwosComplementInt(32); - caps->vertexMediumpInt.setTwosComplementInt(32); - caps->vertexLowpInt.setTwosComplementInt(32); - caps->fragmentHighpInt.setTwosComplementInt(32); - caps->fragmentMediumpInt.setTwosComplementInt(32); - caps->fragmentLowpInt.setTwosComplementInt(32); - - // We do not wait for server fence objects internally, so report a max timeout of zero. - caps->maxServerWaitTimeout = 0; - - // Vertex shader limits - caps->maxVertexAttributes = static_cast<GLuint>(GetMaximumVertexInputSlots(featureLevel)); - caps->maxVertexUniformComponents = - static_cast<GLuint>(GetMaximumVertexUniformVectors(featureLevel)) * 4; - caps->maxVertexUniformVectors = - static_cast<GLuint>(GetMaximumVertexUniformVectors(featureLevel)); - caps->maxVertexUniformBlocks = static_cast<GLuint>(GetMaximumVertexUniformBlocks(featureLevel)); - caps->maxVertexOutputComponents = - static_cast<GLuint>(GetMaximumVertexOutputVectors(featureLevel)) * 4; - caps->maxVertexTextureImageUnits = - static_cast<GLuint>(GetMaximumVertexTextureUnits(featureLevel)); - - // Vertex Attribute Bindings are emulated on D3D11. - caps->maxVertexAttribBindings = caps->maxVertexAttributes; - // Experimental testing confirmed there is no explicit limit on maximum buffer offset in D3D11. - caps->maxVertexAttribRelativeOffset = std::numeric_limits<GLint>::max(); - // Experimental testing confirmed 2048 is the maximum stride that D3D11 can support on all - // platforms. - caps->maxVertexAttribStride = 2048; - - // Fragment shader limits - caps->maxFragmentUniformComponents = - static_cast<GLuint>(GetMaximumPixelUniformVectors(featureLevel)) * 4; - caps->maxFragmentUniformVectors = - static_cast<GLuint>(GetMaximumPixelUniformVectors(featureLevel)); - caps->maxFragmentUniformBlocks = - static_cast<GLuint>(GetMaximumPixelUniformBlocks(featureLevel)); - caps->maxFragmentInputComponents = - static_cast<GLuint>(GetMaximumPixelInputVectors(featureLevel)) * 4; - caps->maxTextureImageUnits = static_cast<GLuint>(GetMaximumPixelTextureUnits(featureLevel)); - caps->minProgramTexelOffset = GetMinimumTexelOffset(featureLevel); - caps->maxProgramTexelOffset = GetMaximumTexelOffset(featureLevel); - - // Compute shader limits - caps->maxComputeWorkGroupCount = GetMaxComputeWorkGroupCount(featureLevel); - caps->maxComputeWorkGroupSize = GetMaxComputeWorkGroupSize(featureLevel); - caps->maxComputeWorkGroupInvocations = - static_cast<GLuint>(GetMaxComputeWorkGroupInvocations(featureLevel)); - caps->maxComputeUniformComponents = - static_cast<GLuint>(GetMaximumComputeUniformVectors(featureLevel)) * 4; - caps->maxComputeUniformBlocks = - static_cast<GLuint>(GetMaximumComputeUniformBlocks(featureLevel)); - caps->maxComputeTextureImageUnits = - static_cast<GLuint>(GetMaximumComputeTextureUnits(featureLevel)); - caps->maxImageUnits = static_cast<GLuint>(GetMaximumImageUnits(featureLevel)); - caps->maxComputeImageUniforms = - static_cast<GLuint>(GetMaximumComputeImageUniforms(featureLevel)); - - // Aggregate shader limits - caps->maxUniformBufferBindings = caps->maxVertexUniformBlocks + caps->maxFragmentUniformBlocks; - caps->maxUniformBlockSize = GetMaximumConstantBufferSize(featureLevel); - - // TODO(oetuaho): Get a more accurate limit. For now using the minimum requirement for GLES 3.1. - caps->maxUniformLocations = 1024; - - // With DirectX 11.1, constant buffer offset and size must be a multiple of 16 constants of 16 bytes each. - // https://msdn.microsoft.com/en-us/library/windows/desktop/hh404649%28v=vs.85%29.aspx - // With DirectX 11.0, we emulate UBO offsets using copies of ranges of the UBO however - // we still keep the same alignment as 11.1 for consistency. - caps->uniformBufferOffsetAlignment = 256; - - caps->maxCombinedUniformBlocks = caps->maxVertexUniformBlocks + caps->maxFragmentUniformBlocks; - caps->maxCombinedVertexUniformComponents = (static_cast<GLint64>(caps->maxVertexUniformBlocks) * static_cast<GLint64>(caps->maxUniformBlockSize / 4)) + - static_cast<GLint64>(caps->maxVertexUniformComponents); - caps->maxCombinedFragmentUniformComponents = (static_cast<GLint64>(caps->maxFragmentUniformBlocks) * static_cast<GLint64>(caps->maxUniformBlockSize / 4)) + - static_cast<GLint64>(caps->maxFragmentUniformComponents); - caps->maxCombinedComputeUniformComponents = - static_cast<GLuint>(caps->maxComputeUniformBlocks * (caps->maxUniformBlockSize / 4) + - caps->maxComputeUniformComponents); - caps->maxVaryingComponents = - static_cast<GLuint>(GetMaximumVertexOutputVectors(featureLevel)) * 4; - caps->maxVaryingVectors = static_cast<GLuint>(GetMaximumVertexOutputVectors(featureLevel)); - caps->maxCombinedTextureImageUnits = caps->maxVertexTextureImageUnits + caps->maxTextureImageUnits; - - // Transform feedback limits - caps->maxTransformFeedbackInterleavedComponents = - static_cast<GLuint>(GetMaximumStreamOutputInterleavedComponents(featureLevel)); - caps->maxTransformFeedbackSeparateAttributes = - static_cast<GLuint>(GetMaximumStreamOutputBuffers(featureLevel)); - caps->maxTransformFeedbackSeparateComponents = - static_cast<GLuint>(GetMaximumStreamOutputSeparateComponents(featureLevel)); - - // Defer the computation of multisample limits to Context::updateCaps() where max*Samples values - // are determined according to available sample counts for each individual format. - caps->maxSamples = std::numeric_limits<GLint>::max(); - caps->maxColorTextureSamples = std::numeric_limits<GLint>::max(); - caps->maxDepthTextureSamples = std::numeric_limits<GLint>::max(); - caps->maxIntegerSamples = std::numeric_limits<GLint>::max(); - - // Sample mask words limits - caps->maxSampleMaskWords = GetMaxSampleMaskWords(featureLevel); - - // Framebuffer limits - caps->maxFramebufferSamples = std::numeric_limits<GLint>::max(); - caps->maxFramebufferWidth = - static_cast<GLuint>(GetMaximumRenderToBufferWindowSize(featureLevel)); - caps->maxFramebufferHeight = caps->maxFramebufferWidth; - - // GL extension support - extensions->setTextureExtensionSupport(*textureCapsMap); - extensions->elementIndexUint = true; - extensions->getProgramBinary = true; - extensions->rgb8rgba8 = true; - extensions->readFormatBGRA = true; - extensions->pixelBufferObject = true; - extensions->mapBuffer = true; - extensions->mapBufferRange = true; - extensions->textureNPOT = GetNPOTTextureSupport(featureLevel); - extensions->drawBuffers = GetMaximumSimultaneousRenderTargets(featureLevel) > 1; - extensions->textureStorage = true; - extensions->textureFilterAnisotropic = true; - extensions->maxTextureAnisotropy = GetMaximumAnisotropy(featureLevel); - extensions->occlusionQueryBoolean = GetOcclusionQuerySupport(featureLevel); - extensions->fence = GetEventQuerySupport(featureLevel); - extensions->disjointTimerQuery = true; - extensions->queryCounterBitsTimeElapsed = 64; - extensions->queryCounterBitsTimestamp = - 0; // Timestamps cannot be supported due to D3D11 limitations - extensions->robustness = true; - // Direct3D guarantees to return zero for any resource that is accessed out of bounds. - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ff476332(v=vs.85).aspx - // and https://msdn.microsoft.com/en-us/library/windows/desktop/ff476900(v=vs.85).aspx - extensions->robustBufferAccessBehavior = true; - extensions->blendMinMax = true; - extensions->framebufferBlit = GetFramebufferBlitSupport(featureLevel); - extensions->framebufferMultisample = GetFramebufferMultisampleSupport(featureLevel); - extensions->instancedArrays = GetInstancingSupport(featureLevel); - extensions->packReverseRowOrder = true; - extensions->standardDerivatives = GetDerivativeInstructionSupport(featureLevel); - extensions->shaderTextureLOD = GetShaderTextureLODSupport(featureLevel); - extensions->fragDepth = true; - extensions->multiview = IsMultiviewSupported(featureLevel); - if (extensions->multiview) - { - extensions->maxViews = - std::min(static_cast<GLuint>(gl::IMPLEMENTATION_ANGLE_MULTIVIEW_MAX_VIEWS), - std::min(static_cast<GLuint>(GetMaximum2DTextureArraySize(featureLevel)), - GetMaxViewportAndScissorRectanglesPerPipeline(featureLevel))); - } - extensions->textureUsage = true; // This could be false since it has no effect in D3D11 - extensions->discardFramebuffer = true; - extensions->translatedShaderSource = true; - extensions->fboRenderMipmap = false; - extensions->debugMarker = true; - extensions->eglImage = true; - extensions->eglImageExternal = true; - extensions->eglImageExternalEssl3 = true; - extensions->eglStreamConsumerExternal = true; - extensions->unpackSubimage = true; - extensions->packSubimage = true; - extensions->lossyETCDecode = true; - extensions->syncQuery = GetEventQuerySupport(featureLevel); - extensions->copyTexture = true; - extensions->copyCompressedTexture = true; - - // D3D11 Feature Level 10_0+ uses SV_IsFrontFace in HLSL to emulate gl_FrontFacing. - // D3D11 Feature Level 9_3 doesn't support SV_IsFrontFace, and has no equivalent, so can't support gl_FrontFacing. - limitations->noFrontFacingSupport = (renderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3); - - // D3D11 Feature Level 9_3 doesn't support alpha-to-coverage - limitations->noSampleAlphaToCoverageSupport = (renderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3); - - // D3D11 Feature Levels 9_3 and below do not support non-constant loop indexing and require - // additional - // pre-validation of the shader at compile time to produce a better error message. - limitations->shadersRequireIndexedLoopValidation = - (renderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3); - - // D3D11 has no concept of separate masks and refs for front and back faces in the depth stencil - // state. - limitations->noSeparateStencilRefsAndMasks = true; - - // D3D11 cannot support constant color and alpha blend funcs together - limitations->noSimultaneousConstantColorAndAlphaBlendFunc = true; - -#ifdef ANGLE_ENABLE_WINDOWS_STORE - // Setting a non-zero divisor on attribute zero doesn't work on certain Windows Phone 8-era devices. - // We should prevent developers from doing this on ALL Windows Store devices. This will maintain consistency across all Windows devices. - // We allow non-zero divisors on attribute zero if the Client Version >= 3, since devices affected by this issue don't support ES3+. - limitations->attributeZeroRequiresZeroDivisorInEXT = true; -#endif -} - -void GetSamplePosition(GLsizei sampleCount, size_t index, GLfloat *xy) -{ - size_t indexKey = static_cast<size_t>(ceil(log(sampleCount))); - ASSERT(indexKey < kSamplePositions.size() && - (2 * index + 1) < kSamplePositions[indexKey].size()); - - xy[0] = kSamplePositions[indexKey][2 * index]; - xy[1] = kSamplePositions[indexKey][2 * index + 1]; -} - -} // namespace d3d11_gl - -namespace gl_d3d11 -{ - -D3D11_BLEND ConvertBlendFunc(GLenum glBlend, bool isAlpha) -{ - D3D11_BLEND d3dBlend = D3D11_BLEND_ZERO; - - switch (glBlend) - { - case GL_ZERO: - d3dBlend = D3D11_BLEND_ZERO; - break; - case GL_ONE: - d3dBlend = D3D11_BLEND_ONE; - break; - case GL_SRC_COLOR: - d3dBlend = (isAlpha ? D3D11_BLEND_SRC_ALPHA : D3D11_BLEND_SRC_COLOR); - break; - case GL_ONE_MINUS_SRC_COLOR: - d3dBlend = (isAlpha ? D3D11_BLEND_INV_SRC_ALPHA : D3D11_BLEND_INV_SRC_COLOR); - break; - case GL_DST_COLOR: - d3dBlend = (isAlpha ? D3D11_BLEND_DEST_ALPHA : D3D11_BLEND_DEST_COLOR); - break; - case GL_ONE_MINUS_DST_COLOR: - d3dBlend = (isAlpha ? D3D11_BLEND_INV_DEST_ALPHA : D3D11_BLEND_INV_DEST_COLOR); - break; - case GL_SRC_ALPHA: - d3dBlend = D3D11_BLEND_SRC_ALPHA; - break; - case GL_ONE_MINUS_SRC_ALPHA: - d3dBlend = D3D11_BLEND_INV_SRC_ALPHA; - break; - case GL_DST_ALPHA: - d3dBlend = D3D11_BLEND_DEST_ALPHA; - break; - case GL_ONE_MINUS_DST_ALPHA: - d3dBlend = D3D11_BLEND_INV_DEST_ALPHA; - break; - case GL_CONSTANT_COLOR: - d3dBlend = D3D11_BLEND_BLEND_FACTOR; - break; - case GL_ONE_MINUS_CONSTANT_COLOR: - d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; - break; - case GL_CONSTANT_ALPHA: - d3dBlend = D3D11_BLEND_BLEND_FACTOR; - break; - case GL_ONE_MINUS_CONSTANT_ALPHA: - d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; - break; - case GL_SRC_ALPHA_SATURATE: - d3dBlend = D3D11_BLEND_SRC_ALPHA_SAT; - break; - default: - UNREACHABLE(); - } - - return d3dBlend; -} - -D3D11_BLEND_OP ConvertBlendOp(GLenum glBlendOp) -{ - D3D11_BLEND_OP d3dBlendOp = D3D11_BLEND_OP_ADD; - - switch (glBlendOp) - { - case GL_FUNC_ADD: - d3dBlendOp = D3D11_BLEND_OP_ADD; - break; - case GL_FUNC_SUBTRACT: - d3dBlendOp = D3D11_BLEND_OP_SUBTRACT; - break; - case GL_FUNC_REVERSE_SUBTRACT: - d3dBlendOp = D3D11_BLEND_OP_REV_SUBTRACT; - break; - case GL_MIN: - d3dBlendOp = D3D11_BLEND_OP_MIN; - break; - case GL_MAX: - d3dBlendOp = D3D11_BLEND_OP_MAX; - break; - default: - UNREACHABLE(); - } - - return d3dBlendOp; -} - -UINT8 ConvertColorMask(bool red, bool green, bool blue, bool alpha) -{ - UINT8 mask = 0; - if (red) - { - mask |= D3D11_COLOR_WRITE_ENABLE_RED; - } - if (green) - { - mask |= D3D11_COLOR_WRITE_ENABLE_GREEN; - } - if (blue) - { - mask |= D3D11_COLOR_WRITE_ENABLE_BLUE; - } - if (alpha) - { - mask |= D3D11_COLOR_WRITE_ENABLE_ALPHA; - } - return mask; -} - -D3D11_CULL_MODE ConvertCullMode(bool cullEnabled, gl::CullFaceMode cullMode) -{ - D3D11_CULL_MODE cull = D3D11_CULL_NONE; - - if (cullEnabled) - { - switch (cullMode) - { - case gl::CullFaceMode::Front: - cull = D3D11_CULL_FRONT; - break; - case gl::CullFaceMode::Back: - cull = D3D11_CULL_BACK; - break; - case gl::CullFaceMode::FrontAndBack: - cull = D3D11_CULL_NONE; - break; - default: - UNREACHABLE(); - } - } - else - { - cull = D3D11_CULL_NONE; - } - - return cull; -} - -D3D11_COMPARISON_FUNC ConvertComparison(GLenum comparison) -{ - D3D11_COMPARISON_FUNC d3dComp = D3D11_COMPARISON_NEVER; - switch (comparison) - { - case GL_NEVER: - d3dComp = D3D11_COMPARISON_NEVER; - break; - case GL_ALWAYS: - d3dComp = D3D11_COMPARISON_ALWAYS; - break; - case GL_LESS: - d3dComp = D3D11_COMPARISON_LESS; - break; - case GL_LEQUAL: - d3dComp = D3D11_COMPARISON_LESS_EQUAL; - break; - case GL_EQUAL: - d3dComp = D3D11_COMPARISON_EQUAL; - break; - case GL_GREATER: - d3dComp = D3D11_COMPARISON_GREATER; - break; - case GL_GEQUAL: - d3dComp = D3D11_COMPARISON_GREATER_EQUAL; - break; - case GL_NOTEQUAL: - d3dComp = D3D11_COMPARISON_NOT_EQUAL; - break; - default: - UNREACHABLE(); - } - - return d3dComp; -} - -D3D11_DEPTH_WRITE_MASK ConvertDepthMask(bool depthWriteEnabled) -{ - return depthWriteEnabled ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO; -} - -UINT8 ConvertStencilMask(GLuint stencilmask) -{ - return static_cast<UINT8>(stencilmask); -} - -D3D11_STENCIL_OP ConvertStencilOp(GLenum stencilOp) -{ - D3D11_STENCIL_OP d3dStencilOp = D3D11_STENCIL_OP_KEEP; - - switch (stencilOp) - { - case GL_ZERO: - d3dStencilOp = D3D11_STENCIL_OP_ZERO; - break; - case GL_KEEP: - d3dStencilOp = D3D11_STENCIL_OP_KEEP; - break; - case GL_REPLACE: - d3dStencilOp = D3D11_STENCIL_OP_REPLACE; - break; - case GL_INCR: - d3dStencilOp = D3D11_STENCIL_OP_INCR_SAT; - break; - case GL_DECR: - d3dStencilOp = D3D11_STENCIL_OP_DECR_SAT; - break; - case GL_INVERT: - d3dStencilOp = D3D11_STENCIL_OP_INVERT; - break; - case GL_INCR_WRAP: - d3dStencilOp = D3D11_STENCIL_OP_INCR; - break; - case GL_DECR_WRAP: - d3dStencilOp = D3D11_STENCIL_OP_DECR; - break; - default: - UNREACHABLE(); - } - - return d3dStencilOp; -} - -D3D11_FILTER ConvertFilter(GLenum minFilter, - GLenum magFilter, - float maxAnisotropy, - GLenum comparisonMode) -{ - bool comparison = comparisonMode != GL_NONE; - - if (maxAnisotropy > 1.0f) - { - return D3D11_ENCODE_ANISOTROPIC_FILTER(static_cast<D3D11_COMPARISON_FUNC>(comparison)); - } - else - { - D3D11_FILTER_TYPE dxMin = D3D11_FILTER_TYPE_POINT; - D3D11_FILTER_TYPE dxMip = D3D11_FILTER_TYPE_POINT; - switch (minFilter) - { - case GL_NEAREST: - dxMin = D3D11_FILTER_TYPE_POINT; - dxMip = D3D11_FILTER_TYPE_POINT; - break; - case GL_LINEAR: - dxMin = D3D11_FILTER_TYPE_LINEAR; - dxMip = D3D11_FILTER_TYPE_POINT; - break; - case GL_NEAREST_MIPMAP_NEAREST: - dxMin = D3D11_FILTER_TYPE_POINT; - dxMip = D3D11_FILTER_TYPE_POINT; - break; - case GL_LINEAR_MIPMAP_NEAREST: - dxMin = D3D11_FILTER_TYPE_LINEAR; - dxMip = D3D11_FILTER_TYPE_POINT; - break; - case GL_NEAREST_MIPMAP_LINEAR: - dxMin = D3D11_FILTER_TYPE_POINT; - dxMip = D3D11_FILTER_TYPE_LINEAR; - break; - case GL_LINEAR_MIPMAP_LINEAR: - dxMin = D3D11_FILTER_TYPE_LINEAR; - dxMip = D3D11_FILTER_TYPE_LINEAR; - break; - default: - UNREACHABLE(); - } - - D3D11_FILTER_TYPE dxMag = D3D11_FILTER_TYPE_POINT; - switch (magFilter) - { - case GL_NEAREST: - dxMag = D3D11_FILTER_TYPE_POINT; - break; - case GL_LINEAR: - dxMag = D3D11_FILTER_TYPE_LINEAR; - break; - default: - UNREACHABLE(); - } - - return D3D11_ENCODE_BASIC_FILTER(dxMin, dxMag, dxMip, - static_cast<D3D11_COMPARISON_FUNC>(comparison)); - } -} - -D3D11_TEXTURE_ADDRESS_MODE ConvertTextureWrap(GLenum wrap) -{ - switch (wrap) - { - case GL_REPEAT: - return D3D11_TEXTURE_ADDRESS_WRAP; - case GL_CLAMP_TO_EDGE: - return D3D11_TEXTURE_ADDRESS_CLAMP; - case GL_MIRRORED_REPEAT: - return D3D11_TEXTURE_ADDRESS_MIRROR; - default: - UNREACHABLE(); - } - - return D3D11_TEXTURE_ADDRESS_WRAP; -} - -UINT ConvertMaxAnisotropy(float maxAnisotropy, D3D_FEATURE_LEVEL featureLevel) -{ - return static_cast<UINT>(std::min(maxAnisotropy, d3d11_gl::GetMaximumAnisotropy(featureLevel))); -} - -D3D11_QUERY ConvertQueryType(GLenum queryType) -{ - switch (queryType) - { - case GL_ANY_SAMPLES_PASSED_EXT: - case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: - return D3D11_QUERY_OCCLUSION; - case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: - return D3D11_QUERY_SO_STATISTICS; - case GL_TIME_ELAPSED_EXT: - // Two internal queries are also created for begin/end timestamps - return D3D11_QUERY_TIMESTAMP_DISJOINT; - case GL_COMMANDS_COMPLETED_CHROMIUM: - return D3D11_QUERY_EVENT; - default: - UNREACHABLE(); - return D3D11_QUERY_EVENT; - } -} - -// Get the D3D11 write mask covering all color channels of a given format -UINT8 GetColorMask(const gl::InternalFormat &format) -{ - return ConvertColorMask(format.redBits > 0, format.greenBits > 0, format.blueBits > 0, - format.alphaBits > 0); -} - -} // namespace gl_d3d11 - -namespace d3d11 -{ - -ANGLED3D11DeviceType GetDeviceType(ID3D11Device *device) -{ - // Note that this function returns an ANGLED3D11DeviceType rather than a D3D_DRIVER_TYPE value, - // since it is difficult to tell Software and Reference devices apart - - IDXGIDevice *dxgiDevice = nullptr; - IDXGIAdapter *dxgiAdapter = nullptr; - IDXGIAdapter2 *dxgiAdapter2 = nullptr; - - ANGLED3D11DeviceType retDeviceType = ANGLE_D3D11_DEVICE_TYPE_UNKNOWN; - - HRESULT hr = device->QueryInterface(__uuidof(IDXGIDevice), (void **)&dxgiDevice); - if (SUCCEEDED(hr)) - { - hr = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&dxgiAdapter); - if (SUCCEEDED(hr)) - { - std::wstring adapterString; - HRESULT adapter2hr = - dxgiAdapter->QueryInterface(__uuidof(dxgiAdapter2), (void **)&dxgiAdapter2); - if (SUCCEEDED(adapter2hr)) - { - // On D3D_FEATURE_LEVEL_9_*, IDXGIAdapter::GetDesc returns "Software Adapter" - // for the description string. Try to use IDXGIAdapter2::GetDesc2 to get the - // actual hardware values if possible. - DXGI_ADAPTER_DESC2 adapterDesc2; - dxgiAdapter2->GetDesc2(&adapterDesc2); - adapterString = std::wstring(adapterDesc2.Description); - } - else - { - DXGI_ADAPTER_DESC adapterDesc; - dxgiAdapter->GetDesc(&adapterDesc); - adapterString = std::wstring(adapterDesc.Description); - } - - // Both Reference and Software adapters will be 'Software Adapter' - const bool isSoftwareDevice = - (adapterString.find(std::wstring(L"Software Adapter")) != std::string::npos); - const bool isNullDevice = (adapterString == L""); - const bool isWARPDevice = - (adapterString.find(std::wstring(L"Basic Render")) != std::string::npos); - - if (isSoftwareDevice || isNullDevice) - { - ASSERT(!isWARPDevice); - retDeviceType = ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL; - } - else if (isWARPDevice) - { - retDeviceType = ANGLE_D3D11_DEVICE_TYPE_WARP; - } - else - { - retDeviceType = ANGLE_D3D11_DEVICE_TYPE_HARDWARE; - } - } - } - - SafeRelease(dxgiDevice); - SafeRelease(dxgiAdapter); - SafeRelease(dxgiAdapter2); - - return retDeviceType; -} - -void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset) -{ - const DXGIFormatSize &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(format); - - int upsampleCount = 0; - // Don't expand the size of full textures that are at least (blockWidth x blockHeight) already. - if (isImage || *requestWidth < static_cast<GLsizei>(dxgiFormatInfo.blockWidth) || - *requestHeight < static_cast<GLsizei>(dxgiFormatInfo.blockHeight)) - { - while (*requestWidth % dxgiFormatInfo.blockWidth != 0 || *requestHeight % dxgiFormatInfo.blockHeight != 0) - { - *requestWidth <<= 1; - *requestHeight <<= 1; - upsampleCount++; - } - } - if (levelOffset) - { - *levelOffset = upsampleCount; - } -} - -void GenerateInitialTextureData(GLint internalFormat, - const Renderer11DeviceCaps &renderer11DeviceCaps, - GLuint width, - GLuint height, - GLuint depth, - GLuint mipLevels, - std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData, - std::vector<std::vector<BYTE>> *outData) -{ - const d3d11::Format &d3dFormatInfo = d3d11::Format::Get(internalFormat, renderer11DeviceCaps); - ASSERT(d3dFormatInfo.dataInitializerFunction != nullptr); - - const d3d11::DXGIFormatSize &dxgiFormatInfo = - d3d11::GetDXGIFormatSizeInfo(d3dFormatInfo.texFormat); - - outSubresourceData->resize(mipLevels); - outData->resize(mipLevels); - - for (unsigned int i = 0; i < mipLevels; i++) - { - unsigned int mipWidth = std::max(width >> i, 1U); - unsigned int mipHeight = std::max(height >> i, 1U); - unsigned int mipDepth = std::max(depth >> i, 1U); - - unsigned int rowWidth = dxgiFormatInfo.pixelBytes * mipWidth; - unsigned int imageSize = rowWidth * height; - - outData->at(i).resize(rowWidth * mipHeight * mipDepth); - d3dFormatInfo.dataInitializerFunction(mipWidth, mipHeight, mipDepth, outData->at(i).data(), rowWidth, imageSize); - - outSubresourceData->at(i).pSysMem = outData->at(i).data(); - outSubresourceData->at(i).SysMemPitch = rowWidth; - outSubresourceData->at(i).SysMemSlicePitch = imageSize; - } -} - -UINT GetPrimitiveRestartIndex() -{ - return std::numeric_limits<UINT>::max(); -} - -void SetPositionTexCoordVertex(PositionTexCoordVertex* vertex, float x, float y, float u, float v) -{ - vertex->x = x; - vertex->y = y; - vertex->u = u; - vertex->v = v; -} - -void SetPositionLayerTexCoord3DVertex(PositionLayerTexCoord3DVertex* vertex, float x, float y, - unsigned int layer, float u, float v, float s) -{ - vertex->x = x; - vertex->y = y; - vertex->l = layer; - vertex->u = u; - vertex->v = v; - vertex->s = s; -} - -BlendStateKey::BlendStateKey() -{ - memset(this, 0, sizeof(BlendStateKey)); -} - -bool operator==(const BlendStateKey &a, const BlendStateKey &b) -{ - return memcmp(&a, &b, sizeof(BlendStateKey)) == 0; -} - -bool operator!=(const BlendStateKey &a, const BlendStateKey &b) -{ - return !(a == b); -} - -RasterizerStateKey::RasterizerStateKey() -{ - memset(this, 0, sizeof(RasterizerStateKey)); -} - -bool operator==(const RasterizerStateKey &a, const RasterizerStateKey &b) -{ - return memcmp(&a, &b, sizeof(RasterizerStateKey)) == 0; -} - -bool operator!=(const RasterizerStateKey &a, const RasterizerStateKey &b) -{ - return !(a == b); -} - -HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name) -{ -#if defined(_DEBUG) - UINT existingDataSize = 0; - resource->GetPrivateData(WKPDID_D3DDebugObjectName, &existingDataSize, nullptr); - // Don't check the HRESULT- if it failed then that probably just means that no private data - // exists yet - - if (existingDataSize > 0) - { - // In some cases, ANGLE will try to apply two names to one object, which causes - // a D3D SDK Layers warning. This can occur if, for example, you 'create' two objects - // (e.g.Rasterizer States) with identical DESCs on the same device. D3D11 will optimize - // these calls and return the same object both times. - static const char *multipleNamesUsed = "Multiple names set by ANGLE"; - - // Remove the existing name - HRESULT hr = resource->SetPrivateData(WKPDID_D3DDebugObjectName, 0, nullptr); - if (FAILED(hr)) - { - return hr; - } - - // Apply the new name - return resource->SetPrivateData(WKPDID_D3DDebugObjectName, - static_cast<unsigned int>(strlen(multipleNamesUsed)), - multipleNamesUsed); - } - else - { - return resource->SetPrivateData(WKPDID_D3DDebugObjectName, - static_cast<unsigned int>(strlen(name)), name); - } -#else - return S_OK; -#endif -} - -// Keep this in cpp file where it has visibility of Renderer11.h, otherwise calling -// allocateResource is only compatible with Clang and MSVS, which support calling a -// method on a forward declared class in a template. -template <ResourceType ResourceT> -gl::Error LazyResource<ResourceT>::resolveImpl(Renderer11 *renderer, - const GetDescType<ResourceT> &desc, - GetInitDataType<ResourceT> *initData, - const char *name) -{ - if (!mResource.valid()) - { - ANGLE_TRY(renderer->allocateResource(desc, initData, &mResource)); - mResource.setDebugName(name); - } - return gl::NoError(); -} - -template gl::Error LazyResource<ResourceType::BlendState>::resolveImpl(Renderer11 *renderer, - const D3D11_BLEND_DESC &desc, - void *initData, - const char *name); -template gl::Error LazyResource<ResourceType::ComputeShader>::resolveImpl(Renderer11 *renderer, - const ShaderData &desc, - void *initData, - const char *name); -template gl::Error LazyResource<ResourceType::GeometryShader>::resolveImpl( - Renderer11 *renderer, - const ShaderData &desc, - const std::vector<D3D11_SO_DECLARATION_ENTRY> *initData, - const char *name); -template gl::Error LazyResource<ResourceType::InputLayout>::resolveImpl( - Renderer11 *renderer, - const InputElementArray &desc, - const ShaderData *initData, - const char *name); -template gl::Error LazyResource<ResourceType::PixelShader>::resolveImpl(Renderer11 *renderer, - const ShaderData &desc, - void *initData, - const char *name); -template gl::Error LazyResource<ResourceType::VertexShader>::resolveImpl(Renderer11 *renderer, - const ShaderData &desc, - void *initData, - const char *name); - -LazyInputLayout::LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc, - size_t inputDescLen, - const BYTE *byteCode, - size_t byteCodeLen, - const char *debugName) - : mInputDesc(inputDesc, inputDescLen), mByteCode(byteCode, byteCodeLen), mDebugName(debugName) -{ -} - -LazyInputLayout::~LazyInputLayout() -{ -} - -gl::Error LazyInputLayout::resolve(Renderer11 *renderer) -{ - return resolveImpl(renderer, mInputDesc, &mByteCode, mDebugName); -} - -LazyBlendState::LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName) - : mDesc(desc), mDebugName(debugName) -{ -} - -gl::Error LazyBlendState::resolve(Renderer11 *renderer) -{ - return resolveImpl(renderer, mDesc, nullptr, mDebugName); -} - -angle::WorkaroundsD3D GenerateWorkarounds(const Renderer11DeviceCaps &deviceCaps, - const DXGI_ADAPTER_DESC &adapterDesc) -{ - bool is9_3 = (deviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3); - - angle::WorkaroundsD3D workarounds; - workarounds.mrtPerfWorkaround = true; - workarounds.setDataFasterThanImageUpload = true; - workarounds.zeroMaxLodWorkaround = is9_3; - workarounds.useInstancedPointSpriteEmulation = is9_3; - - // TODO(jmadill): Narrow problematic driver range. - if (IsNvidia(adapterDesc.VendorId)) - { - if (deviceCaps.driverVersion.valid()) - { - WORD part1 = HIWORD(deviceCaps.driverVersion.value().LowPart); - WORD part2 = LOWORD(deviceCaps.driverVersion.value().LowPart); - - // Disable the workaround to fix a second driver bug on newer NVIDIA. - workarounds.depthStencilBlitExtraCopy = (part1 <= 13u && part2 < 6881); - } - else - { - workarounds.depthStencilBlitExtraCopy = true; - } - } - - // TODO(jmadill): Disable workaround when we have a fixed compiler DLL. - workarounds.expandIntegerPowExpressions = true; - - workarounds.flushAfterEndingTransformFeedback = IsNvidia(adapterDesc.VendorId); - workarounds.getDimensionsIgnoresBaseLevel = IsNvidia(adapterDesc.VendorId); - - if (IsIntel(adapterDesc.VendorId)) - { - IntelDriverVersion capsVersion = d3d11_gl::GetIntelDriverVersion(deviceCaps.driverVersion); - - workarounds.preAddTexelFetchOffsets = true; - workarounds.useSystemMemoryForConstantBuffers = true; - workarounds.disableB5G6R5Support = capsVersion < IntelDriverVersion(4539); - workarounds.addDummyTextureNoRenderTarget = capsVersion < IntelDriverVersion(4815); - if (IsSkylake(adapterDesc.DeviceId)) - { - workarounds.callClearTwice = capsVersion < IntelDriverVersion(4771); - workarounds.emulateIsnanFloat = capsVersion < IntelDriverVersion(4542); - } - else if (IsBroadwell(adapterDesc.DeviceId) || IsHaswell(adapterDesc.DeviceId)) - { - workarounds.rewriteUnaryMinusOperator = capsVersion < IntelDriverVersion(4624); - } - } - - // TODO(jmadill): Disable when we have a fixed driver version. - workarounds.emulateTinyStencilTextures = IsAMD(adapterDesc.VendorId); - - // The tiny stencil texture workaround involves using CopySubresource or UpdateSubresource on a - // depth stencil texture. This is not allowed until feature level 10.1 but since it is not - // possible to support ES3 on these devices, there is no need for the workaround to begin with - // (anglebug.com/1572). - if (deviceCaps.featureLevel < D3D_FEATURE_LEVEL_10_1) - { - workarounds.emulateTinyStencilTextures = false; - } - - // If the VPAndRTArrayIndexFromAnyShaderFeedingRasterizer feature is not available, we have to - // select the viewport / RT array index in the geometry shader. - workarounds.selectViewInGeometryShader = - (deviceCaps.supportsVpRtIndexWriteFromVertexShader == false); - - // Call platform hooks for testing overrides. - auto *platform = ANGLEPlatformCurrent(); - platform->overrideWorkaroundsD3D(platform, &workarounds); - - return workarounds; -} - -void InitConstantBufferDesc(D3D11_BUFFER_DESC *constantBufferDescription, size_t byteWidth) -{ - constantBufferDescription->ByteWidth = static_cast<UINT>(byteWidth); - constantBufferDescription->Usage = D3D11_USAGE_DYNAMIC; - constantBufferDescription->BindFlags = D3D11_BIND_CONSTANT_BUFFER; - constantBufferDescription->CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - constantBufferDescription->MiscFlags = 0; - constantBufferDescription->StructureByteStride = 0; -} - -} // namespace d3d11 - -// TextureHelper11 implementation. -TextureHelper11::TextureHelper11() : mFormatSet(nullptr), mSampleCount(0) -{ -} - -TextureHelper11::TextureHelper11(TextureHelper11 &&toCopy) : TextureHelper11() -{ - *this = std::move(toCopy); -} - -TextureHelper11::TextureHelper11(const TextureHelper11 &other) - : mFormatSet(other.mFormatSet), mExtents(other.mExtents), mSampleCount(other.mSampleCount) -{ - mData = other.mData; -} - -TextureHelper11::~TextureHelper11() -{ -} - -void TextureHelper11::getDesc(D3D11_TEXTURE2D_DESC *desc) const -{ - static_cast<ID3D11Texture2D *>(mData->object)->GetDesc(desc); -} - -void TextureHelper11::getDesc(D3D11_TEXTURE3D_DESC *desc) const -{ - static_cast<ID3D11Texture3D *>(mData->object)->GetDesc(desc); -} - -void TextureHelper11::initDesc(const D3D11_TEXTURE2D_DESC &desc2D) -{ - mData->resourceType = ResourceType::Texture2D; - mExtents.width = static_cast<int>(desc2D.Width); - mExtents.height = static_cast<int>(desc2D.Height); - mExtents.depth = 1; - mSampleCount = desc2D.SampleDesc.Count; -} - -void TextureHelper11::initDesc(const D3D11_TEXTURE3D_DESC &desc3D) -{ - mData->resourceType = ResourceType::Texture3D; - mExtents.width = static_cast<int>(desc3D.Width); - mExtents.height = static_cast<int>(desc3D.Height); - mExtents.depth = static_cast<int>(desc3D.Depth); - mSampleCount = 1; -} - -TextureHelper11 &TextureHelper11::operator=(TextureHelper11 &&other) -{ - std::swap(mData, other.mData); - std::swap(mExtents, other.mExtents); - std::swap(mFormatSet, other.mFormatSet); - std::swap(mSampleCount, other.mSampleCount); - return *this; -} - -TextureHelper11 &TextureHelper11::operator=(const TextureHelper11 &other) -{ - mData = other.mData; - mExtents = other.mExtents; - mFormatSet = other.mFormatSet; - mSampleCount = other.mSampleCount; - return *this; -} - -bool TextureHelper11::operator==(const TextureHelper11 &other) const -{ - return mData->object == other.mData->object; -} - -bool TextureHelper11::operator!=(const TextureHelper11 &other) const -{ - return mData->object != other.mData->object; -} - -bool UsePresentPathFast(const Renderer11 *renderer, - const gl::FramebufferAttachment *framebufferAttachment) -{ - if (framebufferAttachment == nullptr) - { - return false; - } - - return (framebufferAttachment->type() == GL_FRAMEBUFFER_DEFAULT && - renderer->presentPathFastEnabled()); -} - -bool UsePrimitiveRestartWorkaround(bool primitiveRestartFixedIndexEnabled, GLenum type) -{ - // We should never have to deal with primitive restart workaround issue with GL_UNSIGNED_INT - // indices, since we restrict it via MAX_ELEMENT_INDEX. - return (!primitiveRestartFixedIndexEnabled && type == GL_UNSIGNED_SHORT); -} - -bool IsStreamingIndexData(const gl::Context *context, GLenum srcType) -{ - const auto &glState = context->getGLState(); - gl::Buffer *glBuffer = glState.getVertexArray()->getElementArrayBuffer().get(); - - // Case 1: the indices are passed by pointer, which forces the streaming of index data - if (glBuffer == nullptr) - { - return true; - } - - bool primitiveRestartWorkaround = - UsePrimitiveRestartWorkaround(glState.isPrimitiveRestartEnabled(), srcType); - - BufferD3D *buffer = GetImplAs<BufferD3D>(glBuffer); - const GLenum dstType = (srcType == GL_UNSIGNED_INT || primitiveRestartWorkaround) - ? GL_UNSIGNED_INT - : GL_UNSIGNED_SHORT; - - // Case 2a: the buffer can be used directly - if (buffer->supportsDirectBinding() && dstType == srcType) - { - return false; - } - - // Case 2b: use a static translated copy or fall back to streaming - StaticIndexBufferInterface *staticBuffer = buffer->getStaticIndexBuffer(); - if (staticBuffer == nullptr) - { - return true; - } - - if ((staticBuffer->getBufferSize() == 0) || (staticBuffer->getIndexType() != dstType)) - { - return true; - } - - return false; -} - -IndexStorageType ClassifyIndexStorage(const gl::State &glState, - const gl::Buffer *elementArrayBuffer, - GLenum elementType, - GLenum destElementType, - unsigned int offset, - bool *needsTranslation) -{ - // No buffer bound means we are streaming from a client pointer. - if (!elementArrayBuffer || !IsOffsetAligned(elementType, offset)) - { - *needsTranslation = true; - return IndexStorageType::Dynamic; - } - - // The buffer can be used directly if the storage supports it and no translation needed. - BufferD3D *bufferD3D = GetImplAs<BufferD3D>(elementArrayBuffer); - if (bufferD3D->supportsDirectBinding() && destElementType == elementType) - { - *needsTranslation = false; - return IndexStorageType::Direct; - } - - // Use a static copy when available. - StaticIndexBufferInterface *staticBuffer = bufferD3D->getStaticIndexBuffer(); - if (staticBuffer != nullptr) - { - // Need to re-translate the static data if has never been used, or changed type. - *needsTranslation = - (staticBuffer->getBufferSize() == 0 || staticBuffer->getIndexType() != destElementType); - return IndexStorageType::Static; - } - - // Static buffer not available, fall back to streaming. - *needsTranslation = true; - return IndexStorageType::Dynamic; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h deleted file mode 100644 index 3af51bb0f6..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h +++ /dev/null @@ -1,431 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// renderer11_utils.h: Conversion functions and other utility routines -// specific to the D3D11 renderer. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_ - -#include <array> -#include <functional> -#include <vector> - -#include "common/Color.h" - -#include "libANGLE/Caps.h" -#include "libANGLE/Error.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" - -namespace gl -{ -class FramebufferAttachment; -} - -namespace rx -{ -class Renderer11; -class RenderTarget11; -struct Renderer11DeviceCaps; - -using RenderTargetArray = std::array<RenderTarget11 *, gl::IMPLEMENTATION_MAX_DRAW_BUFFERS>; -using RTVArray = std::array<ID3D11RenderTargetView *, gl::IMPLEMENTATION_MAX_DRAW_BUFFERS>; - -namespace gl_d3d11 -{ - -D3D11_BLEND ConvertBlendFunc(GLenum glBlend, bool isAlpha); -D3D11_BLEND_OP ConvertBlendOp(GLenum glBlendOp); -UINT8 ConvertColorMask(bool maskRed, bool maskGreen, bool maskBlue, bool maskAlpha); - -D3D11_CULL_MODE ConvertCullMode(bool cullEnabled, gl::CullFaceMode cullMode); - -D3D11_COMPARISON_FUNC ConvertComparison(GLenum comparison); -D3D11_DEPTH_WRITE_MASK ConvertDepthMask(bool depthWriteEnabled); -UINT8 ConvertStencilMask(GLuint stencilmask); -D3D11_STENCIL_OP ConvertStencilOp(GLenum stencilOp); - -D3D11_FILTER ConvertFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy, GLenum comparisonMode); -D3D11_TEXTURE_ADDRESS_MODE ConvertTextureWrap(GLenum wrap); -UINT ConvertMaxAnisotropy(float maxAnisotropy, D3D_FEATURE_LEVEL featureLevel); - -D3D11_QUERY ConvertQueryType(GLenum queryType); - -UINT8 GetColorMask(const gl::InternalFormat &formatInfo); - -} // namespace gl_d3d11 - -namespace d3d11_gl -{ - -unsigned int GetReservedVertexUniformVectors(D3D_FEATURE_LEVEL featureLevel); - -unsigned int GetReservedFragmentUniformVectors(D3D_FEATURE_LEVEL featureLevel); - -gl::Version GetMaximumClientVersion(D3D_FEATURE_LEVEL featureLevel); -void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, const Renderer11DeviceCaps &renderer11DeviceCaps, gl::Caps *caps, - gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions, gl::Limitations *limitations); - -void GetSamplePosition(GLsizei sampleCount, size_t index, GLfloat *xy); - -} // namespace d3d11_gl - -namespace d3d11 -{ - -enum ANGLED3D11DeviceType -{ - ANGLE_D3D11_DEVICE_TYPE_UNKNOWN, - ANGLE_D3D11_DEVICE_TYPE_HARDWARE, - ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL, - ANGLE_D3D11_DEVICE_TYPE_WARP, -}; - -ANGLED3D11DeviceType GetDeviceType(ID3D11Device *device); - -void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset); - -void GenerateInitialTextureData(GLint internalFormat, - const Renderer11DeviceCaps &renderer11DeviceCaps, - GLuint width, - GLuint height, - GLuint depth, - GLuint mipLevels, - std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData, - std::vector<std::vector<BYTE>> *outData); - -UINT GetPrimitiveRestartIndex(); - -struct PositionTexCoordVertex -{ - float x, y; - float u, v; -}; -void SetPositionTexCoordVertex(PositionTexCoordVertex* vertex, float x, float y, float u, float v); - -struct PositionLayerTexCoord3DVertex -{ - float x, y; - unsigned int l; - float u, v, s; -}; -void SetPositionLayerTexCoord3DVertex(PositionLayerTexCoord3DVertex* vertex, float x, float y, - unsigned int layer, float u, float v, float s); - -struct PositionVertex -{ - float x, y, z, w; -}; - -struct BlendStateKey final -{ - // This will zero-initialize the struct, including padding. - BlendStateKey(); - - gl::BlendState blendState; - - // An int so struct size rounds nicely. - uint32_t rtvMax; - - uint8_t rtvMasks[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT]; -}; - -bool operator==(const BlendStateKey &a, const BlendStateKey &b); -bool operator!=(const BlendStateKey &a, const BlendStateKey &b); - -struct RasterizerStateKey final -{ - // This will zero-initialize the struct, including padding. - RasterizerStateKey(); - - gl::RasterizerState rasterizerState; - - // Use a 32-bit int to round the struct nicely. - uint32_t scissorEnabled; -}; - -bool operator==(const RasterizerStateKey &a, const RasterizerStateKey &b); -bool operator!=(const RasterizerStateKey &a, const RasterizerStateKey &b); - -template <typename outType> -outType* DynamicCastComObject(IUnknown* object) -{ - outType *outObject = nullptr; - HRESULT result = object->QueryInterface(__uuidof(outType), reinterpret_cast<void**>(&outObject)); - if (SUCCEEDED(result)) - { - return outObject; - } - else - { - SafeRelease(outObject); - return nullptr; - } -} - -inline bool isDeviceLostError(HRESULT errorCode) -{ - switch (errorCode) - { - case DXGI_ERROR_DEVICE_HUNG: - case DXGI_ERROR_DEVICE_REMOVED: - case DXGI_ERROR_DEVICE_RESET: - case DXGI_ERROR_DRIVER_INTERNAL_ERROR: - case DXGI_ERROR_NOT_CURRENTLY_AVAILABLE: - return true; - default: - return false; - } -} - -template <ResourceType ResourceT> -class LazyResource : angle::NonCopyable -{ - public: - constexpr LazyResource() : mResource() {} - virtual ~LazyResource() {} - - virtual gl::Error resolve(Renderer11 *renderer) = 0; - void reset() { mResource.reset(); } - GetD3D11Type<ResourceT> *get() const - { - ASSERT(mResource.valid()); - return mResource.get(); - } - - const Resource11<GetD3D11Type<ResourceT>> &getObj() const { return mResource; } - - protected: - LazyResource(LazyResource &&other) : mResource(std::move(other.mResource)) {} - - // Specialized in the cpp file to avoid MSVS/Clang specific code. - gl::Error resolveImpl(Renderer11 *renderer, - const GetDescType<ResourceT> &desc, - GetInitDataType<ResourceT> *initData, - const char *name); - - Resource11<GetD3D11Type<ResourceT>> mResource; -}; - -template <typename D3D11ShaderType> -class LazyShader final : public LazyResource<GetResourceTypeFromD3D11<D3D11ShaderType>()> -{ - public: - // All parameters must be constexpr. Not supported in VS2013. - constexpr LazyShader(const BYTE *byteCode, size_t byteCodeSize, const char *name) - : mByteCode(byteCode, byteCodeSize), mName(name) - { - } - - constexpr LazyShader(LazyShader &&shader) - : LazyResource<GetResourceTypeFromD3D11<D3D11ShaderType>()>(std::move(shader)), - mByteCode(std::move(shader.mByteCode)), - mName(shader.mName) - { - } - - gl::Error resolve(Renderer11 *renderer) override - { - return this->resolveImpl(renderer, mByteCode, nullptr, mName); - } - - private: - ShaderData mByteCode; - const char *mName; -}; - -class LazyInputLayout final : public LazyResource<ResourceType::InputLayout> -{ - public: - LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc, - size_t inputDescLen, - const BYTE *byteCode, - size_t byteCodeLen, - const char *debugName); - ~LazyInputLayout() override; - - gl::Error resolve(Renderer11 *renderer) override; - - private: - InputElementArray mInputDesc; - ShaderData mByteCode; - const char *mDebugName; -}; - -class LazyBlendState final : public LazyResource<ResourceType::BlendState> -{ - public: - LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName); - - gl::Error resolve(Renderer11 *renderer) override; - - private: - D3D11_BLEND_DESC mDesc; - const char *mDebugName; -}; - -// Copy data to small D3D11 buffers, such as for small constant buffers, which use one struct to -// represent an entire buffer. -template <class T> -void SetBufferData(ID3D11DeviceContext *context, ID3D11Buffer *constantBuffer, const T &value) -{ - D3D11_MAPPED_SUBRESOURCE mappedResource = {}; - HRESULT result = context->Map(constantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - ASSERT(SUCCEEDED(result)); - if (SUCCEEDED(result)) - { - memcpy(mappedResource.pData, &value, sizeof(T)); - context->Unmap(constantBuffer, 0); - } -} - -angle::WorkaroundsD3D GenerateWorkarounds(const Renderer11DeviceCaps &deviceCaps, - const DXGI_ADAPTER_DESC &adapterDesc); - -enum ReservedConstantBufferSlot -{ - RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK = 0, - RESERVED_CONSTANT_BUFFER_SLOT_DRIVER = 1, - - RESERVED_CONSTANT_BUFFER_SLOT_COUNT = 2 -}; - -void InitConstantBufferDesc(D3D11_BUFFER_DESC *constantBufferDescription, size_t byteWidth); -} // namespace d3d11 - -struct GenericData -{ - GenericData() {} - ~GenericData() - { - if (object) - { - // We can have a nullptr factory when holding passed-in resources. - if (manager) - { - manager->onReleaseGeneric(resourceType, object); - manager = nullptr; - } - object->Release(); - object = nullptr; - } - } - - ResourceType resourceType = ResourceType::Last; - ID3D11Resource *object = nullptr; - ResourceManager11 *manager = nullptr; -}; - -// A helper class which wraps a 2D or 3D texture. -class TextureHelper11 : public Resource11Base<ID3D11Resource, std::shared_ptr, GenericData> -{ - public: - TextureHelper11(); - TextureHelper11(TextureHelper11 &&other); - TextureHelper11(const TextureHelper11 &other); - ~TextureHelper11() override; - TextureHelper11 &operator=(TextureHelper11 &&other); - TextureHelper11 &operator=(const TextureHelper11 &other); - - bool is2D() const { return mData->resourceType == ResourceType::Texture2D; } - bool is3D() const { return mData->resourceType == ResourceType::Texture3D; } - ResourceType getTextureType() const { return mData->resourceType; } - gl::Extents getExtents() const { return mExtents; } - DXGI_FORMAT getFormat() const { return mFormatSet->texFormat; } - const d3d11::Format &getFormatSet() const { return *mFormatSet; } - int getSampleCount() const { return mSampleCount; } - - template <typename DescT, typename ResourceT> - void init(Resource11<ResourceT> &&texture, const DescT &desc, const d3d11::Format &format) - { - std::swap(mData->manager, texture.mData->manager); - - // Can't use std::swap because texture is typed, and here we use ID3D11Resource. - ID3D11Resource *temp = mData->object; - mData->object = texture.mData->object; - texture.mData->object = static_cast<ResourceT *>(temp); - - mFormatSet = &format; - initDesc(desc); - } - - template <typename ResourceT> - void set(ResourceT *object, const d3d11::Format &format) - { - ASSERT(!valid()); - mFormatSet = &format; - mData->object = object; - mData->manager = nullptr; - - GetDescFromD3D11<ResourceT> desc; - getDesc(&desc); - initDesc(desc); - } - - bool operator==(const TextureHelper11 &other) const; - bool operator!=(const TextureHelper11 &other) const; - - void getDesc(D3D11_TEXTURE2D_DESC *desc) const; - void getDesc(D3D11_TEXTURE3D_DESC *desc) const; - - private: - void initDesc(const D3D11_TEXTURE2D_DESC &desc2D); - void initDesc(const D3D11_TEXTURE3D_DESC &desc3D); - - const d3d11::Format *mFormatSet; - gl::Extents mExtents; - int mSampleCount; -}; - -enum class StagingAccess -{ - READ, - READ_WRITE, -}; - -bool UsePresentPathFast(const Renderer11 *renderer, const gl::FramebufferAttachment *colorbuffer); -bool UsePrimitiveRestartWorkaround(bool primitiveRestartFixedIndexEnabled, GLenum type); -bool IsStreamingIndexData(const gl::Context *context, GLenum srcType); - -enum class IndexStorageType -{ - // Dynamic indexes are re-streamed every frame. They come from a client data pointer or - // from buffers that are updated frequently. - Dynamic, - - // Static indexes are translated from the original storage once, and re-used multiple times. - Static, - - // Direct indexes are never transated and are used directly from the source buffer. They are - // the fastest available path. - Direct, - - // Not a real storage type. - Invalid, -}; - -IndexStorageType ClassifyIndexStorage(const gl::State &glState, - const gl::Buffer *elementArrayBuffer, - GLenum elementType, - GLenum destElementType, - unsigned int offset, - bool *needsTranslation); - -// Used for state change notifications between buffers and vertex arrays. -using OnBufferDataDirtyBinding = angle::ChannelBinding<size_t, const gl::Context *>; -using OnBufferDataDirtyChannel = angle::BroadcastChannel<size_t, const gl::Context *>; -using OnBufferDataDirtyReceiver = angle::SignalReceiver<size_t, const gl::Context *>; - -// Used for state change notifications between RenderTarget11 and Framebuffer11. -using OnRenderTargetDirtyBinding = angle::ChannelBinding<size_t, const gl::Context *>; -using OnRenderTargetDirtyChannel = angle::BroadcastChannel<size_t, const gl::Context *>; -using OnRenderTargetDirtyReceiver = angle::SignalReceiver<size_t, const gl::Context *>; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/BufferToTexture11.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/BufferToTexture11.hlsl deleted file mode 100644 index c43734f6a3..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/BufferToTexture11.hlsl +++ /dev/null @@ -1,77 +0,0 @@ -Buffer<float4> Buffer4F : register(t0); -Buffer<int4> Buffer4I : register(t0); -Buffer<uint4> Buffer4UI : register(t0); - -struct VS_OUTPUT -{ - float4 position : SV_Position; - uint index : TEXCOORD0; - uint slice : LAYER; -}; - -struct GS_OUTPUT -{ - float4 position : SV_Position; - uint index : TEXCOORD0; - uint slice : SV_RenderTargetArrayIndex; -}; - -cbuffer BufferCopyParams : register(b0) -{ - uint FirstPixelOffset; - uint PixelsPerRow; - uint RowStride; - uint RowsPerSlice; - float2 PositionOffset; - float2 PositionScale; - int2 TexLocationOffset; - int2 TexLocationScale; - uint FirstSlice; -} - -void ComputePositionAndIndex(uint vertexID, out VS_OUTPUT outVertex) -{ - uint PixelsPerSlice = PixelsPerRow * RowsPerSlice; - uint SliceStride = RowStride * RowsPerSlice; - - uint slice = vertexID / PixelsPerSlice; - uint sliceOffset = slice * PixelsPerSlice; - uint row = (vertexID - sliceOffset) / PixelsPerRow; - uint col = vertexID - sliceOffset - (row * PixelsPerRow); - - float2 coords = float2(float(col), float(row)); - - outVertex.position = float4(PositionOffset + PositionScale * coords, 0.0f, 1.0f); - outVertex.index = FirstPixelOffset + slice * SliceStride + row * RowStride + col; - outVertex.slice = FirstSlice + slice; -} - -void VS_BufferToTexture(in uint vertexID : SV_VertexID, out VS_OUTPUT outVertex) -{ - ComputePositionAndIndex(vertexID, outVertex); -} - -[maxvertexcount(1)] -void GS_BufferToTexture(point VS_OUTPUT inVertex[1], inout PointStream<GS_OUTPUT> outStream) -{ - GS_OUTPUT outVertex; - outVertex.position = inVertex[0].position; - outVertex.index = inVertex[0].index; - outVertex.slice = inVertex[0].slice; - outStream.Append(outVertex); -} - -float4 PS_BufferToTexture_4F(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target -{ - return Buffer4F.Load(inIndex); -} - -int4 PS_BufferToTexture_4I(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target -{ - return Buffer4I.Load(inIndex); -} - -uint4 PS_BufferToTexture_4UI(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target -{ - return Buffer4UI.Load(inIndex); -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Clear11.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Clear11.hlsl deleted file mode 100644 index 48f5b427ec..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Clear11.hlsl +++ /dev/null @@ -1,635 +0,0 @@ -// -// Copyright (c) 2017 The ANGLE Project. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// - -// Clear11.hlsl: Shaders for clearing RTVs and DSVs using draw calls and -// specifying float depth values and either float, uint or sint clear colors. -// Notes: -// - UINT & SINT clears can only be compiled with FL10+ -// - VS_Clear_FL9 requires a VB to be bound with vertices to create -// a primitive covering the entire surface (in clip co-ordinates) - -// Constants -static const float2 g_Corners[6] = -{ - float2(-1.0f, 1.0f), - float2( 1.0f, -1.0f), - float2(-1.0f, -1.0f), - float2(-1.0f, 1.0f), - float2( 1.0f, 1.0f), - float2( 1.0f, -1.0f), -}; - -// Vertex Shaders -void VS_Clear(in uint id : SV_VertexID, - out float4 outPosition : SV_POSITION) -{ - float2 corner = g_Corners[id]; - outPosition = float4(corner.x, corner.y, 0.0f, 1.0f); -} - -void VS_Multiview_Clear(in uint id : SV_VertexID, - in uint instanceID : SV_InstanceID, - out float4 outPosition : SV_POSITION, - out uint outLayerID : TEXCOORD0) -{ - float2 corner = g_Corners[id]; - outPosition = float4(corner.x, corner.y, 0.0f, 1.0f); - outLayerID = instanceID; -} - -void VS_Clear_FL9( in float4 inPosition : POSITION, - out float4 outPosition : SV_POSITION) -{ - outPosition = inPosition; -} - -// Geometry shader for clearing multiview layered textures -struct GS_INPUT -{ - float4 inPosition : SV_Position; - uint inLayerID : TEXCOORD0; -}; - -struct GS_OUTPUT -{ - float4 outPosition : SV_Position; - uint outLayerID : SV_RenderTargetArrayIndex; -}; - -[maxvertexcount(3)] -void GS_Multiview_Clear(triangle GS_INPUT input[3], inout TriangleStream<GS_OUTPUT> outStream) -{ - GS_OUTPUT output = (GS_OUTPUT)0; - for (int i = 0; i < 3; i++) - { - output.outPosition = input[i].inPosition; - output.outLayerID = input[i].inLayerID; - outStream.Append(output); - } - outStream.RestartStrip(); -} - -// Pixel Shader Constant Buffers -cbuffer ColorAndDepthDataFloat : register(b0) -{ - float4 color_Float : packoffset(c0); - float zValueF_Float : packoffset(c1); -} - -cbuffer ColorAndDepthDataSint : register(b0) -{ - int4 color_Sint : packoffset(c0); - float zValueF_Sint : packoffset(c1); -} - -cbuffer ColorAndDepthDataUint : register(b0) -{ - uint4 color_Uint : packoffset(c0); - float zValueF_Uint : packoffset(c1); -} - -cbuffer DepthOnlyData : register(b0) -{ - float zValue_Depth : packoffset(c1); -} - -// Pixel Shader Output Structs -struct PS_OutputFloat_FL9 -{ - float4 color0 : SV_TARGET0; - float4 color1 : SV_TARGET1; - float4 color2 : SV_TARGET2; - float4 color3 : SV_TARGET3; - float depth : SV_DEPTH; -}; - -struct PS_OutputFloat1 -{ - float4 color0 : SV_TARGET0; - float depth : SV_DEPTH; -}; - -struct PS_OutputFloat2 -{ - float4 color0 : SV_TARGET0; - float4 color1 : SV_TARGET1; - float depth : SV_DEPTH; -}; - -struct PS_OutputFloat3 -{ - float4 color0 : SV_TARGET0; - float4 color1 : SV_TARGET1; - float4 color2 : SV_TARGET2; - float depth : SV_DEPTH; -}; - -struct PS_OutputFloat4 -{ - float4 color0 : SV_TARGET0; - float4 color1 : SV_TARGET1; - float4 color2 : SV_TARGET2; - float4 color3 : SV_TARGET3; - float depth : SV_DEPTH; -}; - -struct PS_OutputFloat5 -{ - float4 color0 : SV_TARGET0; - float4 color1 : SV_TARGET1; - float4 color2 : SV_TARGET2; - float4 color3 : SV_TARGET3; - float4 color4 : SV_TARGET4; - float depth : SV_DEPTH; -}; - -struct PS_OutputFloat6 -{ - float4 color0 : SV_TARGET0; - float4 color1 : SV_TARGET1; - float4 color2 : SV_TARGET2; - float4 color3 : SV_TARGET3; - float4 color4 : SV_TARGET4; - float4 color5 : SV_TARGET5; - float depth : SV_DEPTH; -}; - -struct PS_OutputFloat7 -{ - float4 color0 : SV_TARGET0; - float4 color1 : SV_TARGET1; - float4 color2 : SV_TARGET2; - float4 color3 : SV_TARGET3; - float4 color4 : SV_TARGET4; - float4 color5 : SV_TARGET5; - float4 color6 : SV_TARGET6; - float depth : SV_DEPTH; -}; - -struct PS_OutputFloat8 -{ - float4 color0 : SV_TARGET0; - float4 color1 : SV_TARGET1; - float4 color2 : SV_TARGET2; - float4 color3 : SV_TARGET3; - float4 color4 : SV_TARGET4; - float4 color5 : SV_TARGET5; - float4 color6 : SV_TARGET6; - float4 color7 : SV_TARGET7; - float depth : SV_DEPTH; -}; - -struct PS_OutputUint1 -{ - uint4 color0 : SV_TARGET0; - float depth : SV_DEPTH; -}; - -struct PS_OutputUint2 -{ - uint4 color0 : SV_TARGET0; - uint4 color1 : SV_TARGET1; - float depth : SV_DEPTH; -}; - -struct PS_OutputUint3 -{ - uint4 color0 : SV_TARGET0; - uint4 color1 : SV_TARGET1; - uint4 color2 : SV_TARGET2; - float depth : SV_DEPTH; -}; - -struct PS_OutputUint4 -{ - uint4 color0 : SV_TARGET0; - uint4 color1 : SV_TARGET1; - uint4 color2 : SV_TARGET2; - uint4 color3 : SV_TARGET3; - float depth : SV_DEPTH; -}; - -struct PS_OutputUint5 -{ - uint4 color0 : SV_TARGET0; - uint4 color1 : SV_TARGET1; - uint4 color2 : SV_TARGET2; - uint4 color3 : SV_TARGET3; - uint4 color4 : SV_TARGET4; - float depth : SV_DEPTH; -}; - -struct PS_OutputUint6 -{ - uint4 color0 : SV_TARGET0; - uint4 color1 : SV_TARGET1; - uint4 color2 : SV_TARGET2; - uint4 color3 : SV_TARGET3; - uint4 color4 : SV_TARGET4; - uint4 color5 : SV_TARGET5; - float depth : SV_DEPTH; -}; - -struct PS_OutputUint7 -{ - uint4 color0 : SV_TARGET0; - uint4 color1 : SV_TARGET1; - uint4 color2 : SV_TARGET2; - uint4 color3 : SV_TARGET3; - uint4 color4 : SV_TARGET4; - uint4 color5 : SV_TARGET5; - uint4 color6 : SV_TARGET6; - float depth : SV_DEPTH; -}; - -struct PS_OutputUint8 -{ - uint4 color0 : SV_TARGET0; - uint4 color1 : SV_TARGET1; - uint4 color2 : SV_TARGET2; - uint4 color3 : SV_TARGET3; - uint4 color4 : SV_TARGET4; - uint4 color5 : SV_TARGET5; - uint4 color6 : SV_TARGET6; - uint4 color7 : SV_TARGET7; - float depth : SV_DEPTH; -}; - -struct PS_OutputSint1 -{ - int4 color0 : SV_TARGET0; - float depth : SV_DEPTH; -}; - -struct PS_OutputSint2 -{ - int4 color0 : SV_TARGET0; - int4 color1 : SV_TARGET1; - float depth : SV_DEPTH; -}; - -struct PS_OutputSint3 -{ - int4 color0 : SV_TARGET0; - int4 color1 : SV_TARGET1; - int4 color2 : SV_TARGET2; - float depth : SV_DEPTH; -}; - -struct PS_OutputSint4 -{ - int4 color0 : SV_TARGET0; - int4 color1 : SV_TARGET1; - int4 color2 : SV_TARGET2; - int4 color3 : SV_TARGET3; - float depth : SV_DEPTH; -}; - -struct PS_OutputSint5 -{ - int4 color0 : SV_TARGET0; - int4 color1 : SV_TARGET1; - int4 color2 : SV_TARGET2; - int4 color3 : SV_TARGET3; - int4 color4 : SV_TARGET4; - float depth : SV_DEPTH; -}; - -struct PS_OutputSint6 -{ - int4 color0 : SV_TARGET0; - int4 color1 : SV_TARGET1; - int4 color2 : SV_TARGET2; - int4 color3 : SV_TARGET3; - int4 color4 : SV_TARGET4; - int4 color5 : SV_TARGET5; - float depth : SV_DEPTH; -}; - -struct PS_OutputSint7 -{ - int4 color0 : SV_TARGET0; - int4 color1 : SV_TARGET1; - int4 color2 : SV_TARGET2; - int4 color3 : SV_TARGET3; - int4 color4 : SV_TARGET4; - int4 color5 : SV_TARGET5; - int4 color6 : SV_TARGET6; - float depth : SV_DEPTH; -}; - -struct PS_OutputSint8 -{ - int4 color0 : SV_TARGET0; - int4 color1 : SV_TARGET1; - int4 color2 : SV_TARGET2; - int4 color3 : SV_TARGET3; - int4 color4 : SV_TARGET4; - int4 color5 : SV_TARGET5; - int4 color6 : SV_TARGET6; - int4 color7 : SV_TARGET7; - float depth : SV_DEPTH; -}; - -struct PS_OutputDepth -{ - float depth : SV_DEPTH; -}; - -// Pixel Shaders -PS_OutputFloat_FL9 PS_ClearFloat_FL9(in float4 inPosition : SV_POSITION) -{ - PS_OutputFloat_FL9 outData; - outData.color0 = color_Float; - outData.color1 = color_Float; - outData.color2 = color_Float; - outData.color3 = color_Float; - outData.depth = zValueF_Float; - return outData; -} - -PS_OutputFloat1 PS_ClearFloat1(in float4 inPosition : SV_POSITION) -{ - PS_OutputFloat1 outData; - outData.color0 = color_Float; - outData.depth = zValueF_Float; - return outData; -} - -PS_OutputFloat2 PS_ClearFloat2(in float4 inPosition : SV_POSITION) -{ - PS_OutputFloat2 outData; - outData.color0 = color_Float; - outData.color1 = color_Float; - outData.depth = zValueF_Float; - return outData; -} - -PS_OutputFloat3 PS_ClearFloat3(in float4 inPosition : SV_POSITION) -{ - PS_OutputFloat3 outData; - outData.color0 = color_Float; - outData.color1 = color_Float; - outData.color2 = color_Float; - outData.depth = zValueF_Float; - return outData; -} - -PS_OutputFloat4 PS_ClearFloat4(in float4 inPosition : SV_POSITION) -{ - PS_OutputFloat4 outData; - outData.color0 = color_Float; - outData.color1 = color_Float; - outData.color2 = color_Float; - outData.color3 = color_Float; - outData.depth = zValueF_Float; - return outData; -} - -PS_OutputFloat5 PS_ClearFloat5(in float4 inPosition : SV_POSITION) -{ - PS_OutputFloat5 outData; - outData.color0 = color_Float; - outData.color1 = color_Float; - outData.color2 = color_Float; - outData.color3 = color_Float; - outData.color4 = color_Float; - outData.depth = zValueF_Float; - return outData; -} - -PS_OutputFloat6 PS_ClearFloat6(in float4 inPosition : SV_POSITION) -{ - PS_OutputFloat6 outData; - outData.color0 = color_Float; - outData.color1 = color_Float; - outData.color2 = color_Float; - outData.color3 = color_Float; - outData.color4 = color_Float; - outData.color5 = color_Float; - outData.depth = zValueF_Float; - return outData; -} - -PS_OutputFloat7 PS_ClearFloat7(in float4 inPosition : SV_POSITION) -{ - PS_OutputFloat7 outData; - outData.color0 = color_Float; - outData.color1 = color_Float; - outData.color2 = color_Float; - outData.color3 = color_Float; - outData.color4 = color_Float; - outData.color5 = color_Float; - outData.color6 = color_Float; - outData.depth = zValueF_Float; - return outData; -} - -PS_OutputFloat8 PS_ClearFloat8(in float4 inPosition : SV_POSITION) -{ - PS_OutputFloat8 outData; - outData.color0 = color_Float; - outData.color1 = color_Float; - outData.color2 = color_Float; - outData.color3 = color_Float; - outData.color4 = color_Float; - outData.color5 = color_Float; - outData.color6 = color_Float; - outData.color7 = color_Float; - outData.depth = zValueF_Float; - return outData; -} - -PS_OutputUint1 PS_ClearUint1(in float4 inPosition : SV_POSITION) -{ - PS_OutputUint1 outData; - outData.color0 = color_Uint; - outData.depth = zValueF_Uint; - return outData; -} - -PS_OutputUint2 PS_ClearUint2(in float4 inPosition : SV_POSITION) -{ - PS_OutputUint2 outData; - outData.color0 = color_Uint; - outData.color1 = color_Uint; - outData.depth = zValueF_Uint; - return outData; -} - -PS_OutputUint3 PS_ClearUint3(in float4 inPosition : SV_POSITION) -{ - PS_OutputUint3 outData; - outData.color0 = color_Uint; - outData.color1 = color_Uint; - outData.color2 = color_Uint; - outData.depth = zValueF_Uint; - return outData; -} - -PS_OutputUint4 PS_ClearUint4(in float4 inPosition : SV_POSITION) -{ - PS_OutputUint4 outData; - outData.color0 = color_Uint; - outData.color1 = color_Uint; - outData.color2 = color_Uint; - outData.color3 = color_Uint; - outData.depth = zValueF_Uint; - return outData; -} - -PS_OutputUint5 PS_ClearUint5(in float4 inPosition : SV_POSITION) -{ - PS_OutputUint5 outData; - outData.color0 = color_Uint; - outData.color1 = color_Uint; - outData.color2 = color_Uint; - outData.color3 = color_Uint; - outData.color4 = color_Uint; - outData.depth = zValueF_Uint; - return outData; -} - -PS_OutputUint6 PS_ClearUint6(in float4 inPosition : SV_POSITION) -{ - PS_OutputUint6 outData; - outData.color0 = color_Uint; - outData.color1 = color_Uint; - outData.color2 = color_Uint; - outData.color3 = color_Uint; - outData.color4 = color_Uint; - outData.color5 = color_Uint; - outData.depth = zValueF_Uint; - return outData; -} - -PS_OutputUint7 PS_ClearUint7(in float4 inPosition : SV_POSITION) -{ - PS_OutputUint7 outData; - outData.color0 = color_Uint; - outData.color1 = color_Uint; - outData.color2 = color_Uint; - outData.color3 = color_Uint; - outData.color4 = color_Uint; - outData.color5 = color_Uint; - outData.color6 = color_Uint; - outData.depth = zValueF_Uint; - return outData; -} - -PS_OutputUint8 PS_ClearUint8(in float4 inPosition : SV_POSITION) -{ - PS_OutputUint8 outData; - outData.color0 = color_Uint; - outData.color1 = color_Uint; - outData.color2 = color_Uint; - outData.color3 = color_Uint; - outData.color4 = color_Uint; - outData.color5 = color_Uint; - outData.color6 = color_Uint; - outData.color7 = color_Uint; - outData.depth = zValueF_Uint; - return outData; -} - -PS_OutputSint1 PS_ClearSint1(in float4 inPosition : SV_POSITION) -{ - PS_OutputSint1 outData; - outData.color0 = color_Sint; - outData.depth = zValueF_Sint; - return outData; -} - -PS_OutputSint2 PS_ClearSint2(in float4 inPosition : SV_POSITION) -{ - PS_OutputSint2 outData; - outData.color0 = color_Sint; - outData.color1 = color_Sint; - outData.depth = zValueF_Sint; - return outData; -} - -PS_OutputSint3 PS_ClearSint3(in float4 inPosition : SV_POSITION) -{ - PS_OutputSint3 outData; - outData.color0 = color_Sint; - outData.color1 = color_Sint; - outData.color2 = color_Sint; - outData.depth = zValueF_Sint; - return outData; -} - -PS_OutputSint4 PS_ClearSint4(in float4 inPosition : SV_POSITION) -{ - PS_OutputSint4 outData; - outData.color0 = color_Sint; - outData.color1 = color_Sint; - outData.color2 = color_Sint; - outData.color3 = color_Sint; - outData.depth = zValueF_Sint; - return outData; -} - -PS_OutputSint5 PS_ClearSint5(in float4 inPosition : SV_POSITION) -{ - PS_OutputSint5 outData; - outData.color0 = color_Sint; - outData.color1 = color_Sint; - outData.color2 = color_Sint; - outData.color3 = color_Sint; - outData.color4 = color_Sint; - outData.depth = zValueF_Sint; - return outData; -} - -PS_OutputSint6 PS_ClearSint6(in float4 inPosition : SV_POSITION) -{ - PS_OutputSint6 outData; - outData.color0 = color_Sint; - outData.color1 = color_Sint; - outData.color2 = color_Sint; - outData.color3 = color_Sint; - outData.color4 = color_Sint; - outData.color5 = color_Sint; - outData.depth = zValueF_Sint; - return outData; -} - -PS_OutputSint7 PS_ClearSint7(in float4 inPosition : SV_POSITION) -{ - PS_OutputSint7 outData; - outData.color0 = color_Sint; - outData.color1 = color_Sint; - outData.color2 = color_Sint; - outData.color3 = color_Sint; - outData.color4 = color_Sint; - outData.color5 = color_Sint; - outData.color6 = color_Sint; - outData.depth = zValueF_Sint; - return outData; -} - -PS_OutputSint8 PS_ClearSint8(in float4 inPosition : SV_POSITION) -{ - PS_OutputSint8 outData; - outData.color0 = color_Sint; - outData.color1 = color_Sint; - outData.color2 = color_Sint; - outData.color3 = color_Sint; - outData.color4 = color_Sint; - outData.color5 = color_Sint; - outData.color6 = color_Sint; - outData.color7 = color_Sint; - outData.depth = zValueF_Sint; - return outData; -} - -PS_OutputDepth PS_ClearDepth(in float4 inPosition : SV_POSITION) -{ - PS_OutputDepth outData; - outData.depth = zValue_Depth; - return outData; -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl deleted file mode 100644 index 0d10b8eafa..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl +++ /dev/null @@ -1,131 +0,0 @@ -Texture2D<float4> TextureF : register(t0); -Texture2D<uint4> TextureUI : register(t0); - -SamplerState Sampler : register(s0); - -// Notation: -// PM: premultiply, UM: unmulitply, PT: passthrough -// F: float, U: uint - -// Float to float LUMA -float4 PS_FtoF_PM_LUMA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - color.rgb = color.r * color.a; - color.a = 1.0f; - return color; -} -float4 PS_FtoF_UM_LUMA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - if (color.a > 0.0f) - { - color.rgb = color.r / color.a; - } - color.a = 1.0f; - return color; -} - -// Float to float LUMAALPHA -float4 PS_FtoF_PM_LUMAALPHA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - color.rgb = color.r * color.a; - return color; -} - -float4 PS_FtoF_UM_LUMAALPHA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - if (color.a > 0.0f) - { - color.rgb = color.r / color.a; - } - return color; -} - -// Float to float RGBA -float4 PS_FtoF_PM_RGBA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - color.rgb *= color.a; - return color; -} - -float4 PS_FtoF_UM_RGBA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - if (color.a > 0.0f) - { - color.rgb /= color.a; - } - return color; -} - -// Float to float RGB -float4 PS_FtoF_PM_RGB(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - color.rgb *= color.a; - color.a = 1.0f; - return color; -} - -float4 PS_FtoF_UM_RGB(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - if (color.a > 0.0f) - { - color.rgb /= color.a; - } - color.a = 1.0f; - return color; -} - -// Float to uint RGBA -uint4 PS_FtoU_PT_RGBA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - return uint4(color * 255); -} - -uint4 PS_FtoU_PM_RGBA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - color.rgb *= color.a; - return uint4(color * 255); -} - -uint4 PS_FtoU_UM_RGBA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - if (color.a > 0.0f) - { - color.rgb /= color.a; - } - return uint4(color * 255); -} - -// Float to uint RGB -uint4 PS_FtoU_PT_RGB(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - return uint4(color.rgb * 255, 1); -} - -uint4 PS_FtoU_PM_RGB(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - color.rgb *= color.a; - return uint4(color.rgb * 255, 1); -} - -uint4 PS_FtoU_UM_RGB(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - float4 color = TextureF.Sample(Sampler, inTexCoord).rgba; - if (color.a > 0.0f) - { - color.rgb /= color.a; - } - return uint4(color.rgb * 255, 1); -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough2D11.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough2D11.hlsl deleted file mode 100644 index 0b1a5ad169..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough2D11.hlsl +++ /dev/null @@ -1,122 +0,0 @@ -Texture2D<float4> TextureF : register(t0); -Texture2DMS<float4> TextureF_MS: register(t0); -Texture2D<uint4> TextureUI : register(t0); -Texture2D<int4> TextureI : register(t0); - -SamplerState Sampler : register(s0); - -void VS_Passthrough2D( in float2 inPosition : POSITION, in float2 inTexCoord : TEXCOORD0, - out float4 outPosition : SV_POSITION, out float2 outTexCoord : TEXCOORD0) -{ - outPosition = float4(inPosition, 0.0f, 1.0f); - outTexCoord = inTexCoord; -} - -float PS_PassthroughDepth2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_DEPTH -{ - return TextureF.Sample(Sampler, inTexCoord).r; -} - -float4 PS_PassthroughRGBA2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - return TextureF.Sample(Sampler, inTexCoord).rgba; -} - -float4 PS_PassthroughA2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - return float4(0.0f, 0.0f, 0.0f, TextureF.Sample(Sampler, inTexCoord).a); -} - -float4 PS_PassthroughRGBA2DMS(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCORD0, in uint inSampleIndex : SV_SAMPLEINDEX) : SV_TARGET0 -{ - return TextureF_MS.sample[inSampleIndex][inTexCoord].rgba; -} - -uint4 PS_PassthroughRGBA2DUI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint2 size; - TextureUI.GetDimensions(size.x, size.y); - - return TextureUI.Load(int3(size * inTexCoord, 0)).rgba; -} - -int4 PS_PassthroughRGBA2DI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint2 size; - TextureI.GetDimensions(size.x, size.y); - - return TextureI.Load(int3(size * inTexCoord, 0)).rgba; -} - -float4 PS_PassthroughRGB2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - return float4(TextureF.Sample(Sampler, inTexCoord).rgb, 1.0f); -} - -uint4 PS_PassthroughRGB2DUI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint2 size; - TextureUI.GetDimensions(size.x, size.y); - - return uint4(TextureUI.Load(int3(size * inTexCoord, 0)).rgb, 0); -} - -int4 PS_PassthroughRGB2DI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint2 size; - TextureI.GetDimensions(size.x, size.y); - - return int4(TextureI.Load(int3(size * inTexCoord, 0)).rgb, 0); -} - -float4 PS_PassthroughRG2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - return float4(TextureF.Sample(Sampler, inTexCoord).rg, 0.0f, 1.0f); -} - -uint4 PS_PassthroughRG2DUI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint2 size; - TextureUI.GetDimensions(size.x, size.y); - - return uint4(TextureUI.Load(int3(size * inTexCoord, 0)).rg, 0, 0); -} - -int4 PS_PassthroughRG2DI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint2 size; - TextureI.GetDimensions(size.x, size.y); - - return int4(TextureI.Load(int3(size * inTexCoord, 0)).rg, 0, 0); -} - -float4 PS_PassthroughR2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - return float4(TextureF.Sample(Sampler, inTexCoord).r, 0.0f, 0.0f, 1.0f); -} - -uint4 PS_PassthroughR2DUI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint2 size; - TextureUI.GetDimensions(size.x, size.y); - - return uint4(TextureUI.Load(int3(size * inTexCoord, 0)).r, 0, 0, 0); -} - -int4 PS_PassthroughR2DI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint2 size; - TextureI.GetDimensions(size.x, size.y); - - return int4(TextureI.Load(int3(size * inTexCoord, 0)).r, 0, 0, 0); -} - -float4 PS_PassthroughLum2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - return float4(TextureF.Sample(Sampler, inTexCoord).rrr, 1.0f); -} - -float4 PS_PassthroughLumAlpha2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - return TextureF.Sample(Sampler, inTexCoord).rrra; -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough3D11.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough3D11.hlsl deleted file mode 100644 index c23c9032ec..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough3D11.hlsl +++ /dev/null @@ -1,146 +0,0 @@ -Texture3D<float4> TextureF : register(t0); -Texture3D<uint4> TextureUI : register(t0); -Texture3D<int4> TextureI : register(t0); - -SamplerState Sampler : register(s0); - -struct VS_INPUT -{ - float2 Position : POSITION; - uint Layer : LAYER; - float3 TexCoord : TEXCOORD; -}; - -struct VS_OUTPUT -{ - float4 Position : SV_POSITION; - uint Layer : LAYER; - float3 TexCoord : TEXCOORD; -}; - -struct GS_OUTPUT -{ - float4 Position : SV_POSITION; - uint Layer : SV_RENDERTARGETARRAYINDEX; - float3 TexCoord : TEXCOORD; -}; - -VS_OUTPUT VS_Passthrough3D(VS_INPUT input) -{ - VS_OUTPUT output; - - output.Position = float4(input.Position, 0.0f, 1.0f); - output.Layer = input.Layer; - output.TexCoord = input.TexCoord; - - return output; -} - -[maxvertexcount(3)] -void GS_Passthrough3D(triangle VS_OUTPUT input[3], inout TriangleStream<GS_OUTPUT> outputStream) -{ - GS_OUTPUT output; - - for (int i = 0; i < 3; i++) - { - output.Position = input[i].Position; - output.Layer = input[i].Layer; - output.TexCoord = input[i].TexCoord; - - outputStream.Append(output); - } -} - -float4 PS_PassthroughRGBA3D(GS_OUTPUT input) : SV_TARGET0 -{ - return TextureF.Sample(Sampler, input.TexCoord).rgba; -} - -uint4 PS_PassthroughRGBA3DUI(GS_OUTPUT input) : SV_TARGET0 -{ - uint3 size; - TextureUI.GetDimensions(size.x, size.y, size.z); - - return TextureUI.Load(int4(size * input.TexCoord, 0)).rgba; -} - -int4 PS_PassthroughRGBA3DI(GS_OUTPUT input) : SV_TARGET0 -{ - uint3 size; - TextureI.GetDimensions(size.x, size.y, size.z); - - return TextureI.Load(int4(size * input.TexCoord, 0)).rgba; -} - -float4 PS_PassthroughRGB3D(GS_OUTPUT input) : SV_TARGET0 -{ - return float4(TextureF.Sample(Sampler, input.TexCoord).rgb, 1.0f); -} - -uint4 PS_PassthroughRGB3DUI(GS_OUTPUT input) : SV_TARGET0 -{ - uint3 size; - TextureUI.GetDimensions(size.x, size.y, size.z); - - return uint4(TextureUI.Load(int4(size * input.TexCoord, 0)).rgb, 0); -} - -int4 PS_PassthroughRGB3DI(GS_OUTPUT input) : SV_TARGET0 -{ - uint3 size; - TextureI.GetDimensions(size.x, size.y, size.z); - - return int4(TextureI.Load(int4(size * input.TexCoord, 0)).rgb, 0); -} - -float4 PS_PassthroughRG3D(GS_OUTPUT input) : SV_TARGET0 -{ - return float4(TextureF.Sample(Sampler, input.TexCoord).rg, 0.0f, 1.0f); -} - -uint4 PS_PassthroughRG3DUI(GS_OUTPUT input) : SV_TARGET0 -{ - uint3 size; - TextureUI.GetDimensions(size.x, size.y, size.z); - - return uint4(TextureUI.Load(int4(size * input.TexCoord, 0)).rg, 0, 0); -} - -int4 PS_PassthroughRG3DI(GS_OUTPUT input) : SV_TARGET0 -{ - uint3 size; - TextureI.GetDimensions(size.x, size.y, size.z); - - return int4(TextureI.Load(int4(size * input.TexCoord, 0)).rg, 0, 0); -} - -float4 PS_PassthroughR3D(GS_OUTPUT input) : SV_TARGET0 -{ - return float4(TextureF.Sample(Sampler, input.TexCoord).r, 0.0f, 0.0f, 1.0f); -} - -uint4 PS_PassthroughR3DUI(GS_OUTPUT input) : SV_TARGET0 -{ - uint3 size; - TextureUI.GetDimensions(size.x, size.y, size.z); - - return uint4(TextureUI.Load(int4(size * input.TexCoord, 0)).r, 0, 0, 0); -} - -int4 PS_PassthroughR3DI(GS_OUTPUT input) : SV_TARGET0 -{ - uint3 size; - TextureI.GetDimensions(size.x, size.y, size.z); - - return int4(TextureI.Load(int4(size * input.TexCoord, 0)).r, 0, 0, 0); -} - -float4 PS_PassthroughLum3D(GS_OUTPUT input) : SV_TARGET0 -{ - return float4(TextureF.Sample(Sampler, input.TexCoord).rrr, 1.0f); -} - -float4 PS_PassthroughLumAlpha3D(GS_OUTPUT input) : SV_TARGET0 -{ - return TextureF.Sample(Sampler, input.TexCoord).rrra; -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/ResolveDepthStencil.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/ResolveDepthStencil.hlsl deleted file mode 100644 index 7dc40d4b6a..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/ResolveDepthStencil.hlsl +++ /dev/null @@ -1,56 +0,0 @@ -static const float2 g_Corners[6] = -{ - float2(-1.0f, 1.0f), - float2( 1.0f, -1.0f), - float2(-1.0f, -1.0f), - float2(-1.0f, 1.0f), - float2( 1.0f, 1.0f), - float2( 1.0f, -1.0f), -}; - -void VS_ResolveDepthStencil(in uint id : SV_VertexID, - out float4 position : SV_Position, - out float2 texCoord : TEXCOORD0) -{ - float2 corner = g_Corners[id]; - position = float4(corner.x, corner.y, 0.0f, 1.0f); - texCoord = float2((corner.x + 1.0f) * 0.5f, (-corner.y + 1.0f) * 0.5f); -} - -Texture2DMS<float> Depth : register(t0); -Texture2DMS<uint2> Stencil : register(t1); - -void PS_ResolveDepth(in float4 position : SV_Position, - in float2 texCoord : TEXCOORD0, - out float depth : SV_Depth) -{ - // MS samplers must use Load - uint width, height, samples; - Depth.GetDimensions(width, height, samples); - uint2 coord = uint2(texCoord.x * float(width), texCoord.y * float(height)); - depth = Depth.Load(coord, 0).r; -} - -void PS_ResolveDepthStencil(in float4 position : SV_Position, - in float2 texCoord : TEXCOORD0, - out float2 depthStencil : SV_Target0) -{ - // MS samplers must use Load - uint width, height, samples; - Depth.GetDimensions(width, height, samples); - uint2 coord = uint2(texCoord.x * float(width), texCoord.y * float(height)); - depthStencil.r = Depth.Load(coord, 0).r; - depthStencil.g = float(Stencil.Load(coord, 0).g); -} - -void PS_ResolveStencil(in float4 position : SV_Position, - in float2 texCoord : TEXCOORD0, - out float2 stencil : SV_Target0) -{ - // MS samplers must use Load - uint width, height, samples; - Stencil.GetDimensions(width, height, samples); - uint2 coord = uint2(texCoord.x * float(width), texCoord.y * float(height)); - stencil.r = 0.0f; - stencil.g = float(Stencil.Load(coord, 0).g); -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Swizzle11.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Swizzle11.hlsl deleted file mode 100644 index 505e222137..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Swizzle11.hlsl +++ /dev/null @@ -1,99 +0,0 @@ -Texture2D<float4> TextureF2D : register(t0); -Texture2D<uint4> TextureUI2D : register(t0); -Texture2D<int4> TextureI2D : register(t0); - -Texture3D<float4> TextureF3D : register(t0); -Texture3D<uint4> TextureUI3D : register(t0); -Texture3D<int4> TextureI3D : register(t0); - -Texture2DArray<float4> TextureF2DArray : register(t0); -Texture2DArray<uint4> TextureUI2DArray : register(t0); -Texture2DArray<int4> TextureI2DArray : register(t0); - -SamplerState Sampler : register(s0); - -cbuffer SwizzleProperties : register(b0) -{ - uint4 SwizzleIndices : packoffset(c0); -} - -float4 SwizzleLookup(in float4 sample) -{ - float lookup[6] = { sample[0], sample[1], sample[2], sample[3], 0.0f, 1.0f }; - return float4(lookup[SwizzleIndices[0]], lookup[SwizzleIndices[1]], lookup[SwizzleIndices[2]], lookup[SwizzleIndices[3]]); -} - -int4 SwizzleLookup(in int4 sample) -{ - int lookup[6] = { sample[0], sample[1], sample[2], sample[3], 0.0f, 1.0f }; - return int4(lookup[SwizzleIndices[0]], lookup[SwizzleIndices[1]], lookup[SwizzleIndices[2]], lookup[SwizzleIndices[3]]); -} - -uint4 SwizzleLookup(in uint4 sample) -{ - uint lookup[6] = { sample[0], sample[1], sample[2], sample[3], 0.0f, 1.0f }; - return uint4(lookup[SwizzleIndices[0]], lookup[SwizzleIndices[1]], lookup[SwizzleIndices[2]], lookup[SwizzleIndices[3]]); -} - -float4 PS_SwizzleF2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - return SwizzleLookup(TextureF2D.Sample(Sampler, inTexCoord)); -} - -int4 PS_SwizzleI2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint2 size; - TextureI2D.GetDimensions(size.x, size.y); - - return SwizzleLookup(TextureI2D.Load(int3(size * inTexCoord, 0))); -} - -uint4 PS_SwizzleUI2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint2 size; - TextureUI2D.GetDimensions(size.x, size.y); - - return SwizzleLookup(TextureUI2D.Load(int3(size * inTexCoord, 0))); -} - -float4 PS_SwizzleF3D(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - return SwizzleLookup(TextureF3D.Sample(Sampler, inTexCoord)); -} - -int4 PS_SwizzleI3D(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint3 size; - TextureI3D.GetDimensions(size.x, size.y, size.z); - - return SwizzleLookup(TextureI3D.Load(int4(size * inTexCoord, 0))); -} - -uint4 PS_SwizzleUI3D(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint3 size; - TextureUI3D.GetDimensions(size.x, size.y, size.z); - - return SwizzleLookup(TextureUI3D.Load(int4(size * inTexCoord, 0))); -} - -float4 PS_SwizzleF2DArray(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - return SwizzleLookup(TextureF2DArray.Sample(Sampler, float3(inTexCoord.xy, inLayer))); -} - -int4 PS_SwizzleI2DArray(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint3 size; - TextureI2DArray.GetDimensions(size.x, size.y, size.z); - - return SwizzleLookup(TextureI2DArray.Load(int4(size.xy * inTexCoord.xy, inLayer, 0))); -} - -uint4 PS_SwizzleUI2DArray(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0 -{ - uint3 size; - TextureUI2DArray.GetDimensions(size.x, size.y, size.z); - - return SwizzleLookup(TextureUI2DArray.Load(int4(size.xy * inTexCoord.xy, inLayer, 0))); -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h deleted file mode 100644 index a5cccdc98e..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h +++ /dev/null @@ -1,155 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 10.1 -// -// -// Resource Bindings: -// -// Name Type Format Dim HLSL Bind Count -// ------------------------------ ---------- ------- ----------- -------------- ------ -// TextureF_MS texture float4 2dMS t0 1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_POSITION 0 xyzw 0 POS float -// TEXCORD 0 xy 1 NONE float xy -// SV_SAMPLEINDEX 0 x 2 SAMPLE uint x -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_TARGET 0 xyzw 0 TARGET float xyzw -// -// Pixel Shader runs at sample frequency -// -ps_4_1 -dcl_globalFlags refactoringAllowed -dcl_resource_texture2dms(0) (float,float,float,float) t0 -dcl_input_ps linear v1.xy -dcl_input_ps_sgv constant v2.x, sampleIndex -dcl_output o0.xyzw -dcl_temps 1 -ftou r0.xy, v1.xyxx -mov r0.zw, l(0,0,0,0) -ldms o0.xyzw, r0.xyzw, t0.xyzw, v2.x -ret -// Approximately 4 instruction slots used -#endif - -const BYTE g_PS_PassthroughRGBA2DMS[] = -{ - 68, 88, 66, 67, 206, 115, - 73, 27, 160, 237, 59, 223, - 179, 180, 28, 146, 74, 174, - 29, 197, 1, 0, 0, 0, - 136, 2, 0, 0, 5, 0, - 0, 0, 52, 0, 0, 0, - 172, 0, 0, 0, 40, 1, - 0, 0, 92, 1, 0, 0, - 12, 2, 0, 0, 82, 68, - 69, 70, 112, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 28, 0, 0, 0, 1, 4, - 255, 255, 0, 1, 0, 0, - 72, 0, 0, 0, 60, 0, - 0, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 13, 0, 0, 0, - 84, 101, 120, 116, 117, 114, - 101, 70, 95, 77, 83, 0, - 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, - 32, 83, 104, 97, 100, 101, - 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 49, - 48, 46, 49, 0, 73, 83, - 71, 78, 116, 0, 0, 0, - 3, 0, 0, 0, 8, 0, - 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 92, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 3, 3, - 0, 0, 100, 0, 0, 0, - 0, 0, 0, 0, 10, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 1, 1, - 0, 0, 83, 86, 95, 80, - 79, 83, 73, 84, 73, 79, - 78, 0, 84, 69, 88, 67, - 79, 82, 68, 0, 83, 86, - 95, 83, 65, 77, 80, 76, - 69, 73, 78, 68, 69, 88, - 0, 171, 79, 83, 71, 78, - 44, 0, 0, 0, 1, 0, - 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 83, 86, 95, 84, 65, 82, - 71, 69, 84, 0, 171, 171, - 83, 72, 68, 82, 168, 0, - 0, 0, 65, 0, 0, 0, - 42, 0, 0, 0, 106, 8, - 0, 1, 88, 32, 0, 4, - 0, 112, 16, 0, 0, 0, - 0, 0, 85, 85, 0, 0, - 98, 16, 0, 3, 50, 16, - 16, 0, 1, 0, 0, 0, - 99, 8, 0, 4, 18, 16, - 16, 0, 2, 0, 0, 0, - 10, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 0, 0, 0, 0, 104, 0, - 0, 2, 1, 0, 0, 0, - 28, 0, 0, 5, 50, 0, - 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 1, 0, - 0, 0, 54, 0, 0, 8, - 194, 0, 16, 0, 0, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 46, 0, - 0, 9, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 0, 0, - 0, 0, 10, 16, 16, 0, - 2, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 116, 0, 0, 0, 4, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0 -}; diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json deleted file mode 100644 index 61cd44a62b..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json +++ /dev/null @@ -1,523 +0,0 @@ -{ - "NONE": { - }, - "A8_UNORM": { - "texFormat": "DXGI_FORMAT_A8_UNORM", - "srvFormat": "DXGI_FORMAT_A8_UNORM", - "rtvFormat": "DXGI_FORMAT_A8_UNORM", - "channels": "a", - "componentType": "unorm", - "bits": { "alpha": 8 }, - "supportTest": "OnlyFL10Plus(deviceCaps)", - "fallbackFormat": "R8G8B8A8_UNORM" - }, - "R8G8B8A8_UNORM": { - "texFormat": "DXGI_FORMAT_R8G8B8A8_UNORM", - "srvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM", - "rtvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM", - "channels": "rgba", - "componentType": "unorm", - "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 }, - "glInternalFormat": "GL_RGBA8" - }, - "R16G16B16A16_UNORM": { - "texFormat": "DXGI_FORMAT_R16G16B16A16_UNORM", - "srvFormat": "DXGI_FORMAT_R16G16B16A16_UNORM", - "rtvFormat": "DXGI_FORMAT_R16G16B16A16_UNORM", - "channels": "rgba", - "componentType": "unorm", - "bits": { "red": 16, "green": 16, "blue": 16, "alpha": 16 }, - "glInternalFormat": "GL_RGBA16_EXT" - }, - "R16G16B16A16_FLOAT": { - "texFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT", - "srvFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT", - "rtvFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT", - "channels": "rgba", - "componentType": "float", - "bits": { "red": 16, "green": 16, "blue": 16, "alpha": 16 }, - "glInternalFormat": "GL_RGBA16F" - }, - "R32G32B32A32_FLOAT": { - "texFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT", - "srvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT", - "rtvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT", - "channels": "rgba", - "componentType": "float", - "bits": { "red": 32, "green": 32, "blue": 32, "alpha": 32 }, - "glInternalFormat": "GL_RGBA32F" - }, - "B8G8R8A8_UNORM": { - "texFormat": "DXGI_FORMAT_B8G8R8A8_UNORM", - "srvFormat": "DXGI_FORMAT_B8G8R8A8_UNORM", - "rtvFormat": "DXGI_FORMAT_B8G8R8A8_UNORM", - "channels": "bgra", - "componentType": "unorm", - "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 }, - "glInternalFormat": "GL_BGRA8_EXT" - }, - "B8G8R8A8_UNORM_SRGB": { - "texFormat": "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB", - "srvFormat": "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB", - "rtvFormat": "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB", - "channels": "bgra", - "componentType": "unorm", - "bits": {"red": 8, "green": 8, "blue": 8,"alpha": 8}, - "siwzzleFormat": "GL_RGBA8" - }, - "BC1_RGBA_UNORM_BLOCK": { - "texFormat": "DXGI_FORMAT_BC1_UNORM", - "srvFormat": "DXGI_FORMAT_BC1_UNORM", - "channels": "rgba", - "componentType": "unorm", - "swizzleFormat": "GL_RGBA8" - }, - "BC1_RGB_UNORM_BLOCK": { - "texFormat": "DXGI_FORMAT_BC1_UNORM", - "srvFormat": "DXGI_FORMAT_BC1_UNORM", - "channels": "rgba", - "componentType": "unorm", - "swizzleFormat": "GL_RGBA8" - }, - "BC2_RGBA_UNORM_BLOCK": { - "texFormat": "DXGI_FORMAT_BC2_UNORM", - "srvFormat": "DXGI_FORMAT_BC2_UNORM", - "channels": "rgba", - "componentType": "unorm", - "swizzleFormat": "GL_RGBA8" - }, - "BC3_RGBA_UNORM_BLOCK": { - "texFormat": "DXGI_FORMAT_BC3_UNORM", - "srvFormat": "DXGI_FORMAT_BC3_UNORM", - "channels": "rgba", - "componentType": "unorm", - "swizzleFormat": "GL_RGBA8" - }, - "BC1_RGBA_UNORM_SRGB_BLOCK": { - "texFormat": "DXGI_FORMAT_BC1_UNORM_SRGB", - "srvFormat": "DXGI_FORMAT_BC1_UNORM_SRGB", - "channels": "rgba", - "componentType": "unorm", - "swizzleFormat": "GL_RGBA8" - }, - "BC1_RGB_UNORM_SRGB_BLOCK": { - "texFormat": "DXGI_FORMAT_BC1_UNORM_SRGB", - "srvFormat": "DXGI_FORMAT_BC1_UNORM_SRGB", - "channels": "rgba", - "componentType": "unorm", - "swizzleFormat": "GL_RGBA8" - }, - "BC2_RGBA_UNORM_SRGB_BLOCK": { - "texFormat": "DXGI_FORMAT_BC2_UNORM_SRGB", - "srvFormat": "DXGI_FORMAT_BC2_UNORM_SRGB", - "channels": "rgba", - "componentType": "unorm", - "swizzleFormat": "GL_RGBA8" - }, - "BC3_RGBA_UNORM_SRGB_BLOCK": { - "texFormat": "DXGI_FORMAT_BC3_UNORM_SRGB", - "srvFormat": "DXGI_FORMAT_BC3_UNORM_SRGB", - "channels": "rgba", - "componentType": "unorm", - "swizzleFormat": "GL_RGBA8" - }, - "D24_UNORM_S8_UINT": { - "FL10Plus": { - "texFormat": "DXGI_FORMAT_R24G8_TYPELESS", - "srvFormat": "DXGI_FORMAT_R24_UNORM_X8_TYPELESS" - }, - "FL9_3": { - "texFormat": "DXGI_FORMAT_D24_UNORM_S8_UINT" - }, - "dsvFormat": "DXGI_FORMAT_D24_UNORM_S8_UINT", - "channels": "ds", - "bits": { "depth": 24, "stencil": 8 }, - "glInternalFormat": "GL_DEPTH24_STENCIL8_OES" - }, - "D32_FLOAT_S8X24_UINT": { - "texFormat": "DXGI_FORMAT_R32G8X24_TYPELESS", - "srvFormat": "DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS", - "dsvFormat": "DXGI_FORMAT_D32_FLOAT_S8X24_UINT", - "channels": "ds", - "bits": { "depth": 32, "stencil": 8 }, - "glInternalFormat": "GL_DEPTH32F_STENCIL8" - }, - "D16_UNORM": { - "FL10Plus": { - "texFormat": "DXGI_FORMAT_R16_TYPELESS", - "srvFormat": "DXGI_FORMAT_R16_UNORM" - }, - "FL9_3": { - "texFormat": "DXGI_FORMAT_D16_UNORM" - }, - "dsvFormat": "DXGI_FORMAT_D16_UNORM", - "channels": "d", - "componentType": "unorm", - "bits": { "depth": 16 }, - "glInternalFormat": "GL_DEPTH_COMPONENT16" - }, - "D32_FLOAT": { - "texFormat": "DXGI_FORMAT_R32_TYPELESS", - "srvFormat": "DXGI_FORMAT_R32_FLOAT", - "dsvFormat": "DXGI_FORMAT_D32_FLOAT", - "channels": "d", - "componentType": "float", - "bits": { "depth": 32 }, - "glInternalFormat": "GL_DEPTH_COMPONENT32F" - }, - "R11G11B10_FLOAT": { - "texFormat": "DXGI_FORMAT_R11G11B10_FLOAT", - "srvFormat": "DXGI_FORMAT_R11G11B10_FLOAT", - "rtvFormat": "DXGI_FORMAT_R11G11B10_FLOAT", - "channels": "rgb", - "componentType": "float", - "bits": { "red": 11, "green": 11, "blue": 10 }, - "glInternalFormat": "GL_R11F_G11F_B10F" - }, - "R16_FLOAT": { - "texFormat": "DXGI_FORMAT_R16_FLOAT", - "srvFormat": "DXGI_FORMAT_R16_FLOAT", - "rtvFormat": "DXGI_FORMAT_R16_FLOAT", - "channels": "r", - "componentType": "float", - "bits": { "red": 16 }, - "glInternalFormat": "GL_R16F" - }, - "R16_SINT": { - "texFormat": "DXGI_FORMAT_R16_SINT", - "srvFormat": "DXGI_FORMAT_R16_SINT", - "rtvFormat": "DXGI_FORMAT_R16_SINT", - "channels": "r", - "componentType": "int", - "bits": { "red": 16 }, - "glInternalFormat": "GL_R16I" - }, - "R16_UINT": { - "texFormat": "DXGI_FORMAT_R16_UINT", - "srvFormat": "DXGI_FORMAT_R16_UINT", - "rtvFormat": "DXGI_FORMAT_R16_UINT", - "channels": "r", - "componentType": "uint", - "bits": { "red": 16 }, - "glInternalFormat": "GL_R16UI" - }, - "R32_FLOAT": { - "texFormat": "DXGI_FORMAT_R32_FLOAT", - "srvFormat": "DXGI_FORMAT_R32_FLOAT", - "rtvFormat": "DXGI_FORMAT_R32_FLOAT", - "channels": "r", - "componentType": "float", - "bits": { "red": 32 }, - "glInternalFormat": "GL_R32F" - }, - "R32_SINT": { - "texFormat": "DXGI_FORMAT_R32_SINT", - "srvFormat": "DXGI_FORMAT_R32_SINT", - "rtvFormat": "DXGI_FORMAT_R32_SINT", - "channels": "r", - "componentType": "int", - "bits": { "red": 32 }, - "glInternalFormat": "GL_R32I" - }, - "R32_UINT": { - "texFormat": "DXGI_FORMAT_R32_UINT", - "srvFormat": "DXGI_FORMAT_R32_UINT", - "rtvFormat": "DXGI_FORMAT_R32_UINT", - "channels": "r", - "componentType": "uint", - "bits": { "red": 32 }, - "glInternalFormat": "GL_R32UI" - }, - "R8_UNORM": { - "texFormat": "DXGI_FORMAT_R8_UNORM", - "srvFormat": "DXGI_FORMAT_R8_UNORM", - "rtvFormat": "DXGI_FORMAT_R8_UNORM", - "channels": "r", - "componentType": "unorm", - "bits": { "red": 8 }, - "glInternalFormat": "GL_R8" - }, - "R8_SINT": { - "texFormat": "DXGI_FORMAT_R8_SINT", - "srvFormat": "DXGI_FORMAT_R8_SINT", - "rtvFormat": "DXGI_FORMAT_R8_SINT", - "channels": "r", - "componentType": "int", - "bits": { "red": 8 }, - "glInternalFormat": "GL_R8I" - }, - "R8_UINT": { - "texFormat": "DXGI_FORMAT_R8_UINT", - "srvFormat": "DXGI_FORMAT_R8_UINT", - "rtvFormat": "DXGI_FORMAT_R8_UINT", - "channels": "r", - "componentType": "uint", - "bits": { "red": 8 }, - "glInternalFormat": "GL_R8UI" - }, - "R8_SNORM": { - "texFormat": "DXGI_FORMAT_R8_SNORM", - "srvFormat": "DXGI_FORMAT_R8_SNORM", - "channels": "r", - "componentType": "snorm", - "bits": { "red": 8 }, - "glInternalFormat": "GL_R8_SNORM" - }, - "R16G16_FLOAT": { - "texFormat": "DXGI_FORMAT_R16G16_FLOAT", - "srvFormat": "DXGI_FORMAT_R16G16_FLOAT", - "rtvFormat": "DXGI_FORMAT_R16G16_FLOAT", - "channels": "rg", - "componentType": "float", - "bits": { "red": 16, "green": 16 }, - "glInternalFormat": "GL_RG16F" - }, - "R16G16_SINT": { - "texFormat": "DXGI_FORMAT_R16G16_SINT", - "srvFormat": "DXGI_FORMAT_R16G16_SINT", - "rtvFormat": "DXGI_FORMAT_R16G16_SINT", - "channels": "rg", - "componentType": "int", - "bits": { "red": 16, "green": 16 }, - "glInternalFormat": "GL_RG16I" - }, - "R16G16_UINT": { - "texFormat": "DXGI_FORMAT_R16G16_UINT", - "srvFormat": "DXGI_FORMAT_R16G16_UINT", - "rtvFormat": "DXGI_FORMAT_R16G16_UINT", - "channels": "rg", - "componentType": "uint", - "bits": { "red": 16, "green": 16 }, - "glInternalFormat": "GL_RG16UI" - }, - "R32G32_FLOAT": { - "texFormat": "DXGI_FORMAT_R32G32_FLOAT", - "srvFormat": "DXGI_FORMAT_R32G32_FLOAT", - "rtvFormat": "DXGI_FORMAT_R32G32_FLOAT", - "channels": "rg", - "componentType": "float", - "bits": { "red": 32, "green": 32 }, - "glInternalFormat": "GL_RG32F" - }, - "R32G32_SINT": { - "texFormat": "DXGI_FORMAT_R32G32_SINT", - "srvFormat": "DXGI_FORMAT_R32G32_SINT", - "rtvFormat": "DXGI_FORMAT_R32G32_SINT", - "channels": "rg", - "componentType": "int", - "bits": { "red": 32, "green": 32 }, - "glInternalFormat": "GL_RG32I" - }, - "R32G32_UINT": { - "texFormat": "DXGI_FORMAT_R32G32_UINT", - "srvFormat": "DXGI_FORMAT_R32G32_UINT", - "rtvFormat": "DXGI_FORMAT_R32G32_UINT", - "channels": "rg", - "componentType": "uint", - "bits": { "red": 32, "green": 32 }, - "glInternalFormat": "GL_RG32UI" - }, - "R8G8_UNORM": { - "texFormat": "DXGI_FORMAT_R8G8_UNORM", - "srvFormat": "DXGI_FORMAT_R8G8_UNORM", - "rtvFormat": "DXGI_FORMAT_R8G8_UNORM", - "channels": "rg", - "componentType": "unorm", - "bits": { "red": 8, "green": 8 }, - "glInternalFormat": "GL_RG8" - }, - "R8G8_SINT": { - "texFormat": "DXGI_FORMAT_R8G8_SINT", - "srvFormat": "DXGI_FORMAT_R8G8_SINT", - "rtvFormat": "DXGI_FORMAT_R8G8_SINT", - "channels": "rg", - "componentType": "int", - "bits": { "red": 8, "green": 8 }, - "glInternalFormat": "GL_RG8I" - }, - "R8G8_UINT": { - "texFormat": "DXGI_FORMAT_R8G8_UINT", - "srvFormat": "DXGI_FORMAT_R8G8_UINT", - "rtvFormat": "DXGI_FORMAT_R8G8_UINT", - "channels": "rg", - "componentType": "uint", - "bits": { "red": 8, "green": 8 }, - "glInternalFormat": "GL_RG8UI" - }, - "R8G8_SNORM": { - "texFormat": "DXGI_FORMAT_R8G8_SNORM", - "srvFormat": "DXGI_FORMAT_R8G8_SNORM", - "channels": "rg", - "componentType": "snorm", - "bits": { "red": 8, "green": 8 }, - "glInternalFormat": "GL_RG8_SNORM" - }, - "R10G10B10A2_UNORM": { - "texFormat": "DXGI_FORMAT_R10G10B10A2_UNORM", - "srvFormat": "DXGI_FORMAT_R10G10B10A2_UNORM", - "rtvFormat": "DXGI_FORMAT_R10G10B10A2_UNORM", - "channels": "rgba", - "componentType": "unorm", - "bits": { "red": 10, "green": 10, "blue": 10, "alpha": 2 }, - "glInternalFormat": "GL_RGB10_A2" - }, - "R10G10B10A2_UINT": { - "texFormat": "DXGI_FORMAT_R10G10B10A2_UINT", - "srvFormat": "DXGI_FORMAT_R10G10B10A2_UINT", - "rtvFormat": "DXGI_FORMAT_R10G10B10A2_UINT", - "channels": "rgba", - "componentType": "uint", - "bits": { "red": 10, "green": 10, "blue": 10, "alpha": 2 }, - "glInternalFormat": "GL_RGB10_A2UI" - }, - "R16G16B16A16_SINT": { - "texFormat": "DXGI_FORMAT_R16G16B16A16_SINT", - "srvFormat": "DXGI_FORMAT_R16G16B16A16_SINT", - "rtvFormat": "DXGI_FORMAT_R16G16B16A16_SINT", - "channels": "rgba", - "componentType": "int", - "bits": { "red": 16, "green": 16, "blue": 16, "alpha": 16 }, - "glInternalFormat": "GL_RGBA16I" - }, - "R16G16B16A16_UINT": { - "texFormat": "DXGI_FORMAT_R16G16B16A16_UINT", - "srvFormat": "DXGI_FORMAT_R16G16B16A16_UINT", - "rtvFormat": "DXGI_FORMAT_R16G16B16A16_UINT", - "channels": "rgba", - "componentType": "uint", - "bits": { "red": 16, "green": 16, "blue": 16, "alpha": 16 }, - "glInternalFormat": "GL_RGBA16UI" - }, - "R32G32B32A32_SINT": { - "texFormat": "DXGI_FORMAT_R32G32B32A32_SINT", - "srvFormat": "DXGI_FORMAT_R32G32B32A32_SINT", - "rtvFormat": "DXGI_FORMAT_R32G32B32A32_SINT", - "channels": "rgba", - "componentType": "int", - "bits": { "red": 32, "green": 32, "blue": 32, "alpha": 32 }, - "glInternalFormat": "GL_RGBA32I" - }, - "R32G32B32A32_UINT": { - "texFormat": "DXGI_FORMAT_R32G32B32A32_UINT", - "srvFormat": "DXGI_FORMAT_R32G32B32A32_UINT", - "rtvFormat": "DXGI_FORMAT_R32G32B32A32_UINT", - "channels": "rgba", - "componentType": "uint", - "bits": { "red": 32, "green": 32, "blue": 32, "alpha": 32 }, - "glInternalFormat": "GL_RGBA32UI" - }, - "B5G6R5_UNORM": { - "texFormat": "DXGI_FORMAT_B5G6R5_UNORM", - "srvFormat": "DXGI_FORMAT_B5G6R5_UNORM", - "rtvFormat": "DXGI_FORMAT_B5G6R5_UNORM", - "channels": "bgr", - "componentType": "unorm", - "bits": { "red": 5, "green": 6, "blue": 5 }, - "supportTest": "SupportsFormat(DXGI_FORMAT_B5G6R5_UNORM, deviceCaps)", - "fallbackFormat": "R8G8B8A8_UNORM" - }, - "B5G5R5A1_UNORM": { - "texFormat": "DXGI_FORMAT_B5G5R5A1_UNORM", - "srvFormat": "DXGI_FORMAT_B5G5R5A1_UNORM", - "rtvFormat": "DXGI_FORMAT_B5G5R5A1_UNORM", - "channels": "bgra", - "componentType": "unorm", - "bits": { "red": 5, "green": 5, "blue": 5, "alpha": 1 }, - "supportTest": "SupportsFormat(DXGI_FORMAT_B5G5R5A1_UNORM, deviceCaps)", - "fallbackFormat": "R8G8B8A8_UNORM" - }, - "R8G8B8A8_SINT": { - "texFormat": "DXGI_FORMAT_R8G8B8A8_SINT", - "srvFormat": "DXGI_FORMAT_R8G8B8A8_SINT", - "rtvFormat": "DXGI_FORMAT_R8G8B8A8_SINT", - "channels": "rgba", - "componentType": "int", - "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 }, - "glInternalFormat": "GL_RGBA8I" - }, - "R8G8B8A8_UINT": { - "texFormat": "DXGI_FORMAT_R8G8B8A8_UINT", - "srvFormat": "DXGI_FORMAT_R8G8B8A8_UINT", - "rtvFormat": "DXGI_FORMAT_R8G8B8A8_UINT", - "channels": "rgba", - "componentType": "uint", - "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 }, - "glInternalFormat": "GL_RGBA8UI" - }, - "R8G8B8A8_SNORM": { - "texFormat": "DXGI_FORMAT_R8G8B8A8_SNORM", - "srvFormat": "DXGI_FORMAT_R8G8B8A8_SNORM", - "channels": "rgba", - "componentType": "snorm", - "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 }, - "glInternalFormat": "GL_RGBA8_SNORM" - }, - "R9G9B9E5_SHAREDEXP": { - "texFormat": "DXGI_FORMAT_R9G9B9E5_SHAREDEXP", - "srvFormat": "DXGI_FORMAT_R9G9B9E5_SHAREDEXP", - "channels": "rgb", - "componentType": "float", - "bits": { "red": 9, "green": 9, "blue": 9, "shared": 5 } - }, - "B4G4R4A4_UNORM": { - "texFormat": "DXGI_FORMAT_B4G4R4A4_UNORM", - "srvFormat": "DXGI_FORMAT_B4G4R4A4_UNORM", - "rtvFormat": "DXGI_FORMAT_B4G4R4A4_UNORM", - "channels": "bgra", - "componentType": "unorm", - "bits": { "red": 4, "green": 4, "blue": 4, "alpha": 4 }, - "supportTest": "SupportsFormat(DXGI_FORMAT_B4G4R4A4_UNORM, deviceCaps)", - "fallbackFormat": "R8G8B8A8_UNORM" - }, - "R8G8B8A8_UNORM_SRGB": { - "texFormat": "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB", - "srvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB", - "rtvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB", - "channels": "rgba", - "componentType": "unorm", - "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 }, - "glInternalFormat": "GL_SRGB8_ALPHA8" - }, - "R16_UNORM": { - "texFormat": "DXGI_FORMAT_R16_UNORM", - "srvFormat": "DXGI_FORMAT_R16_UNORM", - "rtvFormat": "DXGI_FORMAT_R16_UNORM", - "channels": "r", - "componentType": "unorm", - "bits": { "red": 16 }, - "glInternalFormat": "GL_R16_EXT" - }, - "R16G16_UNORM": { - "texFormat": "DXGI_FORMAT_R16G16_UNORM", - "srvFormat": "DXGI_FORMAT_R16G16_UNORM", - "rtvFormat": "DXGI_FORMAT_R16G16_UNORM", - "channels": "rg", - "componentType": "unorm", - "bits": { "red": 16, "green": 16 }, - "glInternalFormat": "GL_RG16_EXT" - }, - "R16_SNORM": { - "texFormat": "DXGI_FORMAT_R16_SNORM", - "srvFormat": "DXGI_FORMAT_R16_SNORM", - "channels": "r", - "componentType": "snorm", - "bits": { "red": 16 }, - "glInternalFormat": "GL_R16_SNORM_EXT" - }, - "R16G16_SNORM": { - "texFormat": "DXGI_FORMAT_R16G16_SNORM", - "srvFormat": "DXGI_FORMAT_R16G16_SNORM", - "channels": "rg", - "componentType": "snorm", - "bits": { "red": 16, "green": 16 }, - "glInternalFormat": "GL_RG16_SNORM_EXT" - }, - "R16G16B16A16_SNORM": { - "texFormat": "DXGI_FORMAT_R16G16B16A16_SNORM", - "srvFormat": "DXGI_FORMAT_R16G16B16A16_SNORM", - "channels": "rgba", - "componentType": "snorm", - "bits": { "red": 16, "green": 16, "blue": 16, "alpha": 16 }, - "glInternalFormat": "GL_RGBA16_SNORM_EXT" - } -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_map.json b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_map.json deleted file mode 100644 index 3ef2355645..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_map.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "GL_ALPHA16F_EXT": "R16G16B16A16_FLOAT", - "GL_ALPHA32F_EXT": "R32G32B32A32_FLOAT", - "GL_BGR5_A1_ANGLEX": "B8G8R8A8_UNORM", - "GL_BGRA4_ANGLEX": "B8G8R8A8_UNORM", - "GL_BGRA8_SRGB_ANGLEX": "B8G8R8A8_UNORM_SRGB", - "GL_COMPRESSED_R11_EAC": "R8_UNORM", - "GL_COMPRESSED_RG11_EAC": "R8G8_UNORM", - "GL_COMPRESSED_RGB8_ETC2": "R8G8B8A8_UNORM", - "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2": "R8G8B8A8_UNORM", - "GL_COMPRESSED_RGBA8_ETC2_EAC": "R8G8B8A8_UNORM", - "GL_COMPRESSED_RGBA_ASTC_4x4_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_5x4_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_5x5_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_6x5_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_6x6_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_8x5_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_8x6_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_8x8_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_10x5_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_10x6_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_10x8_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_10x10_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_12x10_KHR": "NONE", - "GL_COMPRESSED_RGBA_ASTC_12x12_KHR": "NONE", - "GL_COMPRESSED_SIGNED_R11_EAC": "R8_SNORM", - "GL_COMPRESSED_SIGNED_RG11_EAC": "R8G8_SNORM", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR": "NONE", - "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC": "R8G8B8A8_UNORM_SRGB", - "GL_COMPRESSED_SRGB8_ETC2": "R8G8B8A8_UNORM_SRGB", - "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2": "R8G8B8A8_UNORM_SRGB", - "GL_DEPTH_COMPONENT24": "D24_UNORM_S8_UINT", - "GL_DEPTH_COMPONENT32_OES": "D24_UNORM_S8_UINT", - "GL_ETC1_RGB8_OES": "R8G8B8A8_UNORM", - "GL_ETC1_RGB8_LOSSY_DECODE_ANGLE": "BC1_RGB_UNORM_BLOCK", - "GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE": "BC1_RGB_UNORM_BLOCK", - "GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE": "BC1_RGB_UNORM_SRGB_BLOCK", - "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE": "BC1_RGBA_UNORM_BLOCK", - "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE": "BC1_RGBA_UNORM_SRGB_BLOCK", - "GL_LUMINANCE16F_EXT": "R16G16B16A16_FLOAT", - "GL_LUMINANCE32F_EXT": "R32G32B32A32_FLOAT", - "GL_LUMINANCE8_ALPHA8_EXT": "R8G8B8A8_UNORM", - "GL_LUMINANCE8_EXT": "R8G8B8A8_UNORM", - "GL_LUMINANCE_ALPHA16F_EXT": "R16G16B16A16_FLOAT", - "GL_LUMINANCE_ALPHA32F_EXT": "R32G32B32A32_FLOAT", - "GL_RGB": "R8G8B8A8_UNORM", - "GL_RGB16F": "R16G16B16A16_FLOAT", - "GL_RGB16I": "R16G16B16A16_SINT", - "GL_RGB16UI": "R16G16B16A16_UINT", - "GL_RGB565": "B5G6R5_UNORM", - "GL_RGB5_A1": "B5G5R5A1_UNORM", - "GL_RGB8": "R8G8B8A8_UNORM", - "GL_RGB8I": "R8G8B8A8_SINT", - "GL_RGB8UI": "R8G8B8A8_UINT", - "GL_RGB8_SNORM": "R8G8B8A8_SNORM", - "GL_RGBA4": "B4G4R4A4_UNORM", - "GL_SRGB8": "R8G8B8A8_UNORM_SRGB", - "GL_STENCIL_INDEX8": "D24_UNORM_S8_UINT", - "GL_RGB16_EXT": "R16G16B16A16_UNORM", - "GL_RGBA16_EXT": "R16G16B16A16_UNORM", - "GL_RGB16_SNORM_EXT": "R16G16B16A16_SNORM", - "GL_RGB32F": "R32G32B32A32_FLOAT", - "GL_RGB32I": "R32G32B32A32_SINT", - "GL_RGB32UI": "R32G32B32A32_UINT" -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.cpp deleted file mode 100644 index a9dfec56b8..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// -// Copyright 2016 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. -// -// Helper routines for the D3D11 texture format table. - -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" - -#include "libANGLE/renderer/load_functions_table.h" - -namespace rx -{ - -namespace d3d11 -{ - -const Format &Format::getSwizzleFormat(const Renderer11DeviceCaps &deviceCaps) const -{ - return (swizzleFormat == internalFormat ? *this : Format::Get(swizzleFormat, deviceCaps)); -} - -LoadFunctionMap Format::getLoadFunctions() const -{ - return GetLoadFunctionsMap(internalFormat, formatID); -} - -const angle::Format &Format::format() const -{ - return angle::Format::Get(formatID); -} - -} // namespace d3d11 - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h deleted file mode 100644 index 3efcb81adb..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h +++ /dev/null @@ -1,105 +0,0 @@ -// -// Copyright 2015 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. -// -// texture_format_table: -// Queries for full textureFormat information based on internalFormat -// - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_TEXTUREFORMATTABLE_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_TEXTUREFORMATTABLE_H_ - -#include <map> - -#include "common/angleutils.h" -#include "common/platform.h" -#include "libANGLE/renderer/Format.h" -#include "libANGLE/renderer/renderer_utils.h" -#include "libANGLE/renderer/d3d/formatutilsD3D.h" - -namespace rx -{ - -struct Renderer11DeviceCaps; - -namespace d3d11 -{ - -// For sized GL internal formats, there are several possible corresponding D3D11 formats depending -// on device capabilities. -// This structure allows querying for the DXGI texture formats to use for textures, SRVs, RTVs and -// DSVs given a GL internal format. -struct Format final : private angle::NonCopyable -{ - constexpr Format(); - constexpr Format(GLenum internalFormat, - angle::Format::ID formatID, - DXGI_FORMAT texFormat, - DXGI_FORMAT srvFormat, - DXGI_FORMAT rtvFormat, - DXGI_FORMAT dsvFormat, - DXGI_FORMAT blitSRVFormat, - GLenum swizzleFormat, - InitializeTextureDataFunction internalFormatInitializer); - - static const Format &Get(GLenum internalFormat, const Renderer11DeviceCaps &deviceCaps); - - const Format &getSwizzleFormat(const Renderer11DeviceCaps &deviceCaps) const; - LoadFunctionMap getLoadFunctions() const; - const angle::Format &format() const; - - GLenum internalFormat; - angle::Format::ID formatID; - - DXGI_FORMAT texFormat; - DXGI_FORMAT srvFormat; - DXGI_FORMAT rtvFormat; - DXGI_FORMAT dsvFormat; - - DXGI_FORMAT blitSRVFormat; - - GLenum swizzleFormat; - - InitializeTextureDataFunction dataInitializerFunction; -}; - -constexpr Format::Format() - : internalFormat(GL_NONE), - formatID(angle::Format::ID::NONE), - texFormat(DXGI_FORMAT_UNKNOWN), - srvFormat(DXGI_FORMAT_UNKNOWN), - rtvFormat(DXGI_FORMAT_UNKNOWN), - dsvFormat(DXGI_FORMAT_UNKNOWN), - blitSRVFormat(DXGI_FORMAT_UNKNOWN), - swizzleFormat(GL_NONE), - dataInitializerFunction(nullptr) -{ -} - -constexpr Format::Format(GLenum internalFormat, - angle::Format::ID formatID, - DXGI_FORMAT texFormat, - DXGI_FORMAT srvFormat, - DXGI_FORMAT rtvFormat, - DXGI_FORMAT dsvFormat, - DXGI_FORMAT blitSRVFormat, - GLenum swizzleFormat, - InitializeTextureDataFunction internalFormatInitializer) - : internalFormat(internalFormat), - formatID(formatID), - texFormat(texFormat), - srvFormat(srvFormat), - rtvFormat(rtvFormat), - dsvFormat(dsvFormat), - blitSRVFormat(blitSRVFormat), - swizzleFormat(swizzleFormat), - dataInitializerFunction(internalFormatInitializer) -{ -} - -} // namespace d3d11 - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_TEXTUREFORMATTABLE_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp deleted file mode 100644 index 3c1c2bcd50..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp +++ /dev/null @@ -1,1938 +0,0 @@ -// GENERATED FILE - DO NOT EDIT. -// Generated by gen_texture_format_table.py using data from texture_format_data.json -// -// Copyright 2017 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. -// -// texture_format_table: -// Queries for full textureFormat information based in internalFormat -// - -#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" - -#include "image_util/copyimage.h" -#include "image_util/generatemip.h" -#include "image_util/loadimage.h" - -#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/texture_format_table_utils.h" - -using namespace angle; - -namespace rx -{ - -namespace d3d11 -{ - -// static -const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &deviceCaps) -{ - // clang-format off - switch (internalFormat) - { - case GL_ALPHA16F_EXT: - { - static constexpr Format info(GL_ALPHA16F_EXT, - angle::Format::ID::R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_FLOAT, - GL_RGBA16F, - nullptr); - return info; - } - case GL_ALPHA32F_EXT: - { - static constexpr Format info(GL_ALPHA32F_EXT, - angle::Format::ID::R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32B32A32_FLOAT, - GL_RGBA32F, - nullptr); - return info; - } - case GL_ALPHA8_EXT: - { - if (OnlyFL10Plus(deviceCaps)) - { - static constexpr Format info(GL_ALPHA8_EXT, - angle::Format::ID::A8_UNORM, - DXGI_FORMAT_A8_UNORM, - DXGI_FORMAT_A8_UNORM, - DXGI_FORMAT_A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_A8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - else - { - static constexpr Format info(GL_ALPHA8_EXT, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - } - case GL_BGR565_ANGLEX: - { - if (SupportsFormat(DXGI_FORMAT_B5G6R5_UNORM, deviceCaps)) - { - static constexpr Format info(GL_BGR565_ANGLEX, - angle::Format::ID::B5G6R5_UNORM, - DXGI_FORMAT_B5G6R5_UNORM, - DXGI_FORMAT_B5G6R5_UNORM, - DXGI_FORMAT_B5G6R5_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_B5G6R5_UNORM, - GL_RGBA8, - nullptr); - return info; - } - else - { - static constexpr Format info(GL_BGR565_ANGLEX, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - } - case GL_BGR5_A1_ANGLEX: - { - static constexpr Format info(GL_BGR5_A1_ANGLEX, - angle::Format::ID::B8G8R8A8_UNORM, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_B8G8R8A8_UNORM, - GL_BGRA8_EXT, - nullptr); - return info; - } - case GL_BGRA4_ANGLEX: - { - static constexpr Format info(GL_BGRA4_ANGLEX, - angle::Format::ID::B8G8R8A8_UNORM, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_B8G8R8A8_UNORM, - GL_BGRA8_EXT, - nullptr); - return info; - } - case GL_BGRA8_EXT: - { - static constexpr Format info(GL_BGRA8_EXT, - angle::Format::ID::B8G8R8A8_UNORM, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_B8G8R8A8_UNORM, - GL_BGRA8_EXT, - nullptr); - return info; - } - case GL_BGRA8_SRGB_ANGLEX: - { - static constexpr Format info(GL_BGRA8_SRGB_ANGLEX, - angle::Format::ID::B8G8R8A8_UNORM_SRGB, - DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, - DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, - DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, - GL_BGRA8_SRGB_ANGLEX, - nullptr); - return info; - } - case GL_COMPRESSED_R11_EAC: - { - static constexpr Format info(GL_COMPRESSED_R11_EAC, - angle::Format::ID::R8_UNORM, - DXGI_FORMAT_R8_UNORM, - DXGI_FORMAT_R8_UNORM, - DXGI_FORMAT_R8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_RG11_EAC: - { - static constexpr Format info(GL_COMPRESSED_RG11_EAC, - angle::Format::ID::R8G8_UNORM, - DXGI_FORMAT_R8G8_UNORM, - DXGI_FORMAT_R8G8_UNORM, - DXGI_FORMAT_R8G8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_RGB8_ETC2: - { - static constexpr Format info(GL_COMPRESSED_RGB8_ETC2, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>); - return info; - } - case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE: - { - static constexpr Format info(GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE, - angle::Format::ID::BC1_RGB_UNORM_BLOCK, - DXGI_FORMAT_BC1_UNORM, - DXGI_FORMAT_BC1_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC1_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: - { - static constexpr Format info(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>); - return info; - } - case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE: - { - static constexpr Format info(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, - angle::Format::ID::BC1_RGBA_UNORM_BLOCK, - DXGI_FORMAT_BC1_UNORM, - DXGI_FORMAT_BC1_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC1_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA8_ETC2_EAC: - { - static constexpr Format info(GL_COMPRESSED_RGBA8_ETC2_EAC, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x10_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x5_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x6_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x8_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_12x10_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_12x12_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_4x4_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_5x4_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_5x5_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_6x5_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_6x6_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_8x5_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_8x6_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: - { - static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_8x8_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - { - static constexpr Format info(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, - angle::Format::ID::BC1_RGBA_UNORM_BLOCK, - DXGI_FORMAT_BC1_UNORM, - DXGI_FORMAT_BC1_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC1_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: - { - static constexpr Format info(GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, - angle::Format::ID::BC2_RGBA_UNORM_BLOCK, - DXGI_FORMAT_BC2_UNORM, - DXGI_FORMAT_BC2_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC2_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: - { - static constexpr Format info(GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, - angle::Format::ID::BC3_RGBA_UNORM_BLOCK, - DXGI_FORMAT_BC3_UNORM, - DXGI_FORMAT_BC3_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC3_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - { - static constexpr Format info(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, - angle::Format::ID::BC1_RGB_UNORM_BLOCK, - DXGI_FORMAT_BC1_UNORM, - DXGI_FORMAT_BC1_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC1_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_SIGNED_R11_EAC: - { - static constexpr Format info(GL_COMPRESSED_SIGNED_R11_EAC, - angle::Format::ID::R8_SNORM, - DXGI_FORMAT_R8_SNORM, - DXGI_FORMAT_R8_SNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8_SNORM, - GL_RGBA8_SNORM, - nullptr); - return info; - } - case GL_COMPRESSED_SIGNED_RG11_EAC: - { - static constexpr Format info(GL_COMPRESSED_SIGNED_RG11_EAC, - angle::Format::ID::R8G8_SNORM, - DXGI_FORMAT_R8G8_SNORM, - DXGI_FORMAT_R8G8_SNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8_SNORM, - GL_RGBA8_SNORM, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, - angle::Format::ID::R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - GL_SRGB8_ALPHA8, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_ETC2: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_ETC2, - angle::Format::ID::R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - GL_SRGB8_ALPHA8, - Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>); - return info; - } - case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE, - angle::Format::ID::BC1_RGB_UNORM_SRGB_BLOCK, - DXGI_FORMAT_BC1_UNORM_SRGB, - DXGI_FORMAT_BC1_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC1_UNORM_SRGB, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, - angle::Format::ID::R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - GL_SRGB8_ALPHA8, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE: - { - static constexpr Format info(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, - angle::Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK, - DXGI_FORMAT_BC1_UNORM_SRGB, - DXGI_FORMAT_BC1_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC1_UNORM_SRGB, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: - { - static constexpr Format info(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, - angle::Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK, - DXGI_FORMAT_BC1_UNORM_SRGB, - DXGI_FORMAT_BC1_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC1_UNORM_SRGB, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: - { - static constexpr Format info(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, - angle::Format::ID::BC2_RGBA_UNORM_SRGB_BLOCK, - DXGI_FORMAT_BC2_UNORM_SRGB, - DXGI_FORMAT_BC2_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC2_UNORM_SRGB, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: - { - static constexpr Format info(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, - angle::Format::ID::BC3_RGBA_UNORM_SRGB_BLOCK, - DXGI_FORMAT_BC3_UNORM_SRGB, - DXGI_FORMAT_BC3_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC3_UNORM_SRGB, - GL_RGBA8, - nullptr); - return info; - } - case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: - { - static constexpr Format info(GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, - angle::Format::ID::BC1_RGB_UNORM_SRGB_BLOCK, - DXGI_FORMAT_BC1_UNORM_SRGB, - DXGI_FORMAT_BC1_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC1_UNORM_SRGB, - GL_RGBA8, - nullptr); - return info; - } - case GL_DEPTH24_STENCIL8: - { - if (OnlyFL10Plus(deviceCaps)) - { - static constexpr Format info(GL_DEPTH24_STENCIL8, - angle::Format::ID::D24_UNORM_S8_UINT, - DXGI_FORMAT_R24G8_TYPELESS, - DXGI_FORMAT_R24_UNORM_X8_TYPELESS, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_R24_UNORM_X8_TYPELESS, - GL_RGBA32F, - nullptr); - return info; - } - else - { - static constexpr Format info(GL_DEPTH24_STENCIL8, - angle::Format::ID::D24_UNORM_S8_UINT, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_UNKNOWN, - GL_RGBA32F, - nullptr); - return info; - } - } - case GL_DEPTH32F_STENCIL8: - { - static constexpr Format info(GL_DEPTH32F_STENCIL8, - angle::Format::ID::D32_FLOAT_S8X24_UINT, - DXGI_FORMAT_R32G8X24_TYPELESS, - DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D32_FLOAT_S8X24_UINT, - DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, - GL_RGBA32F, - nullptr); - return info; - } - case GL_DEPTH_COMPONENT16: - { - if (OnlyFL10Plus(deviceCaps)) - { - static constexpr Format info(GL_DEPTH_COMPONENT16, - angle::Format::ID::D16_UNORM, - DXGI_FORMAT_R16_TYPELESS, - DXGI_FORMAT_R16_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D16_UNORM, - DXGI_FORMAT_R16_UNORM, - GL_RGBA16_EXT, - nullptr); - return info; - } - else - { - static constexpr Format info(GL_DEPTH_COMPONENT16, - angle::Format::ID::D16_UNORM, - DXGI_FORMAT_D16_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D16_UNORM, - DXGI_FORMAT_UNKNOWN, - GL_RGBA16_EXT, - nullptr); - return info; - } - } - case GL_DEPTH_COMPONENT24: - { - if (OnlyFL10Plus(deviceCaps)) - { - static constexpr Format info(GL_DEPTH_COMPONENT24, - angle::Format::ID::D24_UNORM_S8_UINT, - DXGI_FORMAT_R24G8_TYPELESS, - DXGI_FORMAT_R24_UNORM_X8_TYPELESS, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_R24_UNORM_X8_TYPELESS, - GL_RGBA32F, - nullptr); - return info; - } - else - { - static constexpr Format info(GL_DEPTH_COMPONENT24, - angle::Format::ID::D24_UNORM_S8_UINT, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_UNKNOWN, - GL_RGBA32F, - nullptr); - return info; - } - } - case GL_DEPTH_COMPONENT32F: - { - static constexpr Format info(GL_DEPTH_COMPONENT32F, - angle::Format::ID::D32_FLOAT, - DXGI_FORMAT_R32_TYPELESS, - DXGI_FORMAT_R32_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D32_FLOAT, - DXGI_FORMAT_R32_FLOAT, - GL_RGBA32F, - nullptr); - return info; - } - case GL_DEPTH_COMPONENT32_OES: - { - if (OnlyFL10Plus(deviceCaps)) - { - static constexpr Format info(GL_DEPTH_COMPONENT32_OES, - angle::Format::ID::D24_UNORM_S8_UINT, - DXGI_FORMAT_R24G8_TYPELESS, - DXGI_FORMAT_R24_UNORM_X8_TYPELESS, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_R24_UNORM_X8_TYPELESS, - GL_RGBA32F, - nullptr); - return info; - } - else - { - static constexpr Format info(GL_DEPTH_COMPONENT32_OES, - angle::Format::ID::D24_UNORM_S8_UINT, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_UNKNOWN, - GL_RGBA32F, - nullptr); - return info; - } - } - case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE: - { - static constexpr Format info(GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, - angle::Format::ID::BC1_RGB_UNORM_BLOCK, - DXGI_FORMAT_BC1_UNORM, - DXGI_FORMAT_BC1_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_BC1_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_ETC1_RGB8_OES: - { - static constexpr Format info(GL_ETC1_RGB8_OES, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>); - return info; - } - case GL_LUMINANCE16F_EXT: - { - static constexpr Format info(GL_LUMINANCE16F_EXT, - angle::Format::ID::R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_FLOAT, - GL_RGBA16F, - Initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>); - return info; - } - case GL_LUMINANCE32F_EXT: - { - static constexpr Format info(GL_LUMINANCE32F_EXT, - angle::Format::ID::R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32B32A32_FLOAT, - GL_RGBA32F, - Initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One>); - return info; - } - case GL_LUMINANCE8_ALPHA8_EXT: - { - static constexpr Format info(GL_LUMINANCE8_ALPHA8_EXT, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_LUMINANCE8_EXT: - { - static constexpr Format info(GL_LUMINANCE8_EXT, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>); - return info; - } - case GL_LUMINANCE_ALPHA16F_EXT: - { - static constexpr Format info(GL_LUMINANCE_ALPHA16F_EXT, - angle::Format::ID::R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_FLOAT, - GL_RGBA16F, - nullptr); - return info; - } - case GL_LUMINANCE_ALPHA32F_EXT: - { - static constexpr Format info(GL_LUMINANCE_ALPHA32F_EXT, - angle::Format::ID::R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32B32A32_FLOAT, - GL_RGBA32F, - nullptr); - return info; - } - case GL_NONE: - { - static constexpr Format info(GL_NONE, - angle::Format::ID::NONE, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - GL_NONE, - nullptr); - return info; - } - case GL_R11F_G11F_B10F: - { - static constexpr Format info(GL_R11F_G11F_B10F, - angle::Format::ID::R11G11B10_FLOAT, - DXGI_FORMAT_R11G11B10_FLOAT, - DXGI_FORMAT_R11G11B10_FLOAT, - DXGI_FORMAT_R11G11B10_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R11G11B10_FLOAT, - GL_RGBA16F_EXT, - nullptr); - return info; - } - case GL_R16F: - { - static constexpr Format info(GL_R16F, - angle::Format::ID::R16_FLOAT, - DXGI_FORMAT_R16_FLOAT, - DXGI_FORMAT_R16_FLOAT, - DXGI_FORMAT_R16_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16_FLOAT, - GL_RGBA16F_EXT, - nullptr); - return info; - } - case GL_R16I: - { - static constexpr Format info(GL_R16I, - angle::Format::ID::R16_SINT, - DXGI_FORMAT_R16_SINT, - DXGI_FORMAT_R16_SINT, - DXGI_FORMAT_R16_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16_SINT, - GL_RGBA16I, - nullptr); - return info; - } - case GL_R16UI: - { - static constexpr Format info(GL_R16UI, - angle::Format::ID::R16_UINT, - DXGI_FORMAT_R16_UINT, - DXGI_FORMAT_R16_UINT, - DXGI_FORMAT_R16_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16_UINT, - GL_RGBA16I, - nullptr); - return info; - } - case GL_R16_EXT: - { - static constexpr Format info(GL_R16_EXT, - angle::Format::ID::R16_UNORM, - DXGI_FORMAT_R16_UNORM, - DXGI_FORMAT_R16_UNORM, - DXGI_FORMAT_R16_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16_UNORM, - GL_RGBA16_EXT, - nullptr); - return info; - } - case GL_R16_SNORM_EXT: - { - static constexpr Format info(GL_R16_SNORM_EXT, - angle::Format::ID::R16_SNORM, - DXGI_FORMAT_R16_SNORM, - DXGI_FORMAT_R16_SNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16_SNORM, - GL_RGBA16_SNORM_EXT, - nullptr); - return info; - } - case GL_R32F: - { - static constexpr Format info(GL_R32F, - angle::Format::ID::R32_FLOAT, - DXGI_FORMAT_R32_FLOAT, - DXGI_FORMAT_R32_FLOAT, - DXGI_FORMAT_R32_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32_FLOAT, - GL_RGBA32F, - nullptr); - return info; - } - case GL_R32I: - { - static constexpr Format info(GL_R32I, - angle::Format::ID::R32_SINT, - DXGI_FORMAT_R32_SINT, - DXGI_FORMAT_R32_SINT, - DXGI_FORMAT_R32_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32_SINT, - GL_RGBA32I, - nullptr); - return info; - } - case GL_R32UI: - { - static constexpr Format info(GL_R32UI, - angle::Format::ID::R32_UINT, - DXGI_FORMAT_R32_UINT, - DXGI_FORMAT_R32_UINT, - DXGI_FORMAT_R32_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32_UINT, - GL_RGBA32I, - nullptr); - return info; - } - case GL_R8: - { - static constexpr Format info(GL_R8, - angle::Format::ID::R8_UNORM, - DXGI_FORMAT_R8_UNORM, - DXGI_FORMAT_R8_UNORM, - DXGI_FORMAT_R8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_R8I: - { - static constexpr Format info(GL_R8I, - angle::Format::ID::R8_SINT, - DXGI_FORMAT_R8_SINT, - DXGI_FORMAT_R8_SINT, - DXGI_FORMAT_R8_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8_SINT, - GL_RGBA8I, - nullptr); - return info; - } - case GL_R8UI: - { - static constexpr Format info(GL_R8UI, - angle::Format::ID::R8_UINT, - DXGI_FORMAT_R8_UINT, - DXGI_FORMAT_R8_UINT, - DXGI_FORMAT_R8_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8_UINT, - GL_RGBA8I, - nullptr); - return info; - } - case GL_R8_SNORM: - { - static constexpr Format info(GL_R8_SNORM, - angle::Format::ID::R8_SNORM, - DXGI_FORMAT_R8_SNORM, - DXGI_FORMAT_R8_SNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8_SNORM, - GL_RGBA8_SNORM, - nullptr); - return info; - } - case GL_RG16F: - { - static constexpr Format info(GL_RG16F, - angle::Format::ID::R16G16_FLOAT, - DXGI_FORMAT_R16G16_FLOAT, - DXGI_FORMAT_R16G16_FLOAT, - DXGI_FORMAT_R16G16_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16_FLOAT, - GL_RGBA16F_EXT, - nullptr); - return info; - } - case GL_RG16I: - { - static constexpr Format info(GL_RG16I, - angle::Format::ID::R16G16_SINT, - DXGI_FORMAT_R16G16_SINT, - DXGI_FORMAT_R16G16_SINT, - DXGI_FORMAT_R16G16_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16_SINT, - GL_RGBA16I, - nullptr); - return info; - } - case GL_RG16UI: - { - static constexpr Format info(GL_RG16UI, - angle::Format::ID::R16G16_UINT, - DXGI_FORMAT_R16G16_UINT, - DXGI_FORMAT_R16G16_UINT, - DXGI_FORMAT_R16G16_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16_UINT, - GL_RGBA16I, - nullptr); - return info; - } - case GL_RG16_EXT: - { - static constexpr Format info(GL_RG16_EXT, - angle::Format::ID::R16G16_UNORM, - DXGI_FORMAT_R16G16_UNORM, - DXGI_FORMAT_R16G16_UNORM, - DXGI_FORMAT_R16G16_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16_UNORM, - GL_RGBA16_EXT, - nullptr); - return info; - } - case GL_RG16_SNORM_EXT: - { - static constexpr Format info(GL_RG16_SNORM_EXT, - angle::Format::ID::R16G16_SNORM, - DXGI_FORMAT_R16G16_SNORM, - DXGI_FORMAT_R16G16_SNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16_SNORM, - GL_RGBA16_SNORM_EXT, - nullptr); - return info; - } - case GL_RG32F: - { - static constexpr Format info(GL_RG32F, - angle::Format::ID::R32G32_FLOAT, - DXGI_FORMAT_R32G32_FLOAT, - DXGI_FORMAT_R32G32_FLOAT, - DXGI_FORMAT_R32G32_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32_FLOAT, - GL_RGBA32F, - nullptr); - return info; - } - case GL_RG32I: - { - static constexpr Format info(GL_RG32I, - angle::Format::ID::R32G32_SINT, - DXGI_FORMAT_R32G32_SINT, - DXGI_FORMAT_R32G32_SINT, - DXGI_FORMAT_R32G32_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32_SINT, - GL_RGBA32I, - nullptr); - return info; - } - case GL_RG32UI: - { - static constexpr Format info(GL_RG32UI, - angle::Format::ID::R32G32_UINT, - DXGI_FORMAT_R32G32_UINT, - DXGI_FORMAT_R32G32_UINT, - DXGI_FORMAT_R32G32_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32_UINT, - GL_RGBA32I, - nullptr); - return info; - } - case GL_RG8: - { - static constexpr Format info(GL_RG8, - angle::Format::ID::R8G8_UNORM, - DXGI_FORMAT_R8G8_UNORM, - DXGI_FORMAT_R8G8_UNORM, - DXGI_FORMAT_R8G8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_RG8I: - { - static constexpr Format info(GL_RG8I, - angle::Format::ID::R8G8_SINT, - DXGI_FORMAT_R8G8_SINT, - DXGI_FORMAT_R8G8_SINT, - DXGI_FORMAT_R8G8_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8_SINT, - GL_RGBA8I, - nullptr); - return info; - } - case GL_RG8UI: - { - static constexpr Format info(GL_RG8UI, - angle::Format::ID::R8G8_UINT, - DXGI_FORMAT_R8G8_UINT, - DXGI_FORMAT_R8G8_UINT, - DXGI_FORMAT_R8G8_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8_UINT, - GL_RGBA8I, - nullptr); - return info; - } - case GL_RG8_SNORM: - { - static constexpr Format info(GL_RG8_SNORM, - angle::Format::ID::R8G8_SNORM, - DXGI_FORMAT_R8G8_SNORM, - DXGI_FORMAT_R8G8_SNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8_SNORM, - GL_RGBA8_SNORM, - nullptr); - return info; - } - case GL_RGB: - { - static constexpr Format info(GL_RGB, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>); - return info; - } - case GL_RGB10_A2: - { - static constexpr Format info(GL_RGB10_A2, - angle::Format::ID::R10G10B10A2_UNORM, - DXGI_FORMAT_R10G10B10A2_UNORM, - DXGI_FORMAT_R10G10B10A2_UNORM, - DXGI_FORMAT_R10G10B10A2_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R10G10B10A2_UNORM, - GL_RGBA16_EXT, - nullptr); - return info; - } - case GL_RGB10_A2UI: - { - static constexpr Format info(GL_RGB10_A2UI, - angle::Format::ID::R10G10B10A2_UINT, - DXGI_FORMAT_R10G10B10A2_UINT, - DXGI_FORMAT_R10G10B10A2_UINT, - DXGI_FORMAT_R10G10B10A2_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R10G10B10A2_UINT, - GL_RGBA16I, - nullptr); - return info; - } - case GL_RGB16F: - { - static constexpr Format info(GL_RGB16F, - angle::Format::ID::R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_FLOAT, - GL_RGBA16F, - Initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>); - return info; - } - case GL_RGB16I: - { - static constexpr Format info(GL_RGB16I, - angle::Format::ID::R16G16B16A16_SINT, - DXGI_FORMAT_R16G16B16A16_SINT, - DXGI_FORMAT_R16G16B16A16_SINT, - DXGI_FORMAT_R16G16B16A16_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_SINT, - GL_RGBA16I, - Initialize4ComponentData<GLshort, 0x0000, 0x0000, 0x0000, 0x0001>); - return info; - } - case GL_RGB16UI: - { - static constexpr Format info(GL_RGB16UI, - angle::Format::ID::R16G16B16A16_UINT, - DXGI_FORMAT_R16G16B16A16_UINT, - DXGI_FORMAT_R16G16B16A16_UINT, - DXGI_FORMAT_R16G16B16A16_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_UINT, - GL_RGBA16UI, - Initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x0001>); - return info; - } - case GL_RGB16_EXT: - { - static constexpr Format info(GL_RGB16_EXT, - angle::Format::ID::R16G16B16A16_UNORM, - DXGI_FORMAT_R16G16B16A16_UNORM, - DXGI_FORMAT_R16G16B16A16_UNORM, - DXGI_FORMAT_R16G16B16A16_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_UNORM, - GL_RGBA16_EXT, - Initialize4ComponentData<GLubyte, 0x0000, 0x0000, 0x0000, 0xFFFF>); - return info; - } - case GL_RGB16_SNORM_EXT: - { - static constexpr Format info(GL_RGB16_SNORM_EXT, - angle::Format::ID::R16G16B16A16_SNORM, - DXGI_FORMAT_R16G16B16A16_SNORM, - DXGI_FORMAT_R16G16B16A16_SNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_SNORM, - GL_RGBA16_SNORM_EXT, - Initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x7FFF>); - return info; - } - case GL_RGB32F: - { - static constexpr Format info(GL_RGB32F, - angle::Format::ID::R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32B32A32_FLOAT, - GL_RGBA32F, - Initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One>); - return info; - } - case GL_RGB32I: - { - static constexpr Format info(GL_RGB32I, - angle::Format::ID::R32G32B32A32_SINT, - DXGI_FORMAT_R32G32B32A32_SINT, - DXGI_FORMAT_R32G32B32A32_SINT, - DXGI_FORMAT_R32G32B32A32_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32B32A32_SINT, - GL_RGBA32I, - Initialize4ComponentData<GLint, 0x00000000, 0x00000000, 0x00000000, 0x00000001>); - return info; - } - case GL_RGB32UI: - { - static constexpr Format info(GL_RGB32UI, - angle::Format::ID::R32G32B32A32_UINT, - DXGI_FORMAT_R32G32B32A32_UINT, - DXGI_FORMAT_R32G32B32A32_UINT, - DXGI_FORMAT_R32G32B32A32_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32B32A32_UINT, - GL_RGBA32UI, - Initialize4ComponentData<GLuint, 0x00000000, 0x00000000, 0x00000000, 0x00000001>); - return info; - } - case GL_RGB565: - { - if (SupportsFormat(DXGI_FORMAT_B5G6R5_UNORM, deviceCaps)) - { - static constexpr Format info(GL_RGB565, - angle::Format::ID::B5G6R5_UNORM, - DXGI_FORMAT_B5G6R5_UNORM, - DXGI_FORMAT_B5G6R5_UNORM, - DXGI_FORMAT_B5G6R5_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_B5G6R5_UNORM, - GL_RGBA8, - nullptr); - return info; - } - else - { - static constexpr Format info(GL_RGB565, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>); - return info; - } - } - case GL_RGB5_A1: - { - if (SupportsFormat(DXGI_FORMAT_B5G5R5A1_UNORM, deviceCaps)) - { - static constexpr Format info(GL_RGB5_A1, - angle::Format::ID::B5G5R5A1_UNORM, - DXGI_FORMAT_B5G5R5A1_UNORM, - DXGI_FORMAT_B5G5R5A1_UNORM, - DXGI_FORMAT_B5G5R5A1_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_B5G5R5A1_UNORM, - GL_RGBA8, - nullptr); - return info; - } - else - { - static constexpr Format info(GL_RGB5_A1, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - } - case GL_RGB8: - { - static constexpr Format info(GL_RGB8, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>); - return info; - } - case GL_RGB8I: - { - static constexpr Format info(GL_RGB8I, - angle::Format::ID::R8G8B8A8_SINT, - DXGI_FORMAT_R8G8B8A8_SINT, - DXGI_FORMAT_R8G8B8A8_SINT, - DXGI_FORMAT_R8G8B8A8_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_SINT, - GL_RGBA8I, - Initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x01>); - return info; - } - case GL_RGB8UI: - { - static constexpr Format info(GL_RGB8UI, - angle::Format::ID::R8G8B8A8_UINT, - DXGI_FORMAT_R8G8B8A8_UINT, - DXGI_FORMAT_R8G8B8A8_UINT, - DXGI_FORMAT_R8G8B8A8_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UINT, - GL_RGBA8UI, - Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0x01>); - return info; - } - case GL_RGB8_SNORM: - { - static constexpr Format info(GL_RGB8_SNORM, - angle::Format::ID::R8G8B8A8_SNORM, - DXGI_FORMAT_R8G8B8A8_SNORM, - DXGI_FORMAT_R8G8B8A8_SNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_SNORM, - GL_RGBA8_SNORM, - Initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x7F>); - return info; - } - case GL_RGB9_E5: - { - static constexpr Format info(GL_RGB9_E5, - angle::Format::ID::R9G9B9E5_SHAREDEXP, - DXGI_FORMAT_R9G9B9E5_SHAREDEXP, - DXGI_FORMAT_R9G9B9E5_SHAREDEXP, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R9G9B9E5_SHAREDEXP, - GL_RGBA16F_EXT, - nullptr); - return info; - } - case GL_RGBA: - { - static constexpr Format info(GL_RGBA, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_RGBA16F: - { - static constexpr Format info(GL_RGBA16F, - angle::Format::ID::R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_FLOAT, - GL_RGBA16F, - nullptr); - return info; - } - case GL_RGBA16I: - { - static constexpr Format info(GL_RGBA16I, - angle::Format::ID::R16G16B16A16_SINT, - DXGI_FORMAT_R16G16B16A16_SINT, - DXGI_FORMAT_R16G16B16A16_SINT, - DXGI_FORMAT_R16G16B16A16_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_SINT, - GL_RGBA16I, - nullptr); - return info; - } - case GL_RGBA16UI: - { - static constexpr Format info(GL_RGBA16UI, - angle::Format::ID::R16G16B16A16_UINT, - DXGI_FORMAT_R16G16B16A16_UINT, - DXGI_FORMAT_R16G16B16A16_UINT, - DXGI_FORMAT_R16G16B16A16_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_UINT, - GL_RGBA16UI, - nullptr); - return info; - } - case GL_RGBA16_EXT: - { - static constexpr Format info(GL_RGBA16_EXT, - angle::Format::ID::R16G16B16A16_UNORM, - DXGI_FORMAT_R16G16B16A16_UNORM, - DXGI_FORMAT_R16G16B16A16_UNORM, - DXGI_FORMAT_R16G16B16A16_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_UNORM, - GL_RGBA16_EXT, - nullptr); - return info; - } - case GL_RGBA16_SNORM_EXT: - { - static constexpr Format info(GL_RGBA16_SNORM_EXT, - angle::Format::ID::R16G16B16A16_SNORM, - DXGI_FORMAT_R16G16B16A16_SNORM, - DXGI_FORMAT_R16G16B16A16_SNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R16G16B16A16_SNORM, - GL_RGBA16_SNORM_EXT, - nullptr); - return info; - } - case GL_RGBA32F: - { - static constexpr Format info(GL_RGBA32F, - angle::Format::ID::R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32B32A32_FLOAT, - GL_RGBA32F, - nullptr); - return info; - } - case GL_RGBA32I: - { - static constexpr Format info(GL_RGBA32I, - angle::Format::ID::R32G32B32A32_SINT, - DXGI_FORMAT_R32G32B32A32_SINT, - DXGI_FORMAT_R32G32B32A32_SINT, - DXGI_FORMAT_R32G32B32A32_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32B32A32_SINT, - GL_RGBA32I, - nullptr); - return info; - } - case GL_RGBA32UI: - { - static constexpr Format info(GL_RGBA32UI, - angle::Format::ID::R32G32B32A32_UINT, - DXGI_FORMAT_R32G32B32A32_UINT, - DXGI_FORMAT_R32G32B32A32_UINT, - DXGI_FORMAT_R32G32B32A32_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32B32A32_UINT, - GL_RGBA32UI, - nullptr); - return info; - } - case GL_RGBA4: - { - if (SupportsFormat(DXGI_FORMAT_B4G4R4A4_UNORM, deviceCaps)) - { - static constexpr Format info(GL_RGBA4, - angle::Format::ID::B4G4R4A4_UNORM, - DXGI_FORMAT_B4G4R4A4_UNORM, - DXGI_FORMAT_B4G4R4A4_UNORM, - DXGI_FORMAT_B4G4R4A4_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_B4G4R4A4_UNORM, - GL_RGBA4, - nullptr); - return info; - } - else - { - static constexpr Format info(GL_RGBA4, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - } - case GL_RGBA8: - { - static constexpr Format info(GL_RGBA8, - angle::Format::ID::R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM, - GL_RGBA8, - nullptr); - return info; - } - case GL_RGBA8I: - { - static constexpr Format info(GL_RGBA8I, - angle::Format::ID::R8G8B8A8_SINT, - DXGI_FORMAT_R8G8B8A8_SINT, - DXGI_FORMAT_R8G8B8A8_SINT, - DXGI_FORMAT_R8G8B8A8_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_SINT, - GL_RGBA8I, - nullptr); - return info; - } - case GL_RGBA8UI: - { - static constexpr Format info(GL_RGBA8UI, - angle::Format::ID::R8G8B8A8_UINT, - DXGI_FORMAT_R8G8B8A8_UINT, - DXGI_FORMAT_R8G8B8A8_UINT, - DXGI_FORMAT_R8G8B8A8_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UINT, - GL_RGBA8UI, - nullptr); - return info; - } - case GL_RGBA8_SNORM: - { - static constexpr Format info(GL_RGBA8_SNORM, - angle::Format::ID::R8G8B8A8_SNORM, - DXGI_FORMAT_R8G8B8A8_SNORM, - DXGI_FORMAT_R8G8B8A8_SNORM, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_SNORM, - GL_RGBA8_SNORM, - nullptr); - return info; - } - case GL_SRGB8: - { - static constexpr Format info(GL_SRGB8, - angle::Format::ID::R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - GL_SRGB8_ALPHA8, - Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>); - return info; - } - case GL_SRGB8_ALPHA8: - { - static constexpr Format info(GL_SRGB8_ALPHA8, - angle::Format::ID::R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - GL_SRGB8_ALPHA8, - nullptr); - return info; - } - case GL_STENCIL_INDEX8: - { - if (OnlyFL10Plus(deviceCaps)) - { - static constexpr Format info(GL_STENCIL_INDEX8, - angle::Format::ID::D24_UNORM_S8_UINT, - DXGI_FORMAT_R24G8_TYPELESS, - DXGI_FORMAT_R24_UNORM_X8_TYPELESS, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_R24_UNORM_X8_TYPELESS, - GL_RGBA32F, - nullptr); - return info; - } - else - { - static constexpr Format info(GL_STENCIL_INDEX8, - angle::Format::ID::D24_UNORM_S8_UINT, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_UNKNOWN, - GL_RGBA32F, - nullptr); - return info; - } - } - - default: - break; - } - // clang-format on - - UNREACHABLE(); - static constexpr Format defaultInfo; - return defaultInfo; -} - -} // namespace d3d11 - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_utils.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_utils.h deleted file mode 100644 index d5351ff882..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_utils.h +++ /dev/null @@ -1,85 +0,0 @@ -// -// Copyright 2016 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. -// -// Helper routines for the D3D11 texture format table. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_TEXTURE_FORMAT_TABLE_UTILS_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_TEXTURE_FORMAT_TABLE_UTILS_H_ - -#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" - -namespace rx -{ - -namespace d3d11 -{ - -using FormatSupportFunction = bool (*)(const Renderer11DeviceCaps &); - -inline bool OnlyFL10Plus(const Renderer11DeviceCaps &deviceCaps) -{ - return (deviceCaps.featureLevel >= D3D_FEATURE_LEVEL_10_0); -} - -inline bool OnlyFL9_3(const Renderer11DeviceCaps &deviceCaps) -{ - return (deviceCaps.featureLevel == D3D_FEATURE_LEVEL_9_3); -} - -inline bool SupportsFormat(DXGI_FORMAT format, const Renderer11DeviceCaps &deviceCaps) -{ - // Must support texture, SRV and RTV support - UINT mustSupport = D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURECUBE | - D3D11_FORMAT_SUPPORT_SHADER_SAMPLE | D3D11_FORMAT_SUPPORT_MIP | - D3D11_FORMAT_SUPPORT_RENDER_TARGET; - UINT minimumRequiredSamples = 0; - - if (d3d11_gl::GetMaximumClientVersion(deviceCaps.featureLevel).major > 2) - { - mustSupport |= D3D11_FORMAT_SUPPORT_TEXTURE3D; - - // RGBA4, RGB5A1 and RGB565 are all required multisampled renderbuffer formats in ES3 and - // need to support a minimum of 4 samples. - minimumRequiredSamples = 4; - } - - bool fullSupport = false; - if (format == DXGI_FORMAT_B5G6R5_UNORM) - { - // All hardware that supports DXGI_FORMAT_B5G6R5_UNORM should support autogen mipmaps, but - // check anyway. - mustSupport |= D3D11_FORMAT_SUPPORT_MIP_AUTOGEN; - fullSupport = ((deviceCaps.B5G6R5support & mustSupport) == mustSupport) && - deviceCaps.B5G6R5maxSamples >= minimumRequiredSamples; - } - else if (format == DXGI_FORMAT_B4G4R4A4_UNORM) - { - fullSupport = ((deviceCaps.B4G4R4A4support & mustSupport) == mustSupport) && - deviceCaps.B4G4R4A4maxSamples >= minimumRequiredSamples; - } - else if (format == DXGI_FORMAT_B5G5R5A1_UNORM) - { - fullSupport = ((deviceCaps.B5G5R5A1support & mustSupport) == mustSupport) && - deviceCaps.B5G5R5A1maxSamples >= minimumRequiredSamples; - } - else - { - UNREACHABLE(); - return false; - } - - // This means that ANGLE would like to use the entry in the map if the inputted DXGI format - // *IS* supported. - // e.g. the entry might map GL_RGB5_A1 to DXGI_FORMAT_B5G5R5A1, which should only be used if - // DXGI_FORMAT_B5G5R5A1 is supported. - // In this case, we should only return 'true' if the format *IS* supported. - return fullSupport; -} - -} // namespace d3d11 - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_TEXTURE_FORMAT_TABLE_UTILS_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp deleted file mode 100644 index f5e6c93813..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp +++ /dev/null @@ -1,217 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// NativeWindow11Win32.cpp: Implementation of NativeWindow11 using win32 window APIs. - -#include "libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h" -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" - -#include "common/debug.h" - -#include <initguid.h> -#include <dcomp.h> - -namespace rx -{ - -NativeWindow11Win32::NativeWindow11Win32(EGLNativeWindowType window, - bool hasAlpha, - bool directComposition) - : NativeWindow11(window), - mDirectComposition(directComposition), - mHasAlpha(hasAlpha), - mDevice(nullptr), - mCompositionTarget(nullptr), - mVisual(nullptr) -{ -} - -NativeWindow11Win32::~NativeWindow11Win32() -{ - SafeRelease(mCompositionTarget); - SafeRelease(mDevice); - SafeRelease(mVisual); -} - -bool NativeWindow11Win32::initialize() -{ - return true; -} - -bool NativeWindow11Win32::getClientRect(LPRECT rect) const -{ - return GetClientRect(getNativeWindow(), rect) == TRUE; -} - -bool NativeWindow11Win32::isIconic() const -{ - return IsIconic(getNativeWindow()) == TRUE; -} - -HRESULT NativeWindow11Win32::createSwapChain(ID3D11Device *device, - IDXGIFactory *factory, - DXGI_FORMAT format, - UINT width, - UINT height, - UINT samples, - IDXGISwapChain **swapChain) -{ - if (device == nullptr || factory == nullptr || swapChain == nullptr || width == 0 || - height == 0) - { - return E_INVALIDARG; - } - - if (mDirectComposition) - { - HMODULE dcomp = ::GetModuleHandle(TEXT("dcomp.dll")); - if (!dcomp) - { - return E_INVALIDARG; - } - - typedef HRESULT(WINAPI * PFN_DCOMPOSITION_CREATE_DEVICE)( - IDXGIDevice * dxgiDevice, REFIID iid, void **dcompositionDevice); - PFN_DCOMPOSITION_CREATE_DEVICE createDComp = - reinterpret_cast<PFN_DCOMPOSITION_CREATE_DEVICE>( - GetProcAddress(dcomp, "DCompositionCreateDevice")); - if (!createDComp) - { - return E_INVALIDARG; - } - - if (!mDevice) - { - IDXGIDevice *dxgiDevice = d3d11::DynamicCastComObject<IDXGIDevice>(device); - HRESULT result = createDComp(dxgiDevice, __uuidof(IDCompositionDevice), - reinterpret_cast<void **>(&mDevice)); - SafeRelease(dxgiDevice); - - if (FAILED(result)) - { - return result; - } - } - - if (!mCompositionTarget) - { - HRESULT result = - mDevice->CreateTargetForHwnd(getNativeWindow(), TRUE, &mCompositionTarget); - if (FAILED(result)) - { - return result; - } - } - - if (!mVisual) - { - HRESULT result = mDevice->CreateVisual(&mVisual); - if (FAILED(result)) - { - return result; - } - } - - IDXGIFactory2 *factory2 = d3d11::DynamicCastComObject<IDXGIFactory2>(factory); - DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; - swapChainDesc.Width = width; - swapChainDesc.Height = height; - swapChainDesc.Format = format; - swapChainDesc.Stereo = FALSE; - swapChainDesc.SampleDesc.Count = 1; - swapChainDesc.SampleDesc.Quality = 0; - swapChainDesc.BufferUsage = - DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER | DXGI_USAGE_SHADER_INPUT; - swapChainDesc.BufferCount = 2; - swapChainDesc.Scaling = DXGI_SCALING_STRETCH; - swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; - swapChainDesc.AlphaMode = - mHasAlpha ? DXGI_ALPHA_MODE_PREMULTIPLIED : DXGI_ALPHA_MODE_IGNORE; - swapChainDesc.Flags = 0; - IDXGISwapChain1 *swapChain1 = nullptr; - HRESULT result = - factory2->CreateSwapChainForComposition(device, &swapChainDesc, nullptr, &swapChain1); - if (SUCCEEDED(result)) - { - *swapChain = static_cast<IDXGISwapChain *>(swapChain1); - } - mVisual->SetContent(swapChain1); - mCompositionTarget->SetRoot(mVisual); - SafeRelease(factory2); - return result; - } - - // Use IDXGIFactory2::CreateSwapChainForHwnd if DXGI 1.2 is available to create a - // DXGI_SWAP_EFFECT_SEQUENTIAL swap chain. - IDXGIFactory2 *factory2 = d3d11::DynamicCastComObject<IDXGIFactory2>(factory); - if (factory2 != nullptr) - { - DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; - swapChainDesc.Width = width; - swapChainDesc.Height = height; - swapChainDesc.Format = format; - swapChainDesc.Stereo = FALSE; - swapChainDesc.SampleDesc.Count = samples; - swapChainDesc.SampleDesc.Quality = 0; - swapChainDesc.BufferUsage = - DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_BACK_BUFFER; - swapChainDesc.BufferCount = 1; - swapChainDesc.Scaling = DXGI_SCALING_STRETCH; - swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL; - swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; - swapChainDesc.Flags = 0; - IDXGISwapChain1 *swapChain1 = nullptr; - HRESULT result = factory2->CreateSwapChainForHwnd(device, getNativeWindow(), &swapChainDesc, - nullptr, nullptr, &swapChain1); - if (SUCCEEDED(result)) - { - factory2->MakeWindowAssociation(getNativeWindow(), DXGI_MWA_NO_WINDOW_CHANGES); - *swapChain = static_cast<IDXGISwapChain *>(swapChain1); - } - SafeRelease(factory2); - return result; - } - - DXGI_SWAP_CHAIN_DESC swapChainDesc = {}; - swapChainDesc.BufferCount = 1; - swapChainDesc.BufferDesc.Format = format; - swapChainDesc.BufferDesc.Width = width; - swapChainDesc.BufferDesc.Height = height; - swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; - swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; - swapChainDesc.BufferDesc.RefreshRate.Numerator = 0; - swapChainDesc.BufferDesc.RefreshRate.Denominator = 1; - swapChainDesc.BufferUsage = - DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_BACK_BUFFER; - swapChainDesc.Flags = 0; - swapChainDesc.OutputWindow = getNativeWindow(); - swapChainDesc.SampleDesc.Count = samples; - swapChainDesc.SampleDesc.Quality = 0; - swapChainDesc.Windowed = TRUE; - swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; - - HRESULT result = factory->CreateSwapChain(device, &swapChainDesc, swapChain); - if (SUCCEEDED(result)) - { - factory->MakeWindowAssociation(getNativeWindow(), DXGI_MWA_NO_WINDOW_CHANGES); - } - return result; -} - -void NativeWindow11Win32::commitChange() -{ - if (mDevice) - { - mDevice->Commit(); - } -} - -// static -bool NativeWindow11Win32::IsValidNativeWindow(EGLNativeWindowType window) -{ - return IsWindow(window) == TRUE; -} -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h deleted file mode 100644 index baeba6a347..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// NativeWindow11Win32.h: Implementation of NativeWindow11 using win32 window APIs. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_WIN32_NATIVEWINDOW11WIN32_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_WIN32_NATIVEWINDOW11WIN32_H_ - -#include "libANGLE/renderer/d3d/d3d11/NativeWindow11.h" - -typedef interface IDCompositionDevice IDCompositionDevice; -typedef interface IDCompositionTarget IDCompositionTarget; -typedef interface IDCompositionVisual IDCompositionVisual; - -namespace rx -{ - -class NativeWindow11Win32 : public NativeWindow11 -{ - public: - NativeWindow11Win32(EGLNativeWindowType window, bool hasAlpha, bool directComposition); - ~NativeWindow11Win32() override; - - bool initialize() override; - bool getClientRect(LPRECT rect) const override; - bool isIconic() const override; - - HRESULT createSwapChain(ID3D11Device *device, - IDXGIFactory *factory, - DXGI_FORMAT format, - UINT width, - UINT height, - UINT samples, - IDXGISwapChain **swapChain) override; - - void commitChange() override; - - static bool IsValidNativeWindow(EGLNativeWindowType window); - - private: - bool mDirectComposition; - bool mHasAlpha; - IDCompositionDevice *mDevice; - IDCompositionTarget *mCompositionTarget; - IDCompositionVisual *mVisual; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_WIN32_NATIVEWINDOW11WIN32_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp deleted file mode 100644 index 1ef90e7b09..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp +++ /dev/null @@ -1,208 +0,0 @@ -// -// Copyright (c) 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. -// - -// CoreWindowNativeWindow.cpp: NativeWindow for managing ICoreWindow native window types. - -#include "libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h" - -#include <windows.graphics.display.h> - -using namespace ABI::Windows::Foundation::Collections; - -namespace rx -{ -CoreWindowNativeWindow::~CoreWindowNativeWindow() -{ - unregisterForSizeChangeEvents(); -} - -bool CoreWindowNativeWindow::initialize(EGLNativeWindowType window, IPropertySet *propertySet) -{ - ComPtr<IPropertySet> props = propertySet; - ComPtr<IInspectable> win = window; - SIZE swapChainSize = {}; - HRESULT result = S_OK; - - // IPropertySet is an optional parameter and can be null. - // If one is specified, cache as an IMap and read the properties - // used for initial host initialization. - if (propertySet) - { - result = props.As(&mPropertyMap); - if (FAILED(result)) - { - return false; - } - - // The EGLRenderSurfaceSizeProperty is optional and may be missing. The IPropertySet - // was prevalidated to contain the EGLNativeWindowType before being passed to - // this host. - result = GetOptionalSizePropertyValue(mPropertyMap, EGLRenderSurfaceSizeProperty, &swapChainSize, &mSwapChainSizeSpecified); - if (FAILED(result)) - { - return false; - } - - // The EGLRenderResolutionScaleProperty is optional and may be missing. The IPropertySet - // was prevalidated to contain the EGLNativeWindowType before being passed to - // this host. - result = GetOptionalSinglePropertyValue(mPropertyMap, EGLRenderResolutionScaleProperty, &mSwapChainScale, &mSwapChainScaleSpecified); - if (FAILED(result)) - { - return false; - } - - if (!mSwapChainScaleSpecified) - { - // Default value for the scale is 1.0f - mSwapChainScale = 1.0f; - } - - // A EGLRenderSurfaceSizeProperty and a EGLRenderResolutionScaleProperty can't both be specified - if (mSwapChainScaleSpecified && mSwapChainSizeSpecified) - { - ERR() << "It is invalid to specify both an EGLRenderSurfaceSizeProperty and a " - "EGLRenderResolutionScaleProperty."; - return false; - } - } - - if (SUCCEEDED(result)) - { - result = win.As(&mCoreWindow); - } - - if (SUCCEEDED(result)) - { - // If a swapchain size is specfied, then the automatic resize - // behaviors implemented by the host should be disabled. The swapchain - // will be still be scaled when being rendered to fit the bounds - // of the host. - // Scaling of the swapchain output occurs automatically because if - // the scaling mode setting DXGI_SCALING_STRETCH on the swapchain. - if (mSwapChainSizeSpecified) - { - mClientRect = { 0, 0, swapChainSize.cx, swapChainSize.cy }; - } - else - { - Size coreWindowSize; - result = GetCoreWindowSizeInPixels(mCoreWindow, &coreWindowSize); - - if (SUCCEEDED(result)) - { - mClientRect = clientRect(coreWindowSize); - } - } - } - - if (SUCCEEDED(result)) - { - mNewClientRect = mClientRect; - mClientRectChanged = false; - return registerForSizeChangeEvents(); - } - - return false; -} - -bool CoreWindowNativeWindow::registerForSizeChangeEvents() -{ - ComPtr<IWindowSizeChangedEventHandler> sizeChangedHandler; - HRESULT result = Microsoft::WRL::MakeAndInitialize<CoreWindowSizeChangedHandler>(sizeChangedHandler.ReleaseAndGetAddressOf(), this->shared_from_this()); - if (SUCCEEDED(result)) - { - result = mCoreWindow->add_SizeChanged(sizeChangedHandler.Get(), &mSizeChangedEventToken); - } - - if (SUCCEEDED(result)) - { - return true; - } - - return false; -} - -void CoreWindowNativeWindow::unregisterForSizeChangeEvents() -{ - if (mCoreWindow) - { - (void)mCoreWindow->remove_SizeChanged(mSizeChangedEventToken); - } - mSizeChangedEventToken.value = 0; -} - -HRESULT CoreWindowNativeWindow::createSwapChain(ID3D11Device *device, - IDXGIFactory2 *factory, - DXGI_FORMAT format, - unsigned int width, - unsigned int height, - bool containsAlpha, - IDXGISwapChain1 **swapChain) -{ - if (device == nullptr || factory == nullptr || swapChain == nullptr || width == 0 || - height == 0) - { - return E_INVALIDARG; - } - - DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 }; - swapChainDesc.Width = width; - swapChainDesc.Height = height; - swapChainDesc.Format = format; - swapChainDesc.Stereo = FALSE; - swapChainDesc.SampleDesc.Count = 1; - swapChainDesc.SampleDesc.Quality = 0; - swapChainDesc.BufferUsage = - DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER; - swapChainDesc.BufferCount = 2; - swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; - swapChainDesc.Scaling = DXGI_SCALING_STRETCH; - swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; - - *swapChain = nullptr; - - ComPtr<IDXGISwapChain1> newSwapChain; - HRESULT result = factory->CreateSwapChainForCoreWindow(device, mCoreWindow.Get(), &swapChainDesc, nullptr, newSwapChain.ReleaseAndGetAddressOf()); - if (SUCCEEDED(result)) - { - result = newSwapChain.CopyTo(swapChain); - } - - if (SUCCEEDED(result)) - { - // If automatic swapchain resize behaviors have been disabled, then - // unregister for the resize change events. - if (mSupportsSwapChainResize == false) - { - unregisterForSizeChangeEvents(); - } - } - - return result; -} - -inline HRESULT CoreWindowNativeWindow::scaleSwapChain(const Size &windowSize, - const RECT &clientRect) -{ - // We don't need to do any additional work to scale CoreWindow swapchains. - // Using DXGI_SCALING_STRETCH to create the swapchain above does all the necessary work. - return S_OK; -} - -HRESULT GetCoreWindowSizeInPixels(const ComPtr<ABI::Windows::UI::Core::ICoreWindow> &coreWindow, - Size *windowSize) -{ - ABI::Windows::Foundation::Rect bounds; - HRESULT result = coreWindow->get_Bounds(&bounds); - if (SUCCEEDED(result)) - { - *windowSize = { ConvertDipsToPixels(bounds.Width), ConvertDipsToPixels(bounds.Height) }; - } - - return result; -} -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h deleted file mode 100644 index 21855c2c3b..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h +++ /dev/null @@ -1,90 +0,0 @@ -// -// Copyright (c) 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. -// - -// CoreWindowNativeWindow.h: NativeWindow for managing ICoreWindow native window types. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_WINRT_COREWINDOWNATIVEWINDOW_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_WINRT_COREWINDOWNATIVEWINDOW_H_ - -#include "libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h" - -#include <memory> - -#include <EGL/eglplatform.h> - -typedef ABI::Windows::Foundation::__FITypedEventHandler_2_Windows__CUI__CCore__CCoreWindow_Windows__CUI__CCore__CWindowSizeChangedEventArgs_t IWindowSizeChangedEventHandler; - -namespace rx -{ -class CoreWindowNativeWindow : public InspectableNativeWindow, public std::enable_shared_from_this<CoreWindowNativeWindow> -{ - public: - ~CoreWindowNativeWindow(); - - bool initialize(EGLNativeWindowType window, IPropertySet *propertySet) override; - HRESULT createSwapChain(ID3D11Device *device, - IDXGIFactory2 *factory, - DXGI_FORMAT format, - unsigned int width, - unsigned int height, - bool containsAlpha, - IDXGISwapChain1 **swapChain) override; - - protected: - HRESULT scaleSwapChain(const Size &windowSize, const RECT &clientRect) override; - - bool registerForSizeChangeEvents(); - void unregisterForSizeChangeEvents(); - - private: - ComPtr<ABI::Windows::UI::Core::ICoreWindow> mCoreWindow; - ComPtr<IMap<HSTRING, IInspectable*>> mPropertyMap; -}; - -[uuid(7F924F66-EBAE-40E5-A10B-B8F35E245190)] -class CoreWindowSizeChangedHandler : - public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom>, IWindowSizeChangedEventHandler> -{ - public: - CoreWindowSizeChangedHandler() { } - HRESULT RuntimeClassInitialize(std::shared_ptr<InspectableNativeWindow> host) - { - if (!host) - { - return E_INVALIDARG; - } - - mHost = host; - return S_OK; - } - - // IWindowSizeChangedEventHandler - IFACEMETHOD(Invoke)(ABI::Windows::UI::Core::ICoreWindow *sender, ABI::Windows::UI::Core::IWindowSizeChangedEventArgs *sizeChangedEventArgs) - { - std::shared_ptr<InspectableNativeWindow> host = mHost.lock(); - if (host) - { - ABI::Windows::Foundation::Size windowSize; - if (SUCCEEDED(sizeChangedEventArgs->get_Size(&windowSize))) - { - Size windowSizeInPixels = {ConvertDipsToPixels(windowSize.Width), - ConvertDipsToPixels(windowSize.Height)}; - host->setNewClientSize(windowSizeInPixels); - } - } - - return S_OK; - } - - private: - std::weak_ptr<InspectableNativeWindow> mHost; -}; - -HRESULT GetCoreWindowSizeInPixels(const ComPtr<ABI::Windows::UI::Core::ICoreWindow> &coreWindow, - Size *windowSize); -} - -#endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_COREWINDOWNATIVEWINDOW_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp deleted file mode 100644 index 1bd796e58f..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp +++ /dev/null @@ -1,297 +0,0 @@ -// -// Copyright (c) 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. -// - -// InspectableNativeWindow.cpp: NativeWindow base class for managing IInspectable native window types. - -#include "libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h" -#include "libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h" - -namespace rx -{ - -bool IsCoreWindow(EGLNativeWindowType window, ComPtr<ABI::Windows::UI::Core::ICoreWindow> *coreWindow) -{ - if (!window) - { - return false; - } - - ComPtr<IInspectable> win = window; - ComPtr<ABI::Windows::UI::Core::ICoreWindow> coreWin; - if (SUCCEEDED(win.As(&coreWin))) - { - if (coreWindow != nullptr) - { - *coreWindow = coreWin; - } - return true; - } - - return false; -} - -bool IsSwapChainPanel(EGLNativeWindowType window, ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> *swapChainPanel) -{ - if (!window) - { - return false; - } - - ComPtr<IInspectable> win = window; - ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> panel; - if (SUCCEEDED(win.As(&panel))) - { - if (swapChainPanel != nullptr) - { - *swapChainPanel = panel; - } - return true; - } - - return false; -} - -bool IsEGLConfiguredPropertySet(EGLNativeWindowType window, ABI::Windows::Foundation::Collections::IPropertySet **propertySet, IInspectable **eglNativeWindow) -{ - if (!window) - { - return false; - } - - ComPtr<IInspectable> props = window; - ComPtr<IPropertySet> propSet; - ComPtr<IInspectable> nativeWindow; - ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> propMap; - boolean hasEglNativeWindowPropertyKey = false; - - HRESULT result = props.As(&propSet); - if (SUCCEEDED(result)) - { - result = propSet.As(&propMap); - } - - // Look for the presence of the EGLNativeWindowType in the property set - if (SUCCEEDED(result)) - { - result = propMap->HasKey(HStringReference(EGLNativeWindowTypeProperty).Get(), &hasEglNativeWindowPropertyKey); - } - - // If the IPropertySet does not contain the required EglNativeWindowType key, the property set is - // considered invalid. - if (SUCCEEDED(result) && !hasEglNativeWindowPropertyKey) - { - ERR() << "Could not find EGLNativeWindowTypeProperty in IPropertySet. Valid " - "EGLNativeWindowTypeProperty values include ICoreWindow"; - return false; - } - - // The EglNativeWindowType property exists, so retreive the IInspectable that represents the EGLNativeWindowType - if (SUCCEEDED(result) && hasEglNativeWindowPropertyKey) - { - result = propMap->Lookup(HStringReference(EGLNativeWindowTypeProperty).Get(), &nativeWindow); - } - - if (SUCCEEDED(result)) - { - if (propertySet != nullptr) - { - result = propSet.CopyTo(propertySet); - } - } - - if (SUCCEEDED(result)) - { - if (eglNativeWindow != nullptr) - { - result = nativeWindow.CopyTo(eglNativeWindow); - } - } - - if (SUCCEEDED(result)) - { - return true; - } - - return false; -} - -// Retrieve an optional property from a property set -HRESULT GetOptionalPropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap, - const wchar_t *propertyName, - boolean *hasKey, - ComPtr<ABI::Windows::Foundation::IPropertyValue> &propertyValue) -{ - if (!propertyMap || !hasKey) - { - return E_INVALIDARG; - } - - // Assume that the value does not exist - *hasKey = false; - - HRESULT result = propertyMap->HasKey(HStringReference(propertyName).Get(), hasKey); - if (SUCCEEDED(result) && !(*hasKey)) - { - // Value does not exist, so return S_OK and set the exists parameter to false to indicate - // that a the optional property does not exist. - return S_OK; - } - - if (SUCCEEDED(result)) - { - result = propertyMap->Lookup(HStringReference(propertyName).Get(), &propertyValue); - } - - return result; -} - -// Attempts to read an optional SIZE property value that is assumed to be in the form of -// an ABI::Windows::Foundation::Size. This function validates the Size value before returning -// it to the caller. -// -// Possible return values are: -// S_OK, valueExists == true - optional SIZE value was successfully retrieved and validated -// S_OK, valueExists == false - optional SIZE value was not found -// E_INVALIDARG, valueExists = false - optional SIZE value was malformed in the property set. -// * Incorrect property type ( must be PropertyType_Size) -// * Invalid property value (width/height must be > 0) -// Additional errors may be returned from IMap or IPropertyValue -// -HRESULT GetOptionalSizePropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap, - const wchar_t *propertyName, SIZE *value, bool *valueExists) -{ - ComPtr<ABI::Windows::Foundation::IPropertyValue> propertyValue; - ABI::Windows::Foundation::PropertyType propertyType = ABI::Windows::Foundation::PropertyType::PropertyType_Empty; - Size sizeValue = { 0, 0 }; - boolean hasKey = false; - - if (!propertyMap || !value || !valueExists) - { - return E_INVALIDARG; - } - - // Assume that the value does not exist - *valueExists = false; - *value = { 0, 0 }; - - HRESULT result = GetOptionalPropertyValue(propertyMap, propertyName, &hasKey, propertyValue); - if (SUCCEEDED(result) && hasKey) - { - result = propertyValue->get_Type(&propertyType); - - // Check if the expected Size property is of PropertyType_Size type. - if (SUCCEEDED(result) && propertyType == ABI::Windows::Foundation::PropertyType::PropertyType_Size) - { - if (SUCCEEDED(propertyValue->GetSize(&sizeValue)) && (sizeValue.Width > 0 && sizeValue.Height > 0)) - { - // A valid property value exists - *value = { static_cast<long>(sizeValue.Width), static_cast<long>(sizeValue.Height) }; - *valueExists = true; - result = S_OK; - } - else - { - // An invalid Size property was detected. Width/Height values must > 0 - result = E_INVALIDARG; - } - } - else - { - // An invalid property type was detected. Size property must be of PropertyType_Size - result = E_INVALIDARG; - } - } - - return result; -} - -// Attempts to read an optional float property value that is assumed to be in the form of -// an ABI::Windows::Foundation::Single. This function validates the Single value before returning -// it to the caller. -// -// Possible return values are: -// S_OK, valueExists == true - optional Single value was successfully retrieved and validated -// S_OK, valueExists == false - optional Single value was not found -// E_INVALIDARG, valueExists = false - optional Single value was malformed in the property set. -// * Incorrect property type ( must be PropertyType_Single) -// * Invalid property value (must be > 0) -// Additional errors may be returned from IMap or IPropertyValue -// -HRESULT GetOptionalSinglePropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap, - const wchar_t *propertyName, float *value, bool *valueExists) -{ - ComPtr<ABI::Windows::Foundation::IPropertyValue> propertyValue; - ABI::Windows::Foundation::PropertyType propertyType = ABI::Windows::Foundation::PropertyType::PropertyType_Empty; - float scaleValue = 0.0f; - boolean hasKey = false; - - if (!propertyMap || !value || !valueExists) - { - return E_INVALIDARG; - } - - // Assume that the value does not exist - *valueExists = false; - *value = 0.0f; - - HRESULT result = GetOptionalPropertyValue(propertyMap, propertyName, &hasKey, propertyValue); - if (SUCCEEDED(result) && hasKey) - { - result = propertyValue->get_Type(&propertyType); - - // Check if the expected Scale property is of PropertyType_Single type. - if (SUCCEEDED(result) && propertyType == ABI::Windows::Foundation::PropertyType::PropertyType_Single) - { - if (SUCCEEDED(propertyValue->GetSingle(&scaleValue)) && (scaleValue > 0.0f)) - { - // A valid property value exists - *value = scaleValue; - *valueExists = true; - result = S_OK; - } - else - { - // An invalid scale was set - result = E_INVALIDARG; - } - } - else - { - // An invalid property type was detected. Size property must be of PropertyType_Single - result = E_INVALIDARG; - } - } - - return result; -} - -RECT InspectableNativeWindow::clientRect(const Size &size) -{ - return {0, 0, static_cast<long>(ConvertDipsToPixels(size.Width)), - static_cast<long>(ConvertDipsToPixels(size.Height))}; -} - -float GetLogicalDpi() -{ - ComPtr<ABI::Windows::Graphics::Display::IDisplayPropertiesStatics> displayProperties; - float dpi = 96.0f; - - if (SUCCEEDED(GetActivationFactory(HStringReference(RuntimeClass_Windows_Graphics_Display_DisplayProperties).Get(), displayProperties.GetAddressOf()))) - { - if (SUCCEEDED(displayProperties->get_LogicalDpi(&dpi))) - { - return dpi; - } - } - return dpi; -} - -float ConvertDipsToPixels(float dips) -{ - static const float dipsPerInch = 96.0f; - return lround((dips * GetLogicalDpi() / dipsPerInch)); -} -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h deleted file mode 100644 index d81c3e5fb9..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h +++ /dev/null @@ -1,136 +0,0 @@ -// -// Copyright (c) 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. -// - -// InspectableNativeWindow.h: Host specific implementation interface for -// managing IInspectable native window types. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_WINRT_INSPECTABLENATIVEWINDOW_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_WINRT_INSPECTABLENATIVEWINDOW_H_ - -#include "common/debug.h" -#include "common/platform.h" - -#include "angle_windowsstore.h" - -#include <EGL/eglplatform.h> - -#include <windows.applicationmodel.core.h> -#include <windows.ui.xaml.h> -#include <windows.ui.xaml.media.dxinterop.h> -#include <wrl.h> -#include <wrl/wrappers/corewrappers.h> - -using namespace Microsoft::WRL; -using namespace Microsoft::WRL::Wrappers; -using namespace ABI::Windows::Foundation; -using namespace ABI::Windows::Foundation::Collections; - -namespace rx -{ -float ConvertDipsToPixels(float dips); -float GetLogicalDpi(); - -class InspectableNativeWindow -{ - public: - InspectableNativeWindow() : - mSupportsSwapChainResize(true), - mSwapChainSizeSpecified(false), - mSwapChainScaleSpecified(false), - mClientRectChanged(false), - mClientRect({0,0,0,0}), - mNewClientRect({0,0,0,0}) - { - mSizeChangedEventToken.value = 0; - mSwapChainScale = 96.0f / GetLogicalDpi(); - if (mSwapChainScale != 1.0f) - mSwapChainScaleSpecified = true; - } - virtual ~InspectableNativeWindow(){} - - virtual bool initialize(EGLNativeWindowType window, IPropertySet *propertySet) = 0; - virtual HRESULT createSwapChain(ID3D11Device *device, - IDXGIFactory2 *factory, - DXGI_FORMAT format, - unsigned int width, - unsigned int height, - bool containsAlpha, - IDXGISwapChain1 **swapChain) = 0; - - bool getClientRect(RECT *rect) - { - if (mClientRectChanged) - { - mClientRect = mNewClientRect; - } - - *rect = mClientRect; - - return true; - } - - // setNewClientSize is used by the WinRT size change handler. It isn't used by the rest of ANGLE. - void setNewClientSize(const Size &newWindowSize) - { - // If the client doesn't support swapchain resizing then we should have already unregistered from size change handler - ASSERT(mSupportsSwapChainResize); - - if (mSupportsSwapChainResize) - { - // If the swapchain size was specified then we should ignore this call too - if (!mSwapChainSizeSpecified) - { - mNewClientRect = clientRect(newWindowSize); - mClientRectChanged = true; - - // If a scale was specified, then now is the time to apply the scale matrix for the new swapchain size and window size - if (mSwapChainScaleSpecified) - { - scaleSwapChain(newWindowSize, mNewClientRect); - } - } - - // Even if the swapchain size was fixed, the window might have changed size. - // In this case, we should recalculate the scale matrix to account for the new window size - if (mSwapChainSizeSpecified) - { - scaleSwapChain(newWindowSize, mClientRect); - } - } - } - - protected: - virtual HRESULT scaleSwapChain(const Size &windowSize, const RECT &clientRect) = 0; - RECT clientRect(const Size &size); - - bool mSupportsSwapChainResize; // Support for IDXGISwapChain::ResizeBuffers method - bool mSwapChainSizeSpecified; // If an EGLRenderSurfaceSizeProperty was specified - bool mSwapChainScaleSpecified; // If an EGLRenderResolutionScaleProperty was specified - float mSwapChainScale; // The scale value specified by the EGLRenderResolutionScaleProperty property - RECT mClientRect; - RECT mNewClientRect; - bool mClientRectChanged; - - EventRegistrationToken mSizeChangedEventToken; -}; - -bool IsCoreWindow(EGLNativeWindowType window, ComPtr<ABI::Windows::UI::Core::ICoreWindow> *coreWindow = nullptr); -bool IsSwapChainPanel(EGLNativeWindowType window, ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> *swapChainPanel = nullptr); -bool IsEGLConfiguredPropertySet(EGLNativeWindowType window, ABI::Windows::Foundation::Collections::IPropertySet **propertySet = nullptr, IInspectable **inspectable = nullptr); - -HRESULT GetOptionalPropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap, - const wchar_t *propertyName, - boolean *hasKey, - ComPtr<ABI::Windows::Foundation::IPropertyValue> &propertyValue); - -HRESULT GetOptionalSizePropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap, - const wchar_t *propertyName, SIZE *value, bool *valueExists); - -HRESULT GetOptionalSinglePropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap, - const wchar_t *propertyName, float *value, bool *valueExists); -} - -#endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_INSPECTABLENATIVEWINDOW_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp deleted file mode 100644 index 655b23be83..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp +++ /dev/null @@ -1,126 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// NativeWindow11WinRT.cpp: NativeWindow base class for managing IInspectable native window types. - -#include "libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h" - -#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" -#include "libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h" -#include "libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h" -#include "libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h" - -using namespace Microsoft::WRL; -using namespace Microsoft::WRL::Wrappers; - -namespace rx -{ -NativeWindow11WinRT::NativeWindow11WinRT(EGLNativeWindowType window, bool hasAlpha) - : NativeWindow11(window), mHasAlpha(hasAlpha) -{ -} - -bool NativeWindow11WinRT::initialize() -{ - EGLNativeWindowType window = getNativeWindow(); - - // If the native window type is a IPropertySet, extract the - // EGLNativeWindowType (IInspectable) and initialize the - // proper host with this IPropertySet. - ComPtr<ABI::Windows::Foundation::Collections::IPropertySet> propertySet; - ComPtr<IInspectable> eglNativeWindow; - if (IsEGLConfiguredPropertySet(window, &propertySet, &eglNativeWindow)) - { - // A property set was found and the EGLNativeWindowType was - // retrieved. The mWindow member of the host to must be updated - // to use the EGLNativeWindowType specified in the property set. - // mWindow is treated as a raw pointer not an AddRef'd interface, so - // the old mWindow does not need a Release() before this assignment. - window = eglNativeWindow.Get(); - } - - ComPtr<ABI::Windows::UI::Core::ICoreWindow> coreWindow; - ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> swapChainPanel; - if (IsCoreWindow(window, &coreWindow)) - { - mImpl = std::make_shared<CoreWindowNativeWindow>(); - if (mImpl) - { - return mImpl->initialize(window, propertySet.Get()); - } - } - else if (IsSwapChainPanel(window, &swapChainPanel)) - { - mImpl = std::make_shared<SwapChainPanelNativeWindow>(); - if (mImpl) - { - return mImpl->initialize(window, propertySet.Get()); - } - } - else - { - ERR() << "Invalid IInspectable EGLNativeWindowType detected. Valid IInspectables include " - "ICoreWindow, ISwapChainPanel and IPropertySet"; - } - - return false; -} - -bool NativeWindow11WinRT::getClientRect(LPRECT rect) const -{ - if (mImpl) - { - return mImpl->getClientRect(rect); - } - - return false; -} - -bool NativeWindow11WinRT::isIconic() const -{ - return false; -} - -HRESULT NativeWindow11WinRT::createSwapChain(ID3D11Device *device, - IDXGIFactory *factory, - DXGI_FORMAT format, - UINT width, - UINT height, - UINT samples, - IDXGISwapChain **swapChain) -{ - if (mImpl) - { - IDXGIFactory2 *factory2 = d3d11::DynamicCastComObject<IDXGIFactory2>(factory); - IDXGISwapChain1 *swapChain1 = nullptr; - HRESULT result = - mImpl->createSwapChain(device, factory2, format, width, height, mHasAlpha, &swapChain1); - SafeRelease(factory2); - *swapChain = static_cast<IDXGISwapChain *>(swapChain1); - return result; - } - - return E_UNEXPECTED; -} - -void NativeWindow11WinRT::commitChange() -{ -} - -// static -bool NativeWindow11WinRT::IsValidNativeWindow(EGLNativeWindowType window) -{ - // A Valid EGLNativeWindowType IInspectable can only be: - // - // ICoreWindow - // ISwapChainPanel - // IPropertySet - // - // Anything else will be rejected as an invalid IInspectable. - return IsCoreWindow(window) || IsSwapChainPanel(window) || IsEGLConfiguredPropertySet(window); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h deleted file mode 100644 index c4ac997a55..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h +++ /dev/null @@ -1,51 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// NativeWindow11WinRT.h: NativeWindow base class for managing IInspectable native window types. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_WINRT_NATIVEWINDOW11WINRT_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_WINRT_NATIVEWINDOW11WINRT_H_ - -#include "libANGLE/renderer/d3d/d3d11/NativeWindow11.h" - -#include <memory> -#include <windows.applicationmodel.core.h> -#include <wrl.h> -#include <wrl/wrappers/corewrappers.h> - -namespace rx -{ -class InspectableNativeWindow; - -class NativeWindow11WinRT : public NativeWindow11 -{ - public: - NativeWindow11WinRT(EGLNativeWindowType window, bool hasAlpha); - - bool initialize() override; - bool getClientRect(LPRECT rect) const override; - bool isIconic() const override; - - HRESULT createSwapChain(ID3D11Device *device, - IDXGIFactory *factory, - DXGI_FORMAT format, - UINT width, - UINT height, - UINT samples, - IDXGISwapChain **swapChain) override; - - void commitChange() override; - - static bool IsValidNativeWindow(EGLNativeWindowType window); - - private: - bool mHasAlpha; - std::shared_ptr<InspectableNativeWindow> mImpl; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_NATIVEWINDOW11WINRT_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp deleted file mode 100644 index 3425fad95d..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp +++ /dev/null @@ -1,359 +0,0 @@ -// -// Copyright (c) 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. -// - -// SwapChainPanelNativeWindow.cpp: NativeWindow for managing ISwapChainPanel native window types. - -#include "libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h" - -#include <algorithm> -#include <math.h> - -using namespace ABI::Windows::Foundation; -using namespace ABI::Windows::Foundation::Collections; -using namespace ABI::Windows::UI::Core; -using namespace ABI::Windows::UI::Xaml; -using namespace Microsoft::WRL; - -namespace rx -{ -SwapChainPanelNativeWindow::~SwapChainPanelNativeWindow() -{ - unregisterForSizeChangeEvents(); -} - -template <typename T> -struct AddFtmBase -{ - typedef Implements<RuntimeClassFlags<ClassicCom>, T, FtmBase> Type; -}; - -template <typename CODE> -HRESULT RunOnUIThread(CODE &&code, const ComPtr<ICoreDispatcher> &dispatcher) -{ - ComPtr<IAsyncAction> asyncAction; - HRESULT result = S_OK; - - boolean hasThreadAccess; - result = dispatcher->get_HasThreadAccess(&hasThreadAccess); - if (FAILED(result)) - { - return result; - } - - if (hasThreadAccess) - { - return code(); - } - else - { - Event waitEvent( - CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS)); - if (!waitEvent.IsValid()) - { - return E_FAIL; - } - - HRESULT codeResult = E_FAIL; - auto handler = - Callback<AddFtmBase<IDispatchedHandler>::Type>([&codeResult, &code, &waitEvent] - { - codeResult = code(); - SetEvent(waitEvent.Get()); - return S_OK; - }); - - result = dispatcher->RunAsync(CoreDispatcherPriority_Normal, handler.Get(), - asyncAction.GetAddressOf()); - if (FAILED(result)) - { - return result; - } - - auto waitResult = WaitForSingleObjectEx(waitEvent.Get(), 10 * 1000, true); - if (waitResult != WAIT_OBJECT_0) - { - // Wait 10 seconds before giving up. At this point, the application is in an - // unrecoverable state (probably deadlocked). We therefore terminate the application - // entirely. This also prevents stack corruption if the async operation is eventually - // run. - ERR() - << "Timeout waiting for async action on UI thread. The UI thread might be blocked."; - std::terminate(); - return E_FAIL; - } - - return codeResult; - } -} - -bool SwapChainPanelNativeWindow::initialize(EGLNativeWindowType window, IPropertySet *propertySet) -{ - ComPtr<IPropertySet> props = propertySet; - ComPtr<IInspectable> win = window; - SIZE swapChainSize = {}; - HRESULT result = S_OK; - - // IPropertySet is an optional parameter and can be null. - // If one is specified, cache as an IMap and read the properties - // used for initial host initialization. - if (propertySet) - { - result = props.As(&mPropertyMap); - if (FAILED(result)) - { - return false; - } - - // The EGLRenderSurfaceSizeProperty is optional and may be missing. The IPropertySet - // was prevalidated to contain the EGLNativeWindowType before being passed to - // this host. - result = GetOptionalSizePropertyValue(mPropertyMap, EGLRenderSurfaceSizeProperty, &swapChainSize, &mSwapChainSizeSpecified); - if (FAILED(result)) - { - return false; - } - - // The EGLRenderResolutionScaleProperty is optional and may be missing. The IPropertySet - // was prevalidated to contain the EGLNativeWindowType before being passed to - // this host. - result = GetOptionalSinglePropertyValue(mPropertyMap, EGLRenderResolutionScaleProperty, &mSwapChainScale, &mSwapChainScaleSpecified); - if (FAILED(result)) - { - return false; - } - - if (!mSwapChainScaleSpecified) - { - // Default value for the scale is 1.0f - mSwapChainScale = 1.0f; - } - - // A EGLRenderSurfaceSizeProperty and a EGLRenderResolutionScaleProperty can't both be specified - if (mSwapChainScaleSpecified && mSwapChainSizeSpecified) - { - ERR() << "It is invalid to specify both an EGLRenderSurfaceSizeProperty and a " - "EGLRenderResolutionScaleProperty."; - return false; - } - } - - if (SUCCEEDED(result)) - { - result = win.As(&mSwapChainPanel); - } - - ComPtr<IDependencyObject> swapChainPanelDependencyObject; - if (SUCCEEDED(result)) - { - result = mSwapChainPanel.As(&swapChainPanelDependencyObject); - } - - if (SUCCEEDED(result)) - { - result = swapChainPanelDependencyObject->get_Dispatcher( - mSwapChainPanelDispatcher.GetAddressOf()); - } - - if (SUCCEEDED(result)) - { - // If a swapchain size is specfied, then the automatic resize - // behaviors implemented by the host should be disabled. The swapchain - // will be still be scaled when being rendered to fit the bounds - // of the host. - // Scaling of the swapchain output needs to be handled by the - // host for swapchain panels even though the scaling mode setting - // DXGI_SCALING_STRETCH is configured on the swapchain. - if (mSwapChainSizeSpecified) - { - mClientRect = { 0, 0, swapChainSize.cx, swapChainSize.cy }; - } - else - { - Size swapChainPanelSize; - result = GetSwapChainPanelSize(mSwapChainPanel, mSwapChainPanelDispatcher, - &swapChainPanelSize); - - if (SUCCEEDED(result)) - { - // Update the client rect to account for any swapchain scale factor - mClientRect = clientRect(swapChainPanelSize); - } - } - } - - if (SUCCEEDED(result)) - { - mNewClientRect = mClientRect; - mClientRectChanged = false; - return registerForSizeChangeEvents(); - } - - return false; -} - -bool SwapChainPanelNativeWindow::registerForSizeChangeEvents() -{ - ComPtr<ISizeChangedEventHandler> sizeChangedHandler; - ComPtr<IFrameworkElement> frameworkElement; - HRESULT result = Microsoft::WRL::MakeAndInitialize<SwapChainPanelSizeChangedHandler>(sizeChangedHandler.ReleaseAndGetAddressOf(), this->shared_from_this()); - - if (SUCCEEDED(result)) - { - result = mSwapChainPanel.As(&frameworkElement); - } - - if (SUCCEEDED(result)) - { - result = RunOnUIThread( - [this, frameworkElement, sizeChangedHandler] - { - return frameworkElement->add_SizeChanged(sizeChangedHandler.Get(), - &mSizeChangedEventToken); - }, - mSwapChainPanelDispatcher); - } - - if (SUCCEEDED(result)) - { - return true; - } - - return false; -} - -void SwapChainPanelNativeWindow::unregisterForSizeChangeEvents() -{ - ComPtr<IFrameworkElement> frameworkElement; - if (mSwapChainPanel && SUCCEEDED(mSwapChainPanel.As(&frameworkElement))) - { - RunOnUIThread( - [this, frameworkElement] - { - return frameworkElement->remove_SizeChanged(mSizeChangedEventToken); - }, - mSwapChainPanelDispatcher); - } - - mSizeChangedEventToken.value = 0; -} - -HRESULT SwapChainPanelNativeWindow::createSwapChain(ID3D11Device *device, - IDXGIFactory2 *factory, - DXGI_FORMAT format, - unsigned int width, - unsigned int height, - bool containsAlpha, - IDXGISwapChain1 **swapChain) -{ - if (device == nullptr || factory == nullptr || swapChain == nullptr || width == 0 || - height == 0) - { - return E_INVALIDARG; - } - - DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 }; - swapChainDesc.Width = width; - swapChainDesc.Height = height; - swapChainDesc.Format = format; - swapChainDesc.Stereo = FALSE; - swapChainDesc.SampleDesc.Count = 1; - swapChainDesc.SampleDesc.Quality = 0; - swapChainDesc.BufferUsage = - DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER; - swapChainDesc.BufferCount = 2; - swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; - swapChainDesc.Scaling = DXGI_SCALING_STRETCH; - swapChainDesc.AlphaMode = - containsAlpha ? DXGI_ALPHA_MODE_PREMULTIPLIED : DXGI_ALPHA_MODE_IGNORE; - - *swapChain = nullptr; - - ComPtr<IDXGISwapChain1> newSwapChain; - ComPtr<ISwapChainPanelNative> swapChainPanelNative; - Size currentPanelSize = {}; - - HRESULT result = factory->CreateSwapChainForComposition(device, &swapChainDesc, nullptr, newSwapChain.ReleaseAndGetAddressOf()); - - if (SUCCEEDED(result)) - { - result = mSwapChainPanel.As(&swapChainPanelNative); - } - - if (SUCCEEDED(result)) - { - result = RunOnUIThread( - [swapChainPanelNative, newSwapChain] - { - return swapChainPanelNative->SetSwapChain(newSwapChain.Get()); - }, - mSwapChainPanelDispatcher); - } - - if (SUCCEEDED(result)) - { - // The swapchain panel host requires an instance of the swapchain set on the SwapChainPanel - // to perform the runtime-scale behavior. This swapchain is cached here because there are - // no methods for retreiving the currently configured on from ISwapChainPanelNative. - mSwapChain = newSwapChain; - result = newSwapChain.CopyTo(swapChain); - } - - // If the host is responsible for scaling the output of the swapchain, then - // scale it now before returning an instance to the caller. This is done by - // first reading the current size of the swapchain panel, then scaling - if (SUCCEEDED(result)) - { - if (mSwapChainSizeSpecified || mSwapChainScaleSpecified) - { - result = GetSwapChainPanelSize(mSwapChainPanel, mSwapChainPanelDispatcher, - ¤tPanelSize); - - // Scale the swapchain to fit inside the contents of the panel. - if (SUCCEEDED(result)) - { - result = scaleSwapChain(currentPanelSize, mClientRect); - } - } - } - - return result; -} - -HRESULT SwapChainPanelNativeWindow::scaleSwapChain(const Size &windowSize, const RECT &clientRect) -{ - Size renderScale = {windowSize.Width / std::max(LONG(1), clientRect.right), - windowSize.Height / std::max(LONG(1), clientRect.bottom)}; - // Setup a scale matrix for the swap chain - DXGI_MATRIX_3X2_F scaleMatrix = {}; - scaleMatrix._11 = renderScale.Width; - scaleMatrix._22 = renderScale.Height; - - ComPtr<IDXGISwapChain2> swapChain2; - HRESULT result = mSwapChain.As(&swapChain2); - if (SUCCEEDED(result)) - { - result = swapChain2->SetMatrixTransform(&scaleMatrix); - } - - return result; -} - -HRESULT GetSwapChainPanelSize( - const ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> &swapChainPanel, - const ComPtr<ICoreDispatcher> &dispatcher, - Size *windowSize) -{ - ComPtr<IUIElement> uiElement; - HRESULT result = swapChainPanel.As(&uiElement); - if (SUCCEEDED(result)) - { - result = RunOnUIThread( - [uiElement, windowSize] { return uiElement->get_RenderSize(windowSize); }, dispatcher); - } - - return result; -} -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h deleted file mode 100644 index f9a2fc0e4b..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h +++ /dev/null @@ -1,93 +0,0 @@ -// -// Copyright (c) 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. -// - -// SwapChainPanelNativeWindow.h: NativeWindow for managing ISwapChainPanel native window types. - -#ifndef LIBANGLE_RENDERER_D3D_D3D11_WINRT_SWAPCHAINPANELNATIVEWINDOW_H_ -#define LIBANGLE_RENDERER_D3D_D3D11_WINRT_SWAPCHAINPANELNATIVEWINDOW_H_ - -#include "libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h" - -#include <memory> - -namespace rx -{ -class SwapChainPanelNativeWindow : public InspectableNativeWindow, public std::enable_shared_from_this<SwapChainPanelNativeWindow> -{ - public: - ~SwapChainPanelNativeWindow(); - - bool initialize(EGLNativeWindowType window, IPropertySet *propertySet) override; - HRESULT createSwapChain(ID3D11Device *device, - IDXGIFactory2 *factory, - DXGI_FORMAT format, - unsigned int width, - unsigned int height, - bool containsAlpha, - IDXGISwapChain1 **swapChain) override; - - protected: - HRESULT scaleSwapChain(const Size &windowSize, const RECT &clientRect) override; - - bool registerForSizeChangeEvents(); - void unregisterForSizeChangeEvents(); - - private: - ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> mSwapChainPanel; - ComPtr<ABI::Windows::UI::Core::ICoreDispatcher> mSwapChainPanelDispatcher; - ComPtr<IMap<HSTRING, IInspectable*>> mPropertyMap; - ComPtr<IDXGISwapChain1> mSwapChain; -}; - -[uuid(8ACBD974-8187-4508-AD80-AEC77F93CF36)] -class SwapChainPanelSizeChangedHandler : - public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom>, ABI::Windows::UI::Xaml::ISizeChangedEventHandler> -{ - public: - SwapChainPanelSizeChangedHandler() { } - HRESULT RuntimeClassInitialize(std::shared_ptr<InspectableNativeWindow> host) - { - if (!host) - { - return E_INVALIDARG; - } - - mHost = host; - return S_OK; - } - - // ISizeChangedEventHandler - IFACEMETHOD(Invoke)(IInspectable *sender, ABI::Windows::UI::Xaml::ISizeChangedEventArgs *sizeChangedEventArgs) - { - std::shared_ptr<InspectableNativeWindow> host = mHost.lock(); - if (host) - { - // The size of the ISwapChainPanel control is returned in DIPs. - // We are keeping these in dips because the swapchain created for composition - // also uses dip units. This keeps dimensions, viewports, etc in the same unit. - // XAML Clients of the ISwapChainPanel are required to use dips to define their - // layout sizes as well. - ABI::Windows::Foundation::Size newSize; - HRESULT result = sizeChangedEventArgs->get_NewSize(&newSize); - if (SUCCEEDED(result)) - { - host->setNewClientSize(newSize); - } - } - - return S_OK; - } - - private: - std::weak_ptr<InspectableNativeWindow> mHost; -}; - -HRESULT GetSwapChainPanelSize( - const ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> &swapChainPanel, - const ComPtr<ABI::Windows::UI::Core::ICoreDispatcher> &dispatcher, - Size *windowSize); -} -#endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_SWAPCHAINPANELNATIVEWINDOW_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp deleted file mode 100644 index 36f2bd0db8..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp +++ /dev/null @@ -1,829 +0,0 @@ -// -// Copyright (c) 2002-2010 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. -// - -// Blit9.cpp: Surface copy utility class. - -#include "libANGLE/renderer/d3d/d3d9/Blit9.h" - -#include "libANGLE/renderer/d3d/TextureD3D.h" -#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" -#include "libANGLE/renderer/d3d/d3d9/formatutils9.h" -#include "libANGLE/renderer/d3d/d3d9/TextureStorage9.h" -#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" - -namespace -{ -// Precompiled shaders -#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h" -#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h" -#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h" -#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/luminancepremultps.h" -#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceunmultps.h" -#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h" -#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskpremultps.h" -#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskunmultps.h" - -const BYTE *const g_shaderCode[] = { - g_vs20_standardvs, - g_ps20_passthroughps, - g_ps20_luminanceps, - g_ps20_luminancepremultps, - g_ps20_luminanceunmultps, - g_ps20_componentmaskps, - g_ps20_componentmaskpremultps, - g_ps20_componentmaskunmultps, -}; - -const size_t g_shaderSize[] = { - sizeof(g_vs20_standardvs), - sizeof(g_ps20_passthroughps), - sizeof(g_ps20_luminanceps), - sizeof(g_ps20_luminancepremultps), - sizeof(g_ps20_luminanceunmultps), - sizeof(g_ps20_componentmaskps), - sizeof(g_ps20_componentmaskpremultps), - sizeof(g_ps20_componentmaskunmultps), -}; -} - -namespace rx -{ - -Blit9::Blit9(Renderer9 *renderer) - : mRenderer(renderer), - mGeometryLoaded(false), - mQuadVertexBuffer(nullptr), - mQuadVertexDeclaration(nullptr), - mSavedStateBlock(nullptr), - mSavedRenderTarget(nullptr), - mSavedDepthStencil(nullptr) -{ - memset(mCompiledShaders, 0, sizeof(mCompiledShaders)); -} - -Blit9::~Blit9() -{ - SafeRelease(mSavedStateBlock); - SafeRelease(mQuadVertexBuffer); - SafeRelease(mQuadVertexDeclaration); - - for (int i = 0; i < SHADER_COUNT; i++) - { - SafeRelease(mCompiledShaders[i]); - } -} - -gl::Error Blit9::initialize() -{ - if (mGeometryLoaded) - { - return gl::NoError(); - } - - static const float quad[] = - { - -1, -1, - -1, 1, - 1, -1, - 1, 1 - }; - - IDirect3DDevice9 *device = mRenderer->getDevice(); - - HRESULT result = device->CreateVertexBuffer(sizeof(quad), D3DUSAGE_WRITEONLY, 0, - D3DPOOL_DEFAULT, &mQuadVertexBuffer, nullptr); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() << "Failed to create internal blit vertex shader, " - << gl::FmtHR(result); - } - - void *lockPtr = nullptr; - result = mQuadVertexBuffer->Lock(0, 0, &lockPtr, 0); - - if (FAILED(result) || lockPtr == nullptr) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - SafeRelease(mQuadVertexBuffer); - return gl::OutOfMemory() << "Failed to lock internal blit vertex shader, " - << gl::FmtHR(result); - } - - memcpy(lockPtr, quad, sizeof(quad)); - mQuadVertexBuffer->Unlock(); - - static const D3DVERTEXELEMENT9 elements[] = - { - { 0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, - D3DDECL_END() - }; - - result = device->CreateVertexDeclaration(elements, &mQuadVertexDeclaration); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - SafeRelease(mQuadVertexBuffer); - return gl::OutOfMemory() << "Failed to lock internal blit vertex declaration, " - << gl::FmtHR(result); - } - - mGeometryLoaded = true; - return gl::NoError(); -} - -template <class D3DShaderType> -gl::Error Blit9::setShader(ShaderId source, const char *profile, - gl::Error (Renderer9::*createShader)(const DWORD *, size_t length, D3DShaderType **outShader), - HRESULT (WINAPI IDirect3DDevice9::*setShader)(D3DShaderType*)) -{ - IDirect3DDevice9 *device = mRenderer->getDevice(); - - D3DShaderType *shader = nullptr; - - if (mCompiledShaders[source] != nullptr) - { - shader = static_cast<D3DShaderType*>(mCompiledShaders[source]); - } - else - { - const BYTE* shaderCode = g_shaderCode[source]; - size_t shaderSize = g_shaderSize[source]; - ANGLE_TRY((mRenderer->*createShader)(reinterpret_cast<const DWORD*>(shaderCode), shaderSize, &shader)); - mCompiledShaders[source] = shader; - } - - HRESULT hr = (device->*setShader)(shader); - if (FAILED(hr)) - { - return gl::OutOfMemory() << "Failed to set shader for blit operation, " << gl::FmtHR(hr); - } - - return gl::NoError(); -} - -gl::Error Blit9::setVertexShader(ShaderId shader) -{ - return setShader<IDirect3DVertexShader9>(shader, "vs_2_0", &Renderer9::createVertexShader, &IDirect3DDevice9::SetVertexShader); -} - -gl::Error Blit9::setPixelShader(ShaderId shader) -{ - return setShader<IDirect3DPixelShader9>(shader, "ps_2_0", &Renderer9::createPixelShader, &IDirect3DDevice9::SetPixelShader); -} - -RECT Blit9::getSurfaceRect(IDirect3DSurface9 *surface) const -{ - D3DSURFACE_DESC desc; - surface->GetDesc(&desc); - - RECT rect; - rect.left = 0; - rect.top = 0; - rect.right = desc.Width; - rect.bottom = desc.Height; - - return rect; -} - -gl::Extents Blit9::getSurfaceSize(IDirect3DSurface9 *surface) const -{ - D3DSURFACE_DESC desc; - surface->GetDesc(&desc); - - return gl::Extents(desc.Width, desc.Height, 1); -} - -gl::Error Blit9::boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest) -{ - ANGLE_TRY(initialize()); - - IDirect3DBaseTexture9 *texture = nullptr; - ANGLE_TRY(copySurfaceToTexture(source, getSurfaceRect(source), &texture)); - - IDirect3DDevice9 *device = mRenderer->getDevice(); - - saveState(); - - device->SetTexture(0, texture); - device->SetRenderTarget(0, dest); - - ANGLE_TRY(setVertexShader(SHADER_VS_STANDARD)); - ANGLE_TRY(setPixelShader(SHADER_PS_PASSTHROUGH)); - - setCommonBlitState(); - device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - - setViewportAndShaderConstants(getSurfaceRect(source), getSurfaceSize(source), - getSurfaceRect(dest), false); - - render(); - - SafeRelease(texture); - - restoreState(); - - return gl::NoError(); -} - -gl::Error Blit9::copy2D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const RECT &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) -{ - ANGLE_TRY(initialize()); - - const gl::FramebufferAttachment *colorbuffer = framebuffer->getColorbuffer(0); - ASSERT(colorbuffer); - - RenderTarget9 *renderTarget9 = nullptr; - ANGLE_TRY(colorbuffer->getRenderTarget(context, &renderTarget9)); - ASSERT(renderTarget9); - - IDirect3DSurface9 *source = renderTarget9->getSurface(); - ASSERT(source); - - IDirect3DSurface9 *destSurface = nullptr; - TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage); - gl::Error error = storage9->getSurfaceLevel(context, GL_TEXTURE_2D, level, true, &destSurface); - if (error.isError()) - { - SafeRelease(source); - return error; - } - ASSERT(destSurface); - - gl::Error result = - copy(source, nullptr, sourceRect, destFormat, destOffset, destSurface, false, false, false); - - SafeRelease(destSurface); - SafeRelease(source); - - return result; -} - -gl::Error Blit9::copyCube(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const RECT &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum target, - GLint level) -{ - gl::Error error = initialize(); - if (error.isError()) - { - return error; - } - - const gl::FramebufferAttachment *colorbuffer = framebuffer->getColorbuffer(0); - ASSERT(colorbuffer); - - RenderTarget9 *renderTarget9 = nullptr; - error = colorbuffer->getRenderTarget(context, &renderTarget9); - if (error.isError()) - { - return error; - } - ASSERT(renderTarget9); - - IDirect3DSurface9 *source = renderTarget9->getSurface(); - ASSERT(source); - - IDirect3DSurface9 *destSurface = nullptr; - TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage); - error = storage9->getSurfaceLevel(context, target, level, true, &destSurface); - if (error.isError()) - { - SafeRelease(source); - return error; - } - ASSERT(destSurface); - - gl::Error result = - copy(source, nullptr, sourceRect, destFormat, destOffset, destSurface, false, false, false); - - SafeRelease(destSurface); - SafeRelease(source); - - return result; -} - -gl::Error Blit9::copyTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - const RECT &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum destTarget, - GLint destLevel, - bool flipY, - bool premultiplyAlpha, - bool unmultiplyAlpha) -{ - ANGLE_TRY(initialize()); - - const TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source); - - TextureStorage *sourceStorage = nullptr; - ANGLE_TRY(const_cast<TextureD3D *>(sourceD3D)->getNativeTexture(context, &sourceStorage)); - - TextureStorage9_2D *sourceStorage9 = GetAs<TextureStorage9_2D>(sourceStorage); - ASSERT(sourceStorage9); - - TextureStorage9 *destStorage9 = GetAs<TextureStorage9>(storage); - ASSERT(destStorage9); - - ASSERT(sourceLevel == 0); - IDirect3DBaseTexture9 *sourceTexture = nullptr; - ANGLE_TRY(sourceStorage9->getBaseTexture(context, &sourceTexture)); - - IDirect3DSurface9 *sourceSurface = nullptr; - ANGLE_TRY( - sourceStorage9->getSurfaceLevel(context, GL_TEXTURE_2D, sourceLevel, true, &sourceSurface)); - - IDirect3DSurface9 *destSurface = nullptr; - gl::Error error = - destStorage9->getSurfaceLevel(context, destTarget, destLevel, true, &destSurface); - if (error.isError()) - { - SafeRelease(sourceSurface); - return error; - } - - error = copy(sourceSurface, sourceTexture, sourceRect, destFormat, destOffset, destSurface, - flipY, premultiplyAlpha, unmultiplyAlpha); - - SafeRelease(sourceSurface); - SafeRelease(destSurface); - - return error; -} - -gl::Error Blit9::copy(IDirect3DSurface9 *source, - IDirect3DBaseTexture9 *sourceTexture, - const RECT &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - IDirect3DSurface9 *dest, - bool flipY, - bool premultiplyAlpha, - bool unmultiplyAlpha) -{ - ASSERT(source != nullptr && dest != nullptr); - - IDirect3DDevice9 *device = mRenderer->getDevice(); - - D3DSURFACE_DESC sourceDesc; - D3DSURFACE_DESC destDesc; - source->GetDesc(&sourceDesc); - dest->GetDesc(&destDesc); - - // Check if it's possible to use StetchRect - if (sourceDesc.Format == destDesc.Format && (destDesc.Usage & D3DUSAGE_RENDERTARGET) && - d3d9_gl::IsFormatChannelEquivalent(destDesc.Format, destFormat) && !flipY && - premultiplyAlpha == unmultiplyAlpha) - { - RECT destRect = { destOffset.x, destOffset.y, destOffset.x + (sourceRect.right - sourceRect.left), destOffset.y + (sourceRect.bottom - sourceRect.top)}; - HRESULT result = device->StretchRect(source, &sourceRect, dest, &destRect, D3DTEXF_POINT); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() - << "Failed to blit between textures, StretchRect " << gl::FmtHR(result); - } - - return gl::NoError(); - } - else - { - IDirect3DBaseTexture9 *texture = sourceTexture; - RECT adjustedSourceRect = sourceRect; - gl::Extents sourceSize(sourceDesc.Width, sourceDesc.Height, 1); - - if (texture == nullptr) - { - ANGLE_TRY(copySurfaceToTexture(source, sourceRect, &texture)); - - // copySurfaceToTexture only copies in the sourceRect area of the source surface. - // Adjust sourceRect so that it is now covering the entire source texture - adjustedSourceRect.left = 0; - adjustedSourceRect.right = sourceRect.right - sourceRect.left; - adjustedSourceRect.top = 0; - adjustedSourceRect.bottom = sourceRect.bottom - sourceRect.top; - - sourceSize.width = sourceRect.right - sourceRect.left; - sourceSize.height = sourceRect.bottom - sourceRect.top; - } - else - { - texture->AddRef(); - } - - gl::Error error = formatConvert(texture, adjustedSourceRect, sourceSize, destFormat, - destOffset, dest, flipY, premultiplyAlpha, unmultiplyAlpha); - - SafeRelease(texture); - - return error; - } -} - -gl::Error Blit9::formatConvert(IDirect3DBaseTexture9 *source, - const RECT &sourceRect, - const gl::Extents &sourceSize, - GLenum destFormat, - const gl::Offset &destOffset, - IDirect3DSurface9 *dest, - bool flipY, - bool premultiplyAlpha, - bool unmultiplyAlpha) -{ - ANGLE_TRY(initialize()); - - IDirect3DDevice9 *device = mRenderer->getDevice(); - - saveState(); - - device->SetTexture(0, source); - device->SetRenderTarget(0, dest); - - RECT destRect; - destRect.left = destOffset.x; - destRect.right = destOffset.x + (sourceRect.right - sourceRect.left); - destRect.top = destOffset.y; - destRect.bottom = destOffset.y + (sourceRect.bottom - sourceRect.top); - - setViewportAndShaderConstants(sourceRect, sourceSize, destRect, flipY); - - setCommonBlitState(); - - gl::Error error = setFormatConvertShaders(destFormat, flipY, premultiplyAlpha, unmultiplyAlpha); - if (!error.isError()) - { - render(); - } - - restoreState(); - - return error; -} - -gl::Error Blit9::setFormatConvertShaders(GLenum destFormat, - bool flipY, - bool premultiplyAlpha, - bool unmultiplyAlpha) -{ - ANGLE_TRY(setVertexShader(SHADER_VS_STANDARD)); - - switch (destFormat) - { - case GL_RGBA: - case GL_BGRA_EXT: - case GL_RGB: - case GL_RG_EXT: - case GL_RED_EXT: - case GL_ALPHA: - if (premultiplyAlpha == unmultiplyAlpha) - { - ANGLE_TRY(setPixelShader(SHADER_PS_COMPONENTMASK)); - } - else if (premultiplyAlpha) - { - ANGLE_TRY(setPixelShader(SHADER_PS_COMPONENTMASK_PREMULTIPLY_ALPHA)); - } - else - { - ASSERT(unmultiplyAlpha); - ANGLE_TRY(setPixelShader(SHADER_PS_COMPONENTMASK_UNMULTIPLY_ALPHA)); - } - break; - - case GL_LUMINANCE: - case GL_LUMINANCE_ALPHA: - if (premultiplyAlpha == unmultiplyAlpha) - { - ANGLE_TRY(setPixelShader(SHADER_PS_LUMINANCE)); - } - else if (premultiplyAlpha) - { - ANGLE_TRY(setPixelShader(SHADER_PS_LUMINANCE_PREMULTIPLY_ALPHA)); - } - else - { - ASSERT(unmultiplyAlpha); - ANGLE_TRY(setPixelShader(SHADER_PS_LUMINANCE_UNMULTIPLY_ALPHA)); - } - break; - - default: - UNREACHABLE(); - } - - enum { X = 0, Y = 1, Z = 2, W = 3 }; - - // The meaning of this constant depends on the shader that was selected. - // See the shader assembly code above for details. - // Allocate one array for both registers and split it into two float4's. - float psConst[8] = { 0 }; - float *multConst = &psConst[0]; - float *addConst = &psConst[4]; - - switch (destFormat) - { - default: UNREACHABLE(); - case GL_RGBA: - case GL_BGRA_EXT: - multConst[X] = 1; - multConst[Y] = 1; - multConst[Z] = 1; - multConst[W] = 1; - addConst[X] = 0; - addConst[Y] = 0; - addConst[Z] = 0; - addConst[W] = 0; - break; - - case GL_RGB: - multConst[X] = 1; - multConst[Y] = 1; - multConst[Z] = 1; - multConst[W] = 0; - addConst[X] = 0; - addConst[Y] = 0; - addConst[Z] = 0; - addConst[W] = 1; - break; - - case GL_RG_EXT: - multConst[X] = 1; - multConst[Y] = 1; - multConst[Z] = 0; - multConst[W] = 0; - addConst[X] = 0; - addConst[Y] = 0; - addConst[Z] = 0; - addConst[W] = 1; - break; - - case GL_RED_EXT: - multConst[X] = 1; - multConst[Y] = 0; - multConst[Z] = 0; - multConst[W] = 0; - addConst[X] = 0; - addConst[Y] = 0; - addConst[Z] = 0; - addConst[W] = 1; - break; - - case GL_ALPHA: - multConst[X] = 0; - multConst[Y] = 0; - multConst[Z] = 0; - multConst[W] = 1; - addConst[X] = 0; - addConst[Y] = 0; - addConst[Z] = 0; - addConst[W] = 0; - break; - - case GL_LUMINANCE: - multConst[X] = 1; - multConst[Y] = 0; - multConst[Z] = 0; - multConst[W] = 0; - addConst[X] = 0; - addConst[Y] = 0; - addConst[Z] = 0; - addConst[W] = 1; - break; - - case GL_LUMINANCE_ALPHA: - multConst[X] = 1; - multConst[Y] = 0; - multConst[Z] = 0; - multConst[W] = 1; - addConst[X] = 0; - addConst[Y] = 0; - addConst[Z] = 0; - addConst[W] = 0; - break; - } - - mRenderer->getDevice()->SetPixelShaderConstantF(0, psConst, 2); - - return gl::NoError(); -} - -gl::Error Blit9::copySurfaceToTexture(IDirect3DSurface9 *surface, - const RECT &sourceRect, - IDirect3DBaseTexture9 **outTexture) -{ - ASSERT(surface); - - IDirect3DDevice9 *device = mRenderer->getDevice(); - - D3DSURFACE_DESC sourceDesc; - surface->GetDesc(&sourceDesc); - - // Copy the render target into a texture - IDirect3DTexture9 *texture; - HRESULT result = device->CreateTexture( - sourceRect.right - sourceRect.left, sourceRect.bottom - sourceRect.top, 1, - D3DUSAGE_RENDERTARGET, sourceDesc.Format, D3DPOOL_DEFAULT, &texture, nullptr); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() << "Failed to allocate internal texture for blit, " - << gl::FmtHR(result); - } - - IDirect3DSurface9 *textureSurface; - result = texture->GetSurfaceLevel(0, &textureSurface); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - SafeRelease(texture); - return gl::OutOfMemory() << "Failed to query surface of internal blit texture, " - << gl::FmtHR(result); - } - - mRenderer->endScene(); - result = device->StretchRect(surface, &sourceRect, textureSurface, nullptr, D3DTEXF_NONE); - - SafeRelease(textureSurface); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - SafeRelease(texture); - return gl::OutOfMemory() << "Failed to copy between internal blit textures, " - << gl::FmtHR(result); - } - - *outTexture = texture; - return gl::NoError(); -} - -void Blit9::setViewportAndShaderConstants(const RECT &sourceRect, - const gl::Extents &sourceSize, - const RECT &destRect, - bool flipY) -{ - IDirect3DDevice9 *device = mRenderer->getDevice(); - - D3DVIEWPORT9 vp; - vp.X = destRect.left; - vp.Y = destRect.top; - vp.Width = destRect.right - destRect.left; - vp.Height = destRect.bottom - destRect.top; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - device->SetViewport(&vp); - - float vertexConstants[8] = { - // halfPixelAdjust - -1.0f / vp.Width, 1.0f / vp.Height, 0, 0, - // texcoordOffset - static_cast<float>(sourceRect.left) / sourceSize.width, - static_cast<float>(flipY ? sourceRect.bottom : sourceRect.top) / sourceSize.height, - static_cast<float>(sourceRect.right - sourceRect.left) / sourceSize.width, - static_cast<float>(flipY ? sourceRect.top - sourceRect.bottom - : sourceRect.bottom - sourceRect.top) / - sourceSize.height, - }; - - device->SetVertexShaderConstantF(0, vertexConstants, 2); -} - -void Blit9::setCommonBlitState() -{ - IDirect3DDevice9 *device = mRenderer->getDevice(); - - device->SetDepthStencilSurface(nullptr); - - device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - device->SetRenderState(D3DRS_CLIPPLANEENABLE, 0); - device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED); - device->SetRenderState(D3DRS_SRGBWRITEENABLE, FALSE); - device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); - - device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); - device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - device->SetSamplerState(0, D3DSAMP_SRGBTEXTURE, FALSE); - device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); - device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); - - RECT scissorRect = {0}; // Scissoring is disabled for flipping, but we need this to capture and restore the old rectangle - device->SetScissorRect(&scissorRect); - - for(int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++) - { - device->SetStreamSourceFreq(i, 1); - } -} - -void Blit9::render() -{ - IDirect3DDevice9 *device = mRenderer->getDevice(); - - HRESULT hr = device->SetStreamSource(0, mQuadVertexBuffer, 0, 2 * sizeof(float)); - hr = device->SetVertexDeclaration(mQuadVertexDeclaration); - - mRenderer->startScene(); - hr = device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); -} - -void Blit9::saveState() -{ - IDirect3DDevice9 *device = mRenderer->getDevice(); - - HRESULT hr; - - device->GetDepthStencilSurface(&mSavedDepthStencil); - device->GetRenderTarget(0, &mSavedRenderTarget); - - if (mSavedStateBlock == nullptr) - { - hr = device->BeginStateBlock(); - ASSERT(SUCCEEDED(hr) || hr == D3DERR_OUTOFVIDEOMEMORY || hr == E_OUTOFMEMORY); - - setCommonBlitState(); - - static const float dummyConst[8] = { 0 }; - - device->SetVertexShader(nullptr); - device->SetVertexShaderConstantF(0, dummyConst, 2); - device->SetPixelShader(nullptr); - device->SetPixelShaderConstantF(0, dummyConst, 2); - - D3DVIEWPORT9 dummyVp; - dummyVp.X = 0; - dummyVp.Y = 0; - dummyVp.Width = 1; - dummyVp.Height = 1; - dummyVp.MinZ = 0; - dummyVp.MaxZ = 1; - - device->SetViewport(&dummyVp); - - device->SetTexture(0, nullptr); - - device->SetStreamSource(0, mQuadVertexBuffer, 0, 0); - - device->SetVertexDeclaration(mQuadVertexDeclaration); - - hr = device->EndStateBlock(&mSavedStateBlock); - ASSERT(SUCCEEDED(hr) || hr == D3DERR_OUTOFVIDEOMEMORY || hr == E_OUTOFMEMORY); - } - - ASSERT(mSavedStateBlock != nullptr); - - if (mSavedStateBlock != nullptr) - { - hr = mSavedStateBlock->Capture(); - ASSERT(SUCCEEDED(hr)); - } -} - -void Blit9::restoreState() -{ - IDirect3DDevice9 *device = mRenderer->getDevice(); - - device->SetDepthStencilSurface(mSavedDepthStencil); - SafeRelease(mSavedDepthStencil); - - device->SetRenderTarget(0, mSavedRenderTarget); - SafeRelease(mSavedRenderTarget); - - ASSERT(mSavedStateBlock != nullptr); - - if (mSavedStateBlock != nullptr) - { - mSavedStateBlock->Apply(); - } -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h deleted file mode 100644 index 026874f8ae..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h +++ /dev/null @@ -1,153 +0,0 @@ -// -// Copyright (c) 2002-2010 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. -// - -// Blit9.cpp: Surface copy utility class. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_ - -#include "common/angleutils.h" -#include "libANGLE/Error.h" - -#include <GLES2/gl2.h> - -namespace gl -{ -class Context; -class Framebuffer; -class Texture; -struct Extents; -struct Offset; -} - -namespace rx -{ -class Renderer9; -class TextureStorage; - -class Blit9 : angle::NonCopyable -{ - public: - explicit Blit9(Renderer9 *renderer); - ~Blit9(); - - gl::Error initialize(); - - // Copy from source surface to dest surface. - // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left) - gl::Error copy2D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const RECT &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level); - gl::Error copyCube(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const RECT &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum target, - GLint level); - gl::Error copyTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - const RECT &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum destTarget, - GLint destLevel, - bool flipY, - bool premultiplyAlpha, - bool unmultiplyAlpha); - - // 2x2 box filter sample from source to dest. - // Requires that source is RGB(A) and dest has the same format as source. - gl::Error boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest); - - private: - Renderer9 *mRenderer; - - bool mGeometryLoaded; - IDirect3DVertexBuffer9 *mQuadVertexBuffer; - IDirect3DVertexDeclaration9 *mQuadVertexDeclaration; - - // Copy from source texture to dest surface. - // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left) - // source is interpreted as RGBA and destFormat specifies the desired result format. For - // example, if destFormat = GL_RGB, the alpha channel will be forced to 0. - gl::Error formatConvert(IDirect3DBaseTexture9 *source, - const RECT &sourceRect, - const gl::Extents &sourceSize, - GLenum destFormat, - const gl::Offset &destOffset, - IDirect3DSurface9 *dest, - bool flipY, - bool premultiplyAlpha, - bool unmultiplyAlpha); - gl::Error setFormatConvertShaders(GLenum destFormat, - bool flipY, - bool premultiplyAlpha, - bool unmultiplyAlpha); - - gl::Error copy(IDirect3DSurface9 *source, - IDirect3DBaseTexture9 *sourceTexture, - const RECT &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - IDirect3DSurface9 *dest, - bool flipY, - bool premultiplyAlpha, - bool unmultiplyAlpha); - gl::Error copySurfaceToTexture(IDirect3DSurface9 *surface, - const RECT &sourceRect, - IDirect3DBaseTexture9 **outTexture); - void setViewportAndShaderConstants(const RECT &sourceRect, - const gl::Extents &sourceSize, - const RECT &destRect, - bool flipY); - void setCommonBlitState(); - RECT getSurfaceRect(IDirect3DSurface9 *surface) const; - gl::Extents getSurfaceSize(IDirect3DSurface9 *surface) const; - - // This enum is used to index mCompiledShaders and mShaderSource. - enum ShaderId - { - SHADER_VS_STANDARD, - SHADER_PS_PASSTHROUGH, - SHADER_PS_LUMINANCE, - SHADER_PS_LUMINANCE_PREMULTIPLY_ALPHA, - SHADER_PS_LUMINANCE_UNMULTIPLY_ALPHA, - SHADER_PS_COMPONENTMASK, - SHADER_PS_COMPONENTMASK_PREMULTIPLY_ALPHA, - SHADER_PS_COMPONENTMASK_UNMULTIPLY_ALPHA, - SHADER_COUNT, - }; - - // This actually contains IDirect3DVertexShader9 or IDirect3DPixelShader9 casted to IUnknown. - IUnknown *mCompiledShaders[SHADER_COUNT]; - - template <class D3DShaderType> - gl::Error setShader(ShaderId source, const char *profile, - gl::Error (Renderer9::*createShader)(const DWORD *, size_t length, D3DShaderType **outShader), - HRESULT (WINAPI IDirect3DDevice9::*setShader)(D3DShaderType*)); - - gl::Error setVertexShader(ShaderId shader); - gl::Error setPixelShader(ShaderId shader); - void render(); - - void saveState(); - void restoreState(); - IDirect3DStateBlock9 *mSavedStateBlock; - IDirect3DSurface9 *mSavedRenderTarget; - IDirect3DSurface9 *mSavedDepthStencil; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp deleted file mode 100644 index dc308e7752..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp +++ /dev/null @@ -1,139 +0,0 @@ -// -// 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. -// - -// Buffer9.cpp Defines the Buffer9 class. - -#include "libANGLE/renderer/d3d/d3d9/Buffer9.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" - -namespace rx -{ - -Buffer9::Buffer9(const gl::BufferState &state, Renderer9 *renderer) - : BufferD3D(state, renderer), mSize(0) -{ -} - -Buffer9::~Buffer9() -{ - mSize = 0; -} - -size_t Buffer9::getSize() const -{ - return mSize; -} - -bool Buffer9::supportsDirectBinding() const -{ - return false; -} - -gl::Error Buffer9::setData(const gl::Context *context, - gl::BufferBinding /*target*/, - const void *data, - size_t size, - gl::BufferUsage usage) -{ - if (size > mMemory.size()) - { - if (!mMemory.resize(size)) - { - return gl::OutOfMemory() << "Failed to resize internal buffer."; - } - } - - mSize = size; - if (data && size > 0) - { - memcpy(mMemory.data(), data, size); - } - - updateD3DBufferUsage(context, usage); - - invalidateStaticData(context); - - return gl::NoError(); -} - -gl::Error Buffer9::getData(const gl::Context *context, const uint8_t **outData) -{ - *outData = mMemory.data(); - return gl::NoError(); -} - -gl::Error Buffer9::setSubData(const gl::Context *context, - gl::BufferBinding /*target*/, - const void *data, - size_t size, - size_t offset) -{ - if (offset + size > mMemory.size()) - { - if (!mMemory.resize(offset + size)) - { - return gl::OutOfMemory() << "Failed to resize internal buffer."; - } - } - - mSize = std::max(mSize, offset + size); - if (data && size > 0) - { - memcpy(mMemory.data() + offset, data, size); - } - - invalidateStaticData(context); - - return gl::NoError(); -} - -gl::Error Buffer9::copySubData(const gl::Context *context, - BufferImpl *source, - GLintptr sourceOffset, - GLintptr destOffset, - GLsizeiptr size) -{ - // Note: this method is currently unreachable - Buffer9 *sourceBuffer = GetAs<Buffer9>(source); - ASSERT(sourceBuffer); - - memcpy(mMemory.data() + destOffset, sourceBuffer->mMemory.data() + sourceOffset, size); - - invalidateStaticData(context); - - return gl::NoError(); -} - -// We do not support buffer mapping in D3D9 -gl::Error Buffer9::map(const gl::Context *context, GLenum access, void **mapPtr) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error Buffer9::mapRange(const gl::Context *context, - size_t offset, - size_t length, - GLbitfield access, - void **mapPtr) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error Buffer9::unmap(const gl::Context *context, GLboolean *result) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error Buffer9::markTransformFeedbackUsage(const gl::Context *context) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h deleted file mode 100644 index 960b2a2474..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h +++ /dev/null @@ -1,63 +0,0 @@ -// -// 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. -// - -// Buffer9.h: Defines the rx::Buffer9 class which implements rx::BufferImpl via rx::BufferD3D. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_BUFFER9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_BUFFER9_H_ - -#include "common/MemoryBuffer.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/renderer/d3d/BufferD3D.h" - -namespace rx -{ -class Renderer9; - -class Buffer9 : public BufferD3D -{ - public: - Buffer9(const gl::BufferState &state, Renderer9 *renderer); - ~Buffer9() override; - - // BufferD3D implementation - size_t getSize() const override; - bool supportsDirectBinding() const override; - gl::Error getData(const gl::Context *context, const uint8_t **outData) override; - - // BufferImpl implementation - gl::Error setData(const gl::Context *context, - gl::BufferBinding target, - const void *data, - size_t size, - gl::BufferUsage usage) override; - gl::Error setSubData(const gl::Context *context, - gl::BufferBinding target, - const void *data, - size_t size, - size_t offset) override; - gl::Error copySubData(const gl::Context *context, - BufferImpl *source, - GLintptr sourceOffset, - GLintptr destOffset, - GLsizeiptr size) override; - gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) override; - gl::Error mapRange(const gl::Context *context, - size_t offset, - size_t length, - GLbitfield access, - void **mapPtr) override; - gl::Error unmap(const gl::Context *context, GLboolean *result) override; - gl::Error markTransformFeedbackUsage(const gl::Context *context) override; - - private: - angle::MemoryBuffer mMemory; - size_t mSize; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D9_BUFFER9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp deleted file mode 100644 index 1b9874cc20..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp +++ /dev/null @@ -1,303 +0,0 @@ -// -// Copyright 2016 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. -// -// Context9: -// D3D9-specific functionality associated with a GL Context. -// - -#include "libANGLE/renderer/d3d/d3d9/Context9.h" - -#include "common/string_utils.h" -#include "libANGLE/renderer/d3d/CompilerD3D.h" -#include "libANGLE/renderer/d3d/ProgramD3D.h" -#include "libANGLE/renderer/d3d/RenderbufferD3D.h" -#include "libANGLE/renderer/d3d/SamplerD3D.h" -#include "libANGLE/renderer/d3d/ShaderD3D.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" -#include "libANGLE/renderer/d3d/d3d9/Buffer9.h" -#include "libANGLE/renderer/d3d/d3d9/Fence9.h" -#include "libANGLE/renderer/d3d/d3d9/Framebuffer9.h" -#include "libANGLE/renderer/d3d/d3d9/Query9.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" -#include "libANGLE/renderer/d3d/d3d9/StateManager9.h" -#include "libANGLE/renderer/d3d/d3d9/VertexArray9.h" - -namespace rx -{ - -Context9::Context9(const gl::ContextState &state, Renderer9 *renderer) - : ContextImpl(state), mRenderer(renderer) -{ -} - -Context9::~Context9() -{ -} - -gl::Error Context9::initialize() -{ - return gl::NoError(); -} - -CompilerImpl *Context9::createCompiler() -{ - return new CompilerD3D(SH_HLSL_3_0_OUTPUT); -} - -ShaderImpl *Context9::createShader(const gl::ShaderState &data) -{ - return new ShaderD3D(data, mRenderer->getWorkarounds(), mRenderer->getNativeExtensions()); -} - -ProgramImpl *Context9::createProgram(const gl::ProgramState &data) -{ - return new ProgramD3D(data, mRenderer); -} - -FramebufferImpl *Context9::createFramebuffer(const gl::FramebufferState &data) -{ - return new Framebuffer9(data, mRenderer); -} - -TextureImpl *Context9::createTexture(const gl::TextureState &state) -{ - switch (state.getTarget()) - { - case GL_TEXTURE_2D: - return new TextureD3D_2D(state, mRenderer); - case GL_TEXTURE_CUBE_MAP: - return new TextureD3D_Cube(state, mRenderer); - case GL_TEXTURE_EXTERNAL_OES: - return new TextureD3D_External(state, mRenderer); - default: - UNREACHABLE(); - } - return nullptr; -} - -RenderbufferImpl *Context9::createRenderbuffer() -{ - return new RenderbufferD3D(mRenderer); -} - -BufferImpl *Context9::createBuffer(const gl::BufferState &state) -{ - return new Buffer9(state, mRenderer); -} - -VertexArrayImpl *Context9::createVertexArray(const gl::VertexArrayState &data) -{ - return new VertexArray9(data); -} - -QueryImpl *Context9::createQuery(GLenum type) -{ - return new Query9(mRenderer, type); -} - -FenceNVImpl *Context9::createFenceNV() -{ - return new FenceNV9(mRenderer); -} - -SyncImpl *Context9::createSync() -{ - // D3D9 doesn't support ES 3.0 and its sync objects. - UNREACHABLE(); - return nullptr; -} - -TransformFeedbackImpl *Context9::createTransformFeedback(const gl::TransformFeedbackState &state) -{ - UNREACHABLE(); - return nullptr; -} - -SamplerImpl *Context9::createSampler(const gl::SamplerState &state) -{ - return new SamplerD3D(state); -} - -ProgramPipelineImpl *Context9::createProgramPipeline(const gl::ProgramPipelineState &data) -{ - UNREACHABLE(); - return nullptr; -} - -std::vector<PathImpl *> Context9::createPaths(GLsizei) -{ - return std::vector<PathImpl *>(); -} - -gl::Error Context9::flush(const gl::Context *context) -{ - return mRenderer->flush(); -} - -gl::Error Context9::finish(const gl::Context *context) -{ - return mRenderer->finish(); -} - -gl::Error Context9::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count) -{ - return mRenderer->genericDrawArrays(context, mode, first, count, 0); -} - -gl::Error Context9::drawArraysInstanced(const gl::Context *context, - GLenum mode, - GLint first, - GLsizei count, - GLsizei instanceCount) -{ - return mRenderer->genericDrawArrays(context, mode, first, count, instanceCount); -} - -gl::Error Context9::drawElements(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices) -{ - return mRenderer->genericDrawElements(context, mode, count, type, indices, 0); -} - -gl::Error Context9::drawElementsInstanced(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices, - GLsizei instances) -{ - return mRenderer->genericDrawElements(context, mode, count, type, indices, instances); -} - -gl::Error Context9::drawRangeElements(const gl::Context *context, - GLenum mode, - GLuint start, - GLuint end, - GLsizei count, - GLenum type, - const void *indices) -{ - return mRenderer->genericDrawElements(context, mode, count, type, indices, 0); -} - -gl::Error Context9::drawArraysIndirect(const gl::Context *context, - GLenum mode, - const void *indirect) -{ - UNREACHABLE(); - return gl::InternalError() << "D3D9 doesn't support ES 3.1 DrawArraysIndirect API"; -} - -gl::Error Context9::drawElementsIndirect(const gl::Context *context, - GLenum mode, - GLenum type, - const void *indirect) -{ - UNREACHABLE(); - return gl::InternalError() << "D3D9 doesn't support ES 3.1 DrawElementsIndirect API"; -} - -GLenum Context9::getResetStatus() -{ - return mRenderer->getResetStatus(); -} - -std::string Context9::getVendorString() const -{ - return mRenderer->getVendorString(); -} - -std::string Context9::getRendererDescription() const -{ - return mRenderer->getRendererDescription(); -} - -void Context9::insertEventMarker(GLsizei length, const char *marker) -{ - auto optionalString = angle::WidenString(static_cast<size_t>(length), marker); - if (optionalString.valid()) - { - mRenderer->getAnnotator()->setMarker(optionalString.value().data()); - } -} - -void Context9::pushGroupMarker(GLsizei length, const char *marker) -{ - auto optionalString = angle::WidenString(static_cast<size_t>(length), marker); - if (optionalString.valid()) - { - mRenderer->getAnnotator()->beginEvent(optionalString.value().data()); - } -} - -void Context9::popGroupMarker() -{ - mRenderer->getAnnotator()->endEvent(); -} - -void Context9::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message) -{ - // Fall through to the EXT_debug_marker functions - pushGroupMarker(length, message); -} - -void Context9::popDebugGroup() -{ - // Fall through to the EXT_debug_marker functions - popGroupMarker(); -} - -void Context9::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits) -{ - mRenderer->getStateManager()->syncState(mState.getState(), dirtyBits); -} - -GLint Context9::getGPUDisjoint() -{ - return mRenderer->getGPUDisjoint(); -} - -GLint64 Context9::getTimestamp() -{ - return mRenderer->getTimestamp(); -} - -void Context9::onMakeCurrent(const gl::Context *context) -{ -} - -const gl::Caps &Context9::getNativeCaps() const -{ - return mRenderer->getNativeCaps(); -} - -const gl::TextureCapsMap &Context9::getNativeTextureCaps() const -{ - return mRenderer->getNativeTextureCaps(); -} - -const gl::Extensions &Context9::getNativeExtensions() const -{ - return mRenderer->getNativeExtensions(); -} - -const gl::Limitations &Context9::getNativeLimitations() const -{ - return mRenderer->getNativeLimitations(); -} - -gl::Error Context9::dispatchCompute(const gl::Context *context, - GLuint numGroupsX, - GLuint numGroupsY, - GLuint numGroupsZ) -{ - UNREACHABLE(); - return gl::InternalError() << "D3D9 doesn't support ES 3.1 DispatchCompute API"; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h deleted file mode 100644 index d681bfde89..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h +++ /dev/null @@ -1,151 +0,0 @@ -// -// Copyright 2016 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. -// -// Context9: -// D3D9-specific functionality associated with a GL Context. -// - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_CONTEXT9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_CONTEXT9_H_ - -#include "libANGLE/renderer/ContextImpl.h" - -namespace rx -{ -class Renderer9; - -class Context9 : public ContextImpl -{ - public: - Context9(const gl::ContextState &state, Renderer9 *renderer); - ~Context9() override; - - gl::Error initialize() override; - - // Shader creation - CompilerImpl *createCompiler() override; - ShaderImpl *createShader(const gl::ShaderState &data) override; - ProgramImpl *createProgram(const gl::ProgramState &data) override; - - // Framebuffer creation - FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override; - - // Texture creation - TextureImpl *createTexture(const gl::TextureState &state) override; - - // Renderbuffer creation - RenderbufferImpl *createRenderbuffer() override; - - // Buffer creation - BufferImpl *createBuffer(const gl::BufferState &state) override; - - // Vertex Array creation - VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override; - - // Query and Fence creation - QueryImpl *createQuery(GLenum type) override; - FenceNVImpl *createFenceNV() override; - SyncImpl *createSync() override; - - // Transform Feedback creation - TransformFeedbackImpl *createTransformFeedback( - const gl::TransformFeedbackState &state) override; - - // Sampler object creation - SamplerImpl *createSampler(const gl::SamplerState &state) override; - - // Program Pipeline object creation - ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override; - - // Path object creation - std::vector<PathImpl *> createPaths(GLsizei) override; - - // Flush and finish. - gl::Error flush(const gl::Context *context) override; - gl::Error finish(const gl::Context *context) override; - - // Drawing methods. - gl::Error drawArrays(const gl::Context *context, - GLenum mode, - GLint first, - GLsizei count) override; - gl::Error drawArraysInstanced(const gl::Context *context, - GLenum mode, - GLint first, - GLsizei count, - GLsizei instanceCount) override; - - gl::Error drawElements(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices) override; - gl::Error drawElementsInstanced(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices, - GLsizei instances) override; - gl::Error drawRangeElements(const gl::Context *context, - GLenum mode, - GLuint start, - GLuint end, - GLsizei count, - GLenum type, - const void *indices) override; - gl::Error drawArraysIndirect(const gl::Context *context, - GLenum mode, - const void *indirect) override; - gl::Error drawElementsIndirect(const gl::Context *context, - GLenum mode, - GLenum type, - const void *indirect) override; - - // Device loss - GLenum getResetStatus() override; - - // Vendor and description strings. - std::string getVendorString() const override; - std::string getRendererDescription() const override; - - // EXT_debug_marker - void insertEventMarker(GLsizei length, const char *marker) override; - void pushGroupMarker(GLsizei length, const char *marker) override; - void popGroupMarker() override; - - // KHR_debug - void pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message) override; - void popDebugGroup() override; - - // State sync with dirty bits. - void syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits) override; - - // Disjoint timer queries - GLint getGPUDisjoint() override; - GLint64 getTimestamp() override; - - // Context switching - void onMakeCurrent(const gl::Context *context) override; - - // Caps queries - const gl::Caps &getNativeCaps() const override; - const gl::TextureCapsMap &getNativeTextureCaps() const override; - const gl::Extensions &getNativeExtensions() const override; - const gl::Limitations &getNativeLimitations() const override; - - gl::Error dispatchCompute(const gl::Context *context, - GLuint numGroupsX, - GLuint numGroupsY, - GLuint numGroupsZ) override; - - Renderer9 *getRenderer() const { return mRenderer; } - - private: - Renderer9 *mRenderer; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D9_CONTEXT9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp deleted file mode 100644 index 6ec35e16a7..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// -// Copyright 2015 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. -// -// DebugAnnotator9.h: D3D9 helpers for adding trace annotations. -// - -#include "libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h" - -#include "common/platform.h" - -namespace rx -{ - -void DebugAnnotator9::beginEvent(const wchar_t *eventName) -{ - D3DPERF_BeginEvent(0, eventName); -} - -void DebugAnnotator9::endEvent() -{ - D3DPERF_EndEvent(); -} - -void DebugAnnotator9::setMarker(const wchar_t *markerName) -{ - D3DPERF_SetMarker(0, markerName); -} - -bool DebugAnnotator9::getStatus() -{ - return !!D3DPERF_GetStatus(); -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h deleted file mode 100644 index b28008335f..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright 2015 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. -// -// DebugAnnotator9.h: D3D9 helpers for adding trace annotations. -// - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_DEBUGANNOTATOR9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_DEBUGANNOTATOR9_H_ - -#include "libANGLE/LoggingAnnotator.h" - -namespace rx -{ - -class DebugAnnotator9 : public angle::LoggingAnnotator -{ - public: - DebugAnnotator9() {} - void beginEvent(const wchar_t *eventName) override; - void endEvent() override; - void setMarker(const wchar_t *markerName) override; - bool getStatus() override; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_DEBUGANNOTATOR9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp deleted file mode 100644 index bff3881655..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp +++ /dev/null @@ -1,91 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// Fence9.cpp: Defines the rx::FenceNV9 class. - -#include "libANGLE/renderer/d3d/d3d9/Fence9.h" -#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" - -namespace rx -{ - -FenceNV9::FenceNV9(Renderer9 *renderer) : FenceNVImpl(), mRenderer(renderer), mQuery(nullptr) -{ -} - -FenceNV9::~FenceNV9() -{ - SafeRelease(mQuery); -} - -gl::Error FenceNV9::set(GLenum condition) -{ - if (!mQuery) - { - gl::Error error = mRenderer->allocateEventQuery(&mQuery); - if (error.isError()) - { - return error; - } - } - - HRESULT result = mQuery->Issue(D3DISSUE_END); - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - SafeRelease(mQuery); - return gl::OutOfMemory() << "Failed to end event query, " << gl::FmtHR(result); - } - - return gl::NoError(); -} - -gl::Error FenceNV9::test(GLboolean *outFinished) -{ - return testHelper(true, outFinished); -} - -gl::Error FenceNV9::finish() -{ - GLboolean finished = GL_FALSE; - while (finished != GL_TRUE) - { - gl::Error error = testHelper(true, &finished); - if (error.isError()) - { - return error; - } - - Sleep(0); - } - - return gl::NoError(); -} - -gl::Error FenceNV9::testHelper(bool flushCommandBuffer, GLboolean *outFinished) -{ - ASSERT(mQuery); - - DWORD getDataFlags = (flushCommandBuffer ? D3DGETDATA_FLUSH : 0); - HRESULT result = mQuery->GetData(nullptr, 0, getDataFlags); - - if (d3d9::isDeviceLostError(result)) - { - mRenderer->notifyDeviceLost(); - return gl::OutOfMemory() << "Device was lost while querying result of an event query."; - } - else if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to get query data, " << gl::FmtHR(result); - } - - ASSERT(result == S_OK || result == S_FALSE); - *outFinished = ((result == S_OK) ? GL_TRUE : GL_FALSE); - return gl::NoError(); -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.h deleted file mode 100644 index de0ff20774..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// Fence9.h: Defines the rx::FenceNV9 class which implements rx::FenceNVImpl. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_FENCE9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_FENCE9_H_ - -#include "libANGLE/renderer/FenceNVImpl.h" -#include "libANGLE/renderer/SyncImpl.h" - -namespace rx -{ -class Renderer9; - -class FenceNV9 : public FenceNVImpl -{ - public: - explicit FenceNV9(Renderer9 *renderer); - ~FenceNV9() override; - - gl::Error set(GLenum condition) override; - gl::Error test(GLboolean *outFinished) override; - gl::Error finish() override; - - private: - gl::Error testHelper(bool flushCommandBuffer, GLboolean *outFinished); - - Renderer9 *mRenderer; - IDirect3DQuery9 *mQuery; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_FENCE9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp deleted file mode 100644 index dff12e03f8..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp +++ /dev/null @@ -1,411 +0,0 @@ -// -// 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. -// - -// Framebuffer9.cpp: Implements the Framebuffer9 class. - -#include "libANGLE/renderer/d3d/d3d9/Framebuffer9.h" - -#include "libANGLE/Context.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/Texture.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/ContextImpl.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" -#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" -#include "libANGLE/renderer/d3d/d3d9/TextureStorage9.h" -#include "libANGLE/renderer/d3d/d3d9/formatutils9.h" -#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" -#include "libANGLE/renderer/renderer_utils.h" - -namespace rx -{ - -Framebuffer9::Framebuffer9(const gl::FramebufferState &data, Renderer9 *renderer) - : FramebufferD3D(data, renderer), mRenderer(renderer) -{ - ASSERT(mRenderer != nullptr); -} - -Framebuffer9::~Framebuffer9() -{ -} - -gl::Error Framebuffer9::discard(const gl::Context *context, size_t, const GLenum *) -{ - // Extension not implemented in D3D9 renderer - UNREACHABLE(); - return gl::NoError(); -} - -gl::Error Framebuffer9::invalidate(const gl::Context *context, size_t, const GLenum *) -{ - // Shouldn't ever reach here in D3D9 - UNREACHABLE(); - return gl::NoError(); -} - -gl::Error Framebuffer9::invalidateSub(const gl::Context *context, - size_t, - const GLenum *, - const gl::Rectangle &) -{ - // Shouldn't ever reach here in D3D9 - UNREACHABLE(); - return gl::NoError(); -} - -gl::Error Framebuffer9::clearImpl(const gl::Context *context, const ClearParameters &clearParams) -{ - const gl::FramebufferAttachment *colorAttachment = mState.getColorAttachment(0); - const gl::FramebufferAttachment *depthStencilAttachment = mState.getDepthOrStencilAttachment(); - - ANGLE_TRY(mRenderer->applyRenderTarget(context, colorAttachment, depthStencilAttachment)); - - const gl::State &glState = context->getGLState(); - float nearZ = glState.getNearPlane(); - float farZ = glState.getFarPlane(); - mRenderer->setViewport(glState.getViewport(), nearZ, farZ, GL_TRIANGLES, - glState.getRasterizerState().frontFace, true); - - mRenderer->setScissorRectangle(glState.getScissor(), glState.isScissorTestEnabled()); - - return mRenderer->clear(context, clearParams, colorAttachment, depthStencilAttachment); -} - -gl::Error Framebuffer9::readPixelsImpl(const gl::Context *context, - const gl::Rectangle &area, - GLenum format, - GLenum type, - size_t outputPitch, - const gl::PixelPackState &pack, - uint8_t *pixels) -{ - const gl::FramebufferAttachment *colorbuffer = mState.getColorAttachment(0); - ASSERT(colorbuffer); - - RenderTarget9 *renderTarget = nullptr; - ANGLE_TRY(colorbuffer->getRenderTarget(context, &renderTarget)); - ASSERT(renderTarget); - - IDirect3DSurface9 *surface = renderTarget->getSurface(); - ASSERT(surface); - - D3DSURFACE_DESC desc; - surface->GetDesc(&desc); - - if (desc.MultiSampleType != D3DMULTISAMPLE_NONE) - { - UNIMPLEMENTED(); // FIXME: Requires resolve using StretchRect into non-multisampled render target - SafeRelease(surface); - return gl::OutOfMemory() - << "ReadPixels is unimplemented for multisampled framebuffer attachments."; - } - - IDirect3DDevice9 *device = mRenderer->getDevice(); - ASSERT(device); - - HRESULT result; - IDirect3DSurface9 *systemSurface = nullptr; - bool directToPixels = !pack.reverseRowOrder && pack.alignment <= 4 && mRenderer->getShareHandleSupport() && - area.x == 0 && area.y == 0 && - static_cast<UINT>(area.width) == desc.Width && static_cast<UINT>(area.height) == desc.Height && - desc.Format == D3DFMT_A8R8G8B8 && format == GL_BGRA_EXT && type == GL_UNSIGNED_BYTE; - if (directToPixels) - { - // Use the pixels ptr as a shared handle to write directly into client's memory - result = device->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, - D3DPOOL_SYSTEMMEM, &systemSurface, reinterpret_cast<void**>(&pixels)); - if (FAILED(result)) - { - // Try again without the shared handle - directToPixels = false; - } - } - - if (!directToPixels) - { - result = device->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, - D3DPOOL_SYSTEMMEM, &systemSurface, nullptr); - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - SafeRelease(surface); - return gl::OutOfMemory() << "Failed to allocate internal texture for ReadPixels."; - } - } - - result = device->GetRenderTargetData(surface, systemSurface); - SafeRelease(surface); - - if (FAILED(result)) - { - SafeRelease(systemSurface); - - // It turns out that D3D will sometimes produce more error - // codes than those documented. - if (d3d9::isDeviceLostError(result)) - { - mRenderer->notifyDeviceLost(); - } - else - { - UNREACHABLE(); - } - - return gl::OutOfMemory() << "Failed to read internal render target data."; - } - - if (directToPixels) - { - SafeRelease(systemSurface); - return gl::NoError(); - } - - RECT rect; - rect.left = gl::clamp(area.x, 0L, static_cast<LONG>(desc.Width)); - rect.top = gl::clamp(area.y, 0L, static_cast<LONG>(desc.Height)); - rect.right = gl::clamp(area.x + area.width, 0L, static_cast<LONG>(desc.Width)); - rect.bottom = gl::clamp(area.y + area.height, 0L, static_cast<LONG>(desc.Height)); - - D3DLOCKED_RECT lock; - result = systemSurface->LockRect(&lock, &rect, D3DLOCK_READONLY); - - if (FAILED(result)) - { - UNREACHABLE(); - SafeRelease(systemSurface); - - return gl::OutOfMemory() << "Failed to lock internal render target."; - } - - uint8_t *source = reinterpret_cast<uint8_t *>(lock.pBits); - int inputPitch = lock.Pitch; - - const d3d9::D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(desc.Format); - gl::FormatType formatType(format, type); - - PackPixelsParams packParams; - packParams.area.x = rect.left; - packParams.area.y = rect.top; - packParams.area.width = rect.right - rect.left; - packParams.area.height = rect.bottom - rect.top; - packParams.format = format; - packParams.type = type; - packParams.outputPitch = static_cast<GLuint>(outputPitch); - packParams.pack = pack; - - PackPixels(packParams, d3dFormatInfo.info(), inputPitch, source, pixels); - - systemSurface->UnlockRect(); - SafeRelease(systemSurface); - - return gl::NoError(); -} - -gl::Error Framebuffer9::blitImpl(const gl::Context *context, - const gl::Rectangle &sourceArea, - const gl::Rectangle &destArea, - const gl::Rectangle *scissor, - bool blitRenderTarget, - bool blitDepth, - bool blitStencil, - GLenum filter, - const gl::Framebuffer *sourceFramebuffer) -{ - ASSERT(filter == GL_NEAREST); - - IDirect3DDevice9 *device = mRenderer->getDevice(); - ASSERT(device); - - mRenderer->endScene(); - - if (blitRenderTarget) - { - const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getColorbuffer(0); - ASSERT(readBuffer); - - RenderTarget9 *readRenderTarget = nullptr; - gl::Error error = readBuffer->getRenderTarget(context, &readRenderTarget); - if (error.isError()) - { - return error; - } - ASSERT(readRenderTarget); - - const gl::FramebufferAttachment *drawBuffer = mState.getColorAttachment(0); - ASSERT(drawBuffer); - - RenderTarget9 *drawRenderTarget = nullptr; - error = drawBuffer->getRenderTarget(context, &drawRenderTarget); - if (error.isError()) - { - return error; - } - ASSERT(drawRenderTarget); - - // The getSurface calls do an AddRef so save them until after no errors are possible - IDirect3DSurface9* readSurface = readRenderTarget->getSurface(); - ASSERT(readSurface); - - IDirect3DSurface9* drawSurface = drawRenderTarget->getSurface(); - ASSERT(drawSurface); - - gl::Extents srcSize(readRenderTarget->getWidth(), readRenderTarget->getHeight(), 1); - gl::Extents dstSize(drawRenderTarget->getWidth(), drawRenderTarget->getHeight(), 1); - - RECT srcRect; - srcRect.left = sourceArea.x; - srcRect.right = sourceArea.x + sourceArea.width; - srcRect.top = sourceArea.y; - srcRect.bottom = sourceArea.y + sourceArea.height; - - RECT dstRect; - dstRect.left = destArea.x; - dstRect.right = destArea.x + destArea.width; - dstRect.top = destArea.y; - dstRect.bottom = destArea.y + destArea.height; - - // Clip the rectangles to the scissor rectangle - if (scissor) - { - if (dstRect.left < scissor->x) - { - srcRect.left += (scissor->x - dstRect.left); - dstRect.left = scissor->x; - } - if (dstRect.top < scissor->y) - { - srcRect.top += (scissor->y - dstRect.top); - dstRect.top = scissor->y; - } - if (dstRect.right > scissor->x + scissor->width) - { - srcRect.right -= (dstRect.right - (scissor->x + scissor->width)); - dstRect.right = scissor->x + scissor->width; - } - if (dstRect.bottom > scissor->y + scissor->height) - { - srcRect.bottom -= (dstRect.bottom - (scissor->y + scissor->height)); - dstRect.bottom = scissor->y + scissor->height; - } - } - - // Clip the rectangles to the destination size - if (dstRect.left < 0) - { - srcRect.left += -dstRect.left; - dstRect.left = 0; - } - if (dstRect.right > dstSize.width) - { - srcRect.right -= (dstRect.right - dstSize.width); - dstRect.right = dstSize.width; - } - if (dstRect.top < 0) - { - srcRect.top += -dstRect.top; - dstRect.top = 0; - } - if (dstRect.bottom > dstSize.height) - { - srcRect.bottom -= (dstRect.bottom - dstSize.height); - dstRect.bottom = dstSize.height; - } - - // Clip the rectangles to the source size - if (srcRect.left < 0) - { - dstRect.left += -srcRect.left; - srcRect.left = 0; - } - if (srcRect.right > srcSize.width) - { - dstRect.right -= (srcRect.right - srcSize.width); - srcRect.right = srcSize.width; - } - if (srcRect.top < 0) - { - dstRect.top += -srcRect.top; - srcRect.top = 0; - } - if (srcRect.bottom > srcSize.height) - { - dstRect.bottom -= (srcRect.bottom - srcSize.height); - srcRect.bottom = srcSize.height; - } - - HRESULT result = device->StretchRect(readSurface, &srcRect, drawSurface, &dstRect, D3DTEXF_NONE); - - SafeRelease(readSurface); - SafeRelease(drawSurface); - - if (FAILED(result)) - { - return gl::OutOfMemory() << "Internal blit failed, StretchRect " << gl::FmtHR(result); - } - } - - if (blitDepth || blitStencil) - { - const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getDepthOrStencilbuffer(); - ASSERT(readBuffer); - - RenderTarget9 *readDepthStencil = nullptr; - gl::Error error = readBuffer->getRenderTarget(context, &readDepthStencil); - if (error.isError()) - { - return error; - } - ASSERT(readDepthStencil); - - const gl::FramebufferAttachment *drawBuffer = mState.getDepthOrStencilAttachment(); - ASSERT(drawBuffer); - - RenderTarget9 *drawDepthStencil = nullptr; - error = drawBuffer->getRenderTarget(context, &drawDepthStencil); - if (error.isError()) - { - return error; - } - ASSERT(drawDepthStencil); - - // The getSurface calls do an AddRef so save them until after no errors are possible - IDirect3DSurface9* readSurface = readDepthStencil->getSurface(); - ASSERT(readDepthStencil); - - IDirect3DSurface9* drawSurface = drawDepthStencil->getSurface(); - ASSERT(drawDepthStencil); - - HRESULT result = device->StretchRect(readSurface, nullptr, drawSurface, nullptr, D3DTEXF_NONE); - - SafeRelease(readSurface); - SafeRelease(drawSurface); - - if (FAILED(result)) - { - return gl::OutOfMemory() << "Internal blit failed, StretchRect " << gl::FmtHR(result); - } - } - - return gl::NoError(); -} - -GLenum Framebuffer9::getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const -{ - RenderTarget9 *renderTarget9 = GetAs<RenderTarget9>(renderTarget); - const d3d9::D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(renderTarget9->getD3DFormat()); - return d3dFormatInfo.info().glInternalFormat; -} - -gl::Error Framebuffer9::getSamplePosition(size_t index, GLfloat *xy) const -{ - UNREACHABLE(); - return gl::InternalError() << "getSamplePosition is unsupported to d3d9."; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h deleted file mode 100644 index d2b46435ee..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h +++ /dev/null @@ -1,63 +0,0 @@ -// -// 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. -// - -// Framebuffer9.h: Defines the Framebuffer9 class. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_FRAMBUFFER9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_FRAMBUFFER9_H_ - -#include "libANGLE/renderer/d3d/FramebufferD3D.h" - -namespace rx -{ -class Renderer9; - -class Framebuffer9 : public FramebufferD3D -{ - public: - Framebuffer9(const gl::FramebufferState &data, Renderer9 *renderer); - ~Framebuffer9() override; - - gl::Error discard(const gl::Context *context, size_t count, const GLenum *attachments) override; - gl::Error invalidate(const gl::Context *context, - size_t count, - const GLenum *attachments) override; - gl::Error invalidateSub(const gl::Context *context, - size_t count, - const GLenum *attachments, - const gl::Rectangle &area) override; - - gl::Error getSamplePosition(size_t index, GLfloat *xy) const override; - - private: - gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) override; - - gl::Error readPixelsImpl(const gl::Context *context, - const gl::Rectangle &area, - GLenum format, - GLenum type, - size_t outputPitch, - const gl::PixelPackState &pack, - uint8_t *pixels) override; - - gl::Error blitImpl(const gl::Context *context, - const gl::Rectangle &sourceArea, - const gl::Rectangle &destArea, - const gl::Rectangle *scissor, - bool blitRenderTarget, - bool blitDepth, - bool blitStencil, - GLenum filter, - const gl::Framebuffer *sourceFramebuffer) override; - - GLenum getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const override; - - Renderer9 *const mRenderer; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_FRAMBUFFER9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp deleted file mode 100644 index 179629b362..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp +++ /dev/null @@ -1,920 +0,0 @@ -// -// Copyright (c) 2002-2012 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. -// - -// Image9.cpp: Implements the rx::Image9 class, which acts as the interface to -// the actual underlying surfaces of a Texture. - -#include "libANGLE/renderer/d3d/d3d9/Image9.h" -#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" -#include "libANGLE/renderer/d3d/d3d9/formatutils9.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" -#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h" -#include "libANGLE/renderer/d3d/d3d9/TextureStorage9.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/Renderbuffer.h" -#include "common/utilities.h" - -namespace rx -{ - -Image9::Image9(Renderer9 *renderer) -{ - mSurface = nullptr; - mRenderer = nullptr; - - mD3DPool = D3DPOOL_SYSTEMMEM; - mD3DFormat = D3DFMT_UNKNOWN; - - mRenderer = renderer; -} - -Image9::~Image9() -{ - SafeRelease(mSurface); -} - -gl::Error Image9::generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9 *sourceSurface) -{ - D3DSURFACE_DESC destDesc; - HRESULT result = destSurface->GetDesc(&destDesc); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to query the source surface description for mipmap generation, " - << gl::FmtHR(result); - } - - D3DSURFACE_DESC sourceDesc; - result = sourceSurface->GetDesc(&sourceDesc); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to query the destination surface description for mipmap generation, " - << gl::FmtHR(result); - } - - ASSERT(sourceDesc.Format == destDesc.Format); - ASSERT(sourceDesc.Width == 1 || sourceDesc.Width / 2 == destDesc.Width); - ASSERT(sourceDesc.Height == 1 || sourceDesc.Height / 2 == destDesc.Height); - - const d3d9::D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(sourceDesc.Format); - ASSERT(d3dFormatInfo.info().mipGenerationFunction != nullptr); - - D3DLOCKED_RECT sourceLocked = {0}; - result = sourceSurface->LockRect(&sourceLocked, nullptr, D3DLOCK_READONLY); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to lock the source surface for mipmap generation, " - << gl::FmtHR(result); - } - - D3DLOCKED_RECT destLocked = {0}; - result = destSurface->LockRect(&destLocked, nullptr, 0); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - sourceSurface->UnlockRect(); - return gl::OutOfMemory() << "Failed to lock the destination surface for mipmap generation, " - << gl::FmtHR(result); - } - - const uint8_t *sourceData = reinterpret_cast<const uint8_t*>(sourceLocked.pBits); - uint8_t *destData = reinterpret_cast<uint8_t*>(destLocked.pBits); - - ASSERT(sourceData && destData); - - d3dFormatInfo.info().mipGenerationFunction(sourceDesc.Width, sourceDesc.Height, 1, sourceData, - sourceLocked.Pitch, 0, destData, destLocked.Pitch, - 0); - - destSurface->UnlockRect(); - sourceSurface->UnlockRect(); - - return gl::NoError(); -} - -gl::Error Image9::generateMipmap(Image9 *dest, Image9 *source) -{ - IDirect3DSurface9 *sourceSurface = nullptr; - ANGLE_TRY(source->getSurface(&sourceSurface)); - - IDirect3DSurface9 *destSurface = nullptr; - ANGLE_TRY(dest->getSurface(&destSurface)); - - ANGLE_TRY(generateMip(destSurface, sourceSurface)); - - dest->markDirty(); - - return gl::NoError(); -} - -gl::Error Image9::copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface9 *source) -{ - D3DLOCKED_RECT sourceLock = {0}; - D3DLOCKED_RECT destLock = {0}; - - HRESULT result; - - result = source->LockRect(&sourceLock, nullptr, 0); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to lock source surface for copy, " << gl::FmtHR(result); - } - - result = dest->LockRect(&destLock, nullptr, 0); - if (FAILED(result)) - { - source->UnlockRect(); - return gl::OutOfMemory() << "Failed to lock source surface for copy, " << gl::FmtHR(result); - } - - ASSERT(sourceLock.pBits && destLock.pBits); - - D3DSURFACE_DESC desc; - source->GetDesc(&desc); - - const d3d9::D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(desc.Format); - unsigned int rows = desc.Height / d3dFormatInfo.blockHeight; - - unsigned int bytes = d3d9::ComputeBlockSize(desc.Format, desc.Width, d3dFormatInfo.blockHeight); - ASSERT(bytes <= static_cast<unsigned int>(sourceLock.Pitch) && - bytes <= static_cast<unsigned int>(destLock.Pitch)); - - for(unsigned int i = 0; i < rows; i++) - { - memcpy((char*)destLock.pBits + destLock.Pitch * i, (char*)sourceLock.pBits + sourceLock.Pitch * i, bytes); - } - - source->UnlockRect(); - dest->UnlockRect(); - - return gl::NoError(); -} - -// static -gl::Error Image9::CopyImage(const gl::Context *context, - Image9 *dest, - Image9 *source, - const gl::Rectangle &sourceRect, - const gl::Offset &destOffset, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) -{ - IDirect3DSurface9 *sourceSurface = nullptr; - ANGLE_TRY(source->getSurface(&sourceSurface)); - - IDirect3DSurface9 *destSurface = nullptr; - ANGLE_TRY(dest->getSurface(&destSurface)); - - D3DSURFACE_DESC destDesc; - HRESULT result = destSurface->GetDesc(&destDesc); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to query the source surface description for mipmap generation, " - << gl::FmtHR(result); - } - const d3d9::D3DFormat &destD3DFormatInfo = d3d9::GetD3DFormatInfo(destDesc.Format); - - D3DSURFACE_DESC sourceDesc; - result = sourceSurface->GetDesc(&sourceDesc); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to query the destination surface description for mipmap generation, " - << gl::FmtHR(result); - } - const d3d9::D3DFormat &sourceD3DFormatInfo = d3d9::GetD3DFormatInfo(sourceDesc.Format); - - D3DLOCKED_RECT sourceLocked = {0}; - result = sourceSurface->LockRect(&sourceLocked, nullptr, D3DLOCK_READONLY); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to lock the source surface for CopyImage, " - << gl::FmtHR(result); - } - - D3DLOCKED_RECT destLocked = {0}; - result = destSurface->LockRect(&destLocked, nullptr, 0); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - sourceSurface->UnlockRect(); - return gl::OutOfMemory() << "Failed to lock the destination surface for CopyImage, " - << gl::FmtHR(result); - } - - const uint8_t *sourceData = reinterpret_cast<const uint8_t *>(sourceLocked.pBits) + - sourceRect.x * sourceD3DFormatInfo.pixelBytes + - sourceRect.y * sourceLocked.Pitch; - uint8_t *destData = reinterpret_cast<uint8_t *>(destLocked.pBits) + - destOffset.x * destD3DFormatInfo.pixelBytes + - destOffset.y * destLocked.Pitch; - ASSERT(sourceData && destData); - - CopyImageCHROMIUM(sourceData, sourceLocked.Pitch, sourceD3DFormatInfo.pixelBytes, - sourceD3DFormatInfo.info().colorReadFunction, destData, destLocked.Pitch, - destD3DFormatInfo.pixelBytes, destD3DFormatInfo.info().colorWriteFunction, - gl::GetUnsizedFormat(dest->getInternalFormat()), - destD3DFormatInfo.info().componentType, sourceRect.width, sourceRect.height, - unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha); - - destSurface->UnlockRect(); - sourceSurface->UnlockRect(); - - return gl::NoError(); -} - -bool Image9::redefine(GLenum target, GLenum internalformat, const gl::Extents &size, bool forceRelease) -{ - // 3D textures are not supported by the D3D9 backend. - ASSERT(size.depth <= 1); - - // Only 2D and cube texture are supported by the D3D9 backend. - ASSERT(target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP); - - if (mWidth != size.width || - mHeight != size.height || - mDepth != size.depth || - mInternalFormat != internalformat || - forceRelease) - { - mWidth = size.width; - mHeight = size.height; - mDepth = size.depth; - mInternalFormat = internalformat; - - // compute the d3d format that will be used - const d3d9::TextureFormat &d3d9FormatInfo = d3d9::GetTextureFormatInfo(internalformat); - mD3DFormat = d3d9FormatInfo.texFormat; - mRenderable = (d3d9FormatInfo.renderFormat != D3DFMT_UNKNOWN); - - SafeRelease(mSurface); - mDirty = (d3d9FormatInfo.dataInitializerFunction != nullptr); - - return true; - } - - return false; -} - -gl::Error Image9::createSurface() -{ - if (mSurface) - { - return gl::NoError(); - } - - IDirect3DTexture9 *newTexture = nullptr; - IDirect3DSurface9 *newSurface = nullptr; - const D3DPOOL poolToUse = D3DPOOL_SYSTEMMEM; - const D3DFORMAT d3dFormat = getD3DFormat(); - - if (mWidth != 0 && mHeight != 0) - { - int levelToFetch = 0; - GLsizei requestWidth = mWidth; - GLsizei requestHeight = mHeight; - d3d9::MakeValidSize(true, d3dFormat, &requestWidth, &requestHeight, &levelToFetch); - - IDirect3DDevice9 *device = mRenderer->getDevice(); - - HRESULT result = device->CreateTexture(requestWidth, requestHeight, levelToFetch + 1, 0, - d3dFormat, poolToUse, &newTexture, nullptr); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() << "Failed to create image surface, " << gl::FmtHR(result); - } - - newTexture->GetSurfaceLevel(levelToFetch, &newSurface); - SafeRelease(newTexture); - - const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(mInternalFormat); - if (d3dFormatInfo.dataInitializerFunction != nullptr) - { - RECT entireRect; - entireRect.left = 0; - entireRect.right = mWidth; - entireRect.top = 0; - entireRect.bottom = mHeight; - - D3DLOCKED_RECT lockedRect; - result = newSurface->LockRect(&lockedRect, &entireRect, 0); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to lock image surface, " << gl::FmtHR(result); - } - - d3dFormatInfo.dataInitializerFunction(mWidth, mHeight, 1, reinterpret_cast<uint8_t*>(lockedRect.pBits), - lockedRect.Pitch, 0); - - result = newSurface->UnlockRect(); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to unlock image surface, " << gl::FmtHR(result); - } - } - } - - mSurface = newSurface; - mDirty = false; - mD3DPool = poolToUse; - - return gl::NoError(); -} - -gl::Error Image9::lock(D3DLOCKED_RECT *lockedRect, const RECT &rect) -{ - gl::Error error = createSurface(); - if (error.isError()) - { - return error; - } - - if (mSurface) - { - HRESULT result = mSurface->LockRect(lockedRect, &rect, 0); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to lock image surface, " << gl::FmtHR(result); - } - - mDirty = true; - } - - return gl::NoError(); -} - -void Image9::unlock() -{ - if (mSurface) - { - HRESULT result = mSurface->UnlockRect(); - ASSERT(SUCCEEDED(result)); - } -} - -D3DFORMAT Image9::getD3DFormat() const -{ - // this should only happen if the image hasn't been redefined first - // which would be a bug by the caller - ASSERT(mD3DFormat != D3DFMT_UNKNOWN); - - return mD3DFormat; -} - -bool Image9::isDirty() const -{ - // Make sure to that this image is marked as dirty even if the staging texture hasn't been created yet - // if initialization is required before use. - return (mSurface || - d3d9::GetTextureFormatInfo(mInternalFormat).dataInitializerFunction != nullptr) && - mDirty; -} - -gl::Error Image9::getSurface(IDirect3DSurface9 **outSurface) -{ - gl::Error error = createSurface(); - if (error.isError()) - { - return error; - } - - *outSurface = mSurface; - return gl::NoError(); -} - -gl::Error Image9::setManagedSurface2D(const gl::Context *context, - TextureStorage *storage, - int level) -{ - IDirect3DSurface9 *surface = nullptr; - TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage); - gl::Error error = storage9->getSurfaceLevel(context, GL_TEXTURE_2D, level, false, &surface); - if (error.isError()) - { - return error; - } - return setManagedSurface(surface); -} - -gl::Error Image9::setManagedSurfaceCube(const gl::Context *context, - TextureStorage *storage, - int face, - int level) -{ - IDirect3DSurface9 *surface = nullptr; - TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage); - gl::Error error = storage9->getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, - level, false, &surface); - if (error.isError()) - { - return error; - } - return setManagedSurface(surface); -} - -gl::Error Image9::setManagedSurface(IDirect3DSurface9 *surface) -{ - D3DSURFACE_DESC desc; - surface->GetDesc(&desc); - ASSERT(desc.Pool == D3DPOOL_MANAGED); - - if ((GLsizei)desc.Width == mWidth && (GLsizei)desc.Height == mHeight) - { - if (mSurface) - { - gl::Error error = copyLockableSurfaces(surface, mSurface); - SafeRelease(mSurface); - if (error.isError()) - { - return error; - } - } - - mSurface = surface; - mD3DPool = desc.Pool; - } - - return gl::NoError(); -} - -gl::Error Image9::copyToStorage(const gl::Context *context, - TextureStorage *storage, - const gl::ImageIndex &index, - const gl::Box ®ion) -{ - gl::Error error = createSurface(); - if (error.isError()) - { - return error; - } - - TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage); - - IDirect3DSurface9 *destSurface = nullptr; - - if (index.type == GL_TEXTURE_2D) - { - error = - storage9->getSurfaceLevel(context, GL_TEXTURE_2D, index.mipIndex, true, &destSurface); - if (error.isError()) - { - return error; - } - } - else - { - ASSERT(gl::IsCubeMapTextureTarget(index.type)); - error = storage9->getSurfaceLevel(context, index.type, index.mipIndex, true, &destSurface); - if (error.isError()) - { - return error; - } - } - - error = copyToSurface(destSurface, region); - SafeRelease(destSurface); - return error; -} - -gl::Error Image9::copyToSurface(IDirect3DSurface9 *destSurface, const gl::Box &area) -{ - ASSERT(area.width > 0 && area.height > 0 && area.depth == 1); - ASSERT(destSurface); - - IDirect3DSurface9 *sourceSurface = nullptr; - gl::Error error = getSurface(&sourceSurface); - if (error.isError()) - { - return error; - } - - ASSERT(sourceSurface && sourceSurface != destSurface); - - RECT rect; - rect.left = area.x; - rect.top = area.y; - rect.right = area.x + area.width; - rect.bottom = area.y + area.height; - - POINT point = {rect.left, rect.top}; - - IDirect3DDevice9 *device = mRenderer->getDevice(); - - if (mD3DPool == D3DPOOL_MANAGED) - { - D3DSURFACE_DESC desc; - sourceSurface->GetDesc(&desc); - - IDirect3DSurface9 *surf = 0; - HRESULT result = device->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, - D3DPOOL_SYSTEMMEM, &surf, nullptr); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Internal CreateOffscreenPlainSurface call failed, " << gl::FmtHR(result); - } - - auto err = copyLockableSurfaces(surf, sourceSurface); - result = device->UpdateSurface(surf, &rect, destSurface, &point); - SafeRelease(surf); - ANGLE_TRY(err); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Internal UpdateSurface call failed, " << gl::FmtHR(result); - } - } - else - { - // UpdateSurface: source must be SYSTEMMEM, dest must be DEFAULT pools - HRESULT result = device->UpdateSurface(sourceSurface, &rect, destSurface, &point); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Internal UpdateSurface call failed, " << gl::FmtHR(result); - } - } - - return gl::NoError(); -} - -// Store the pixel rectangle designated by xoffset,yoffset,width,height with pixels stored as format/type at input -// into the target pixel rectangle. -gl::Error Image9::loadData(const gl::Context *context, - const gl::Box &area, - const gl::PixelUnpackState &unpack, - GLenum type, - const void *input, - bool applySkipImages) -{ - // 3D textures are not supported by the D3D9 backend. - ASSERT(area.z == 0 && area.depth == 1); - - const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(mInternalFormat); - GLuint inputRowPitch = 0; - ANGLE_TRY_RESULT( - formatInfo.computeRowPitch(type, area.width, unpack.alignment, unpack.rowLength), - inputRowPitch); - ASSERT(!applySkipImages); - ASSERT(unpack.skipPixels == 0); - ASSERT(unpack.skipRows == 0); - - const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(mInternalFormat); - ASSERT(d3dFormatInfo.loadFunction != nullptr); - - RECT lockRect = - { - area.x, area.y, - area.x + area.width, area.y + area.height - }; - - D3DLOCKED_RECT locked; - gl::Error error = lock(&locked, lockRect); - if (error.isError()) - { - return error; - } - - d3dFormatInfo.loadFunction(area.width, area.height, area.depth, - reinterpret_cast<const uint8_t *>(input), inputRowPitch, 0, - reinterpret_cast<uint8_t *>(locked.pBits), locked.Pitch, 0); - - unlock(); - - return gl::NoError(); -} - -gl::Error Image9::loadCompressedData(const gl::Context *context, - const gl::Box &area, - const void *input) -{ - // 3D textures are not supported by the D3D9 backend. - ASSERT(area.z == 0 && area.depth == 1); - - const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(mInternalFormat); - GLsizei inputRowPitch = 0; - ANGLE_TRY_RESULT(formatInfo.computeRowPitch(GL_UNSIGNED_BYTE, area.width, 1, 0), inputRowPitch); - GLsizei inputDepthPitch = 0; - ANGLE_TRY_RESULT(formatInfo.computeDepthPitch(area.height, 0, inputDepthPitch), - inputDepthPitch); - - const d3d9::TextureFormat &d3d9FormatInfo = d3d9::GetTextureFormatInfo(mInternalFormat); - - ASSERT(area.x % d3d9::GetD3DFormatInfo(d3d9FormatInfo.texFormat).blockWidth == 0); - ASSERT(area.y % d3d9::GetD3DFormatInfo(d3d9FormatInfo.texFormat).blockHeight == 0); - - ASSERT(d3d9FormatInfo.loadFunction != nullptr); - - RECT lockRect = - { - area.x, area.y, - area.x + area.width, area.y + area.height - }; - - D3DLOCKED_RECT locked; - gl::Error error = lock(&locked, lockRect); - if (error.isError()) - { - return error; - } - - d3d9FormatInfo.loadFunction(area.width, area.height, area.depth, - reinterpret_cast<const uint8_t*>(input), inputRowPitch, inputDepthPitch, - reinterpret_cast<uint8_t*>(locked.pBits), locked.Pitch, 0); - - unlock(); - - return gl::NoError(); -} - -// This implements glCopyTex[Sub]Image2D for non-renderable internal texture formats and incomplete textures -gl::Error Image9::copyFromRTInternal(const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - RenderTargetD3D *source) -{ - ASSERT(source); - - // ES3.0 only behaviour to copy into a 3d texture - ASSERT(destOffset.z == 0); - - RenderTarget9 *renderTarget = GetAs<RenderTarget9>(source); - - IDirect3DSurface9 *surface = renderTarget->getSurface(); - ASSERT(surface); - - IDirect3DDevice9 *device = mRenderer->getDevice(); - - IDirect3DSurface9 *renderTargetData = nullptr; - D3DSURFACE_DESC description; - surface->GetDesc(&description); - - HRESULT result = device->CreateOffscreenPlainSurface(description.Width, description.Height, - description.Format, D3DPOOL_SYSTEMMEM, - &renderTargetData, nullptr); - - if (FAILED(result)) - { - SafeRelease(surface); - return gl::OutOfMemory() << "Could not create matching destination surface, " - << gl::FmtHR(result); - } - - result = device->GetRenderTargetData(surface, renderTargetData); - - if (FAILED(result)) - { - SafeRelease(renderTargetData); - SafeRelease(surface); - return gl::OutOfMemory() << "GetRenderTargetData unexpectedly failed, " - << gl::FmtHR(result); - } - - int width = sourceArea.width; - int height = sourceArea.height; - - RECT sourceRect = { sourceArea.x, sourceArea.y, sourceArea.x + width, sourceArea.y + height }; - RECT destRect = { destOffset.x, destOffset.y, destOffset.x + width, destOffset.y + height }; - - D3DLOCKED_RECT sourceLock = {0}; - result = renderTargetData->LockRect(&sourceLock, &sourceRect, 0); - - if (FAILED(result)) - { - SafeRelease(renderTargetData); - SafeRelease(surface); - return gl::OutOfMemory() - << "Failed to lock the source surface (rectangle might be invalid), " - << gl::FmtHR(result); - } - - D3DLOCKED_RECT destLock = {0}; - gl::Error error = lock(&destLock, destRect); - if (error.isError()) - { - renderTargetData->UnlockRect(); - SafeRelease(renderTargetData); - SafeRelease(surface); - return error; - } - - ASSERT(destLock.pBits && sourceLock.pBits); - - unsigned char *sourcePixels = (unsigned char*)sourceLock.pBits; - unsigned char *destPixels = (unsigned char*)destLock.pBits; - - switch (description.Format) - { - case D3DFMT_X8R8G8B8: - case D3DFMT_A8R8G8B8: - switch (getD3DFormat()) - { - case D3DFMT_X8R8G8B8: - case D3DFMT_A8R8G8B8: - for (int y = 0; y < height; y++) - { - memcpy(destPixels, sourcePixels, 4 * width); - sourcePixels += sourceLock.Pitch; - destPixels += destLock.Pitch; - } - break; - case D3DFMT_L8: - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - destPixels[x] = sourcePixels[x * 4 + 2]; - } - sourcePixels += sourceLock.Pitch; - destPixels += destLock.Pitch; - } - break; - case D3DFMT_A8L8: - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - destPixels[x * 2 + 0] = sourcePixels[x * 4 + 2]; - destPixels[x * 2 + 1] = sourcePixels[x * 4 + 3]; - } - sourcePixels += sourceLock.Pitch; - destPixels += destLock.Pitch; - } - break; - default: - UNREACHABLE(); - } - break; - case D3DFMT_R5G6B5: - switch (getD3DFormat()) - { - case D3DFMT_X8R8G8B8: - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - unsigned short rgb = ((unsigned short*)sourcePixels)[x]; - unsigned char red = static_cast<unsigned char>((rgb & 0xF800) >> 8); - unsigned char green = static_cast<unsigned char>((rgb & 0x07E0) >> 3); - unsigned char blue = static_cast<unsigned char>((rgb & 0x001F) << 3); - destPixels[x + 0] = blue | (blue >> 5); - destPixels[x + 1] = green | (green >> 6); - destPixels[x + 2] = red | (red >> 5); - destPixels[x + 3] = 0xFF; - } - sourcePixels += sourceLock.Pitch; - destPixels += destLock.Pitch; - } - break; - case D3DFMT_L8: - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - unsigned char red = sourcePixels[x * 2 + 1] & 0xF8; - destPixels[x] = red | (red >> 5); - } - sourcePixels += sourceLock.Pitch; - destPixels += destLock.Pitch; - } - break; - default: - UNREACHABLE(); - } - break; - case D3DFMT_A1R5G5B5: - switch (getD3DFormat()) - { - case D3DFMT_X8R8G8B8: - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - unsigned short argb = ((unsigned short*)sourcePixels)[x]; - unsigned char red = static_cast<unsigned char>((argb & 0x7C00) >> 7); - unsigned char green = static_cast<unsigned char>((argb & 0x03E0) >> 2); - unsigned char blue = static_cast<unsigned char>((argb & 0x001F) << 3); - destPixels[x + 0] = blue | (blue >> 5); - destPixels[x + 1] = green | (green >> 5); - destPixels[x + 2] = red | (red >> 5); - destPixels[x + 3] = 0xFF; - } - sourcePixels += sourceLock.Pitch; - destPixels += destLock.Pitch; - } - break; - case D3DFMT_A8R8G8B8: - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - unsigned short argb = ((unsigned short*)sourcePixels)[x]; - unsigned char red = static_cast<unsigned char>((argb & 0x7C00) >> 7); - unsigned char green = static_cast<unsigned char>((argb & 0x03E0) >> 2); - unsigned char blue = static_cast<unsigned char>((argb & 0x001F) << 3); - unsigned char alpha = (signed short)argb >> 15; - destPixels[x + 0] = blue | (blue >> 5); - destPixels[x + 1] = green | (green >> 5); - destPixels[x + 2] = red | (red >> 5); - destPixels[x + 3] = alpha; - } - sourcePixels += sourceLock.Pitch; - destPixels += destLock.Pitch; - } - break; - case D3DFMT_L8: - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - unsigned char red = sourcePixels[x * 2 + 1] & 0x7C; - destPixels[x] = (red << 1) | (red >> 4); - } - sourcePixels += sourceLock.Pitch; - destPixels += destLock.Pitch; - } - break; - case D3DFMT_A8L8: - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - unsigned char red = sourcePixels[x * 2 + 1] & 0x7C; - destPixels[x * 2 + 0] = (red << 1) | (red >> 4); - destPixels[x * 2 + 1] = (signed char)sourcePixels[x * 2 + 1] >> 7; - } - sourcePixels += sourceLock.Pitch; - destPixels += destLock.Pitch; - } - break; - default: - UNREACHABLE(); - } - break; - default: - UNREACHABLE(); - } - - unlock(); - renderTargetData->UnlockRect(); - - SafeRelease(renderTargetData); - SafeRelease(surface); - - mDirty = true; - return gl::NoError(); -} - -gl::Error Image9::copyFromTexStorage(const gl::Context *context, - const gl::ImageIndex &imageIndex, - TextureStorage *source) -{ - RenderTargetD3D *renderTarget = nullptr; - gl::Error error = source->getRenderTarget(context, imageIndex, &renderTarget); - if (error.isError()) - { - return error; - } - - gl::Rectangle sourceArea(0, 0, mWidth, mHeight); - return copyFromRTInternal(gl::Offset(), sourceArea, renderTarget); -} - -gl::Error Image9::copyFromFramebuffer(const gl::Context *context, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) -{ - const gl::FramebufferAttachment *srcAttachment = source->getReadColorbuffer(); - ASSERT(srcAttachment); - - RenderTargetD3D *renderTarget = nullptr; - gl::Error error = srcAttachment->getRenderTarget(context, &renderTarget); - if (error.isError()) - { - return error; - } - - ASSERT(renderTarget); - return copyFromRTInternal(destOffset, sourceArea, renderTarget); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h deleted file mode 100644 index 01c60dc4fb..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h +++ /dev/null @@ -1,102 +0,0 @@ -// -// Copyright (c) 2002-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. -// - -// Image9.h: Defines the rx::Image9 class, which acts as the interface to -// the actual underlying surfaces of a Texture. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_IMAGE9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_IMAGE9_H_ - -#include "libANGLE/renderer/d3d/ImageD3D.h" -#include "common/debug.h" - -namespace gl -{ -class Framebuffer; -} - -namespace rx -{ -class Renderer9; - -class Image9 : public ImageD3D -{ - public: - Image9(Renderer9 *renderer); - ~Image9() override; - - static gl::Error generateMipmap(Image9 *dest, Image9 *source); - static gl::Error generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9 *sourceSurface); - static gl::Error copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface9 *source); - static gl::Error CopyImage(const gl::Context *context, - Image9 *dest, - Image9 *source, - const gl::Rectangle &sourceRect, - const gl::Offset &destOffset, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha); - - bool redefine(GLenum target, GLenum internalformat, const gl::Extents &size, bool forceRelease) override; - - D3DFORMAT getD3DFormat() const; - - bool isDirty() const override; - - gl::Error setManagedSurface2D(const gl::Context *context, - TextureStorage *storage, - int level) override; - gl::Error setManagedSurfaceCube(const gl::Context *context, - TextureStorage *storage, - int face, - int level) override; - gl::Error copyToStorage(const gl::Context *context, - TextureStorage *storage, - const gl::ImageIndex &index, - const gl::Box ®ion) override; - - gl::Error loadData(const gl::Context *context, - const gl::Box &area, - const gl::PixelUnpackState &unpack, - GLenum type, - const void *input, - bool applySkipImages) override; - gl::Error loadCompressedData(const gl::Context *context, - const gl::Box &area, - const void *input) override; - - gl::Error copyFromTexStorage(const gl::Context *context, - const gl::ImageIndex &imageIndex, - TextureStorage *source) override; - gl::Error copyFromFramebuffer(const gl::Context *context, - const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - const gl::Framebuffer *source) override; - - private: - gl::Error getSurface(IDirect3DSurface9 **outSurface); - - gl::Error createSurface(); - gl::Error setManagedSurface(IDirect3DSurface9 *surface); - gl::Error copyToSurface(IDirect3DSurface9 *dest, const gl::Box &area); - - gl::Error lock(D3DLOCKED_RECT *lockedRect, const RECT &rect); - void unlock(); - - gl::Error copyFromRTInternal(const gl::Offset &destOffset, - const gl::Rectangle &sourceArea, - RenderTargetD3D *source); - - Renderer9 *mRenderer; - - D3DPOOL mD3DPool; // can only be D3DPOOL_SYSTEMMEM or D3DPOOL_MANAGED since it needs to be lockable. - D3DFORMAT mD3DFormat; - - IDirect3DSurface9 *mSurface; -}; -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_IMAGE9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp deleted file mode 100644 index df86331766..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp +++ /dev/null @@ -1,168 +0,0 @@ -// -// Copyright (c) 2002-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. -// - -// Indexffer9.cpp: Defines the D3D9 IndexBuffer implementation. - -#include "libANGLE/renderer/d3d/d3d9/IndexBuffer9.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" - -namespace rx -{ - -IndexBuffer9::IndexBuffer9(Renderer9 *const renderer) : mRenderer(renderer) -{ - mIndexBuffer = nullptr; - mBufferSize = 0; - mIndexType = 0; - mDynamic = false; -} - -IndexBuffer9::~IndexBuffer9() -{ - SafeRelease(mIndexBuffer); -} - -gl::Error IndexBuffer9::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) -{ - SafeRelease(mIndexBuffer); - - updateSerial(); - - if (bufferSize > 0) - { - D3DFORMAT format = D3DFMT_UNKNOWN; - if (indexType == GL_UNSIGNED_SHORT || indexType == GL_UNSIGNED_BYTE) - { - format = D3DFMT_INDEX16; - } - else if (indexType == GL_UNSIGNED_INT) - { - ASSERT(mRenderer->getNativeExtensions().elementIndexUint); - format = D3DFMT_INDEX32; - } - else UNREACHABLE(); - - DWORD usageFlags = D3DUSAGE_WRITEONLY; - if (dynamic) - { - usageFlags |= D3DUSAGE_DYNAMIC; - } - - HRESULT result = mRenderer->createIndexBuffer(bufferSize, usageFlags, format, &mIndexBuffer); - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to allocate internal index buffer of size " << bufferSize; - } - } - - mBufferSize = bufferSize; - mIndexType = indexType; - mDynamic = dynamic; - - return gl::NoError(); -} - -gl::Error IndexBuffer9::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory) -{ - if (!mIndexBuffer) - { - return gl::OutOfMemory() << "Internal index buffer is not initialized."; - } - - DWORD lockFlags = mDynamic ? D3DLOCK_NOOVERWRITE : 0; - - void *mapPtr = nullptr; - HRESULT result = mIndexBuffer->Lock(offset, size, &mapPtr, lockFlags); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to lock internal index buffer, " << gl::FmtHR(result); - } - - *outMappedMemory = mapPtr; - return gl::NoError(); -} - -gl::Error IndexBuffer9::unmapBuffer() -{ - if (!mIndexBuffer) - { - return gl::OutOfMemory() << "Internal index buffer is not initialized."; - } - - HRESULT result = mIndexBuffer->Unlock(); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to unlock internal index buffer, " << gl::FmtHR(result); - } - - return gl::NoError(); -} - -GLenum IndexBuffer9::getIndexType() const -{ - return mIndexType; -} - -unsigned int IndexBuffer9::getBufferSize() const -{ - return mBufferSize; -} - -gl::Error IndexBuffer9::setSize(unsigned int bufferSize, GLenum indexType) -{ - if (bufferSize > mBufferSize || indexType != mIndexType) - { - return initialize(bufferSize, indexType, mDynamic); - } - else - { - return gl::NoError(); - } -} - -gl::Error IndexBuffer9::discard() -{ - if (!mIndexBuffer) - { - return gl::OutOfMemory() << "Internal index buffer is not initialized."; - } - - void *dummy; - HRESULT result; - - result = mIndexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to lock internal index buffer, " << gl::FmtHR(result); - } - - result = mIndexBuffer->Unlock(); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to unlock internal index buffer, " << gl::FmtHR(result); - } - - return gl::NoError(); -} - -D3DFORMAT IndexBuffer9::getIndexFormat() const -{ - switch (mIndexType) - { - case GL_UNSIGNED_BYTE: return D3DFMT_INDEX16; - case GL_UNSIGNED_SHORT: return D3DFMT_INDEX16; - case GL_UNSIGNED_INT: return D3DFMT_INDEX32; - default: UNREACHABLE(); return D3DFMT_UNKNOWN; - } -} - -IDirect3DIndexBuffer9 * IndexBuffer9::getBuffer() const -{ - return mIndexBuffer; -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h deleted file mode 100644 index 5921d2a859..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h +++ /dev/null @@ -1,49 +0,0 @@ -// -// Copyright (c) 2002-2012 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. -// - -// Indexffer9.h: Defines the D3D9 IndexBuffer implementation. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_INDEXBUFFER9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_INDEXBUFFER9_H_ - -#include "libANGLE/renderer/d3d/IndexBuffer.h" - -namespace rx -{ -class Renderer9; - -class IndexBuffer9 : public IndexBuffer -{ - public: - explicit IndexBuffer9(Renderer9 *const renderer); - ~IndexBuffer9() override; - - gl::Error initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) override; - - gl::Error mapBuffer(unsigned int offset, unsigned int size, void **outMappedMemory) override; - gl::Error unmapBuffer() override; - - GLenum getIndexType() const override; - unsigned int getBufferSize() const override; - gl::Error setSize(unsigned int bufferSize, GLenum indexType) override; - - gl::Error discard() override; - - D3DFORMAT getIndexFormat() const; - IDirect3DIndexBuffer9 *getBuffer() const; - - private: - Renderer9 *const mRenderer; - - IDirect3DIndexBuffer9 *mIndexBuffer; - unsigned int mBufferSize; - GLenum mIndexType; - bool mDynamic; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_INDEXBUFFER9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.cpp deleted file mode 100644 index 388b8aa168..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// NativeWindow9.cpp: Defines NativeWindow9, a class for managing and -// performing operations on an EGLNativeWindowType for the D3D9 renderer. - -#include "libANGLE/renderer/d3d/d3d9/NativeWindow9.h" - -namespace rx -{ -NativeWindow9::NativeWindow9(EGLNativeWindowType window) : NativeWindowD3D(window) -{ -} - -bool NativeWindow9::initialize() -{ - return true; -} - -bool NativeWindow9::getClientRect(LPRECT rect) const -{ - return GetClientRect(getNativeWindow(), rect) == TRUE; -} - -bool NativeWindow9::isIconic() const -{ - return IsIconic(getNativeWindow()) == TRUE; -} - -// static -bool NativeWindow9::IsValidNativeWindow(EGLNativeWindowType window) -{ - return IsWindow(window) == TRUE; -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.h deleted file mode 100644 index a56b08dc81..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// Copyright (c) 2016 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. -// - -// NativeWindow9.h: Defines NativeWindow9, a class for managing and -// performing operations on an EGLNativeWindowType for the D3D9 renderer. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_NATIVEWINDOW9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_NATIVEWINDOW9_H_ - -#include "common/debug.h" -#include "common/platform.h" - -#include "libANGLE/renderer/d3d/NativeWindowD3D.h" - -namespace rx -{ - -class NativeWindow9 : public NativeWindowD3D -{ - public: - explicit NativeWindow9(EGLNativeWindowType window); - - bool initialize() override; - bool getClientRect(LPRECT rect) const override; - bool isIconic() const override; - - static bool IsValidNativeWindow(EGLNativeWindowType window); -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D9_NATIVEWINDOW9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp deleted file mode 100644 index 4ba053e6bd..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp +++ /dev/null @@ -1,188 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// Query9.cpp: Defines the rx::Query9 class which implements rx::QueryImpl. - -#include "libANGLE/renderer/d3d/d3d9/Query9.h" -#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" - -#include <GLES2/gl2ext.h> - -namespace rx -{ -Query9::Query9(Renderer9 *renderer, GLenum type) - : QueryImpl(type), - mResult(GL_FALSE), - mQueryFinished(false), - mRenderer(renderer), - mQuery(nullptr) -{ -} - -Query9::~Query9() -{ - SafeRelease(mQuery); -} - -gl::Error Query9::begin() -{ - D3DQUERYTYPE d3dQueryType = gl_d3d9::ConvertQueryType(getType()); - if (mQuery == nullptr) - { - HRESULT result = mRenderer->getDevice()->CreateQuery(d3dQueryType, &mQuery); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Internal query creation failed, " << gl::FmtHR(result); - } - } - - if (d3dQueryType != D3DQUERYTYPE_EVENT) - { - HRESULT result = mQuery->Issue(D3DISSUE_BEGIN); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to begin internal query, " << gl::FmtHR(result); - } - } - - return gl::NoError(); -} - -gl::Error Query9::end() -{ - ASSERT(mQuery); - - HRESULT result = mQuery->Issue(D3DISSUE_END); - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to end internal query, " << gl::FmtHR(result); - } - - mQueryFinished = false; - mResult = GL_FALSE; - - return gl::NoError(); -} - -gl::Error Query9::queryCounter() -{ - UNIMPLEMENTED(); - return gl::InternalError() << "Unimplemented"; -} - -template <typename T> -gl::Error Query9::getResultBase(T *params) -{ - while (!mQueryFinished) - { - gl::Error error = testQuery(); - if (error.isError()) - { - return error; - } - - if (!mQueryFinished) - { - Sleep(0); - } - } - - ASSERT(mQueryFinished); - *params = static_cast<T>(mResult); - return gl::NoError(); -} - -gl::Error Query9::getResult(GLint *params) -{ - return getResultBase(params); -} - -gl::Error Query9::getResult(GLuint *params) -{ - return getResultBase(params); -} - -gl::Error Query9::getResult(GLint64 *params) -{ - return getResultBase(params); -} - -gl::Error Query9::getResult(GLuint64 *params) -{ - return getResultBase(params); -} - -gl::Error Query9::isResultAvailable(bool *available) -{ - gl::Error error = testQuery(); - if (error.isError()) - { - return error; - } - - *available = mQueryFinished; - - return gl::NoError(); -} - -gl::Error Query9::testQuery() -{ - if (!mQueryFinished) - { - ASSERT(mQuery); - - HRESULT result = S_OK; - switch (getType()) - { - case GL_ANY_SAMPLES_PASSED_EXT: - case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: - { - DWORD numPixels = 0; - result = mQuery->GetData(&numPixels, sizeof(numPixels), D3DGETDATA_FLUSH); - if (result == S_OK) - { - mQueryFinished = true; - mResult = (numPixels > 0) ? GL_TRUE : GL_FALSE; - } - break; - } - - case GL_COMMANDS_COMPLETED_CHROMIUM: - { - BOOL completed = FALSE; - result = mQuery->GetData(&completed, sizeof(completed), D3DGETDATA_FLUSH); - if (result == S_OK) - { - mQueryFinished = true; - mResult = (completed == TRUE) ? GL_TRUE : GL_FALSE; - } - break; - } - - default: - UNREACHABLE(); - break; - } - - if (d3d9::isDeviceLostError(result)) - { - mRenderer->notifyDeviceLost(); - return gl::OutOfMemory() << "Failed to test get query result, device is lost."; - } - else if (mRenderer->testDeviceLost()) - { - mRenderer->notifyDeviceLost(); - return gl::OutOfMemory() << "Failed to test get query result, device is lost."; - } - } - - return gl::NoError(); -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.h deleted file mode 100644 index 6c7c22f096..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// Copyright (c) 2013 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. -// - -// Query9.h: Defines the rx::Query9 class which implements rx::QueryImpl. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_QUERY9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_QUERY9_H_ - -#include "libANGLE/renderer/QueryImpl.h" - -namespace rx -{ -class Renderer9; - -class Query9 : public QueryImpl -{ - public: - Query9(Renderer9 *renderer, GLenum type); - ~Query9() override; - - gl::Error begin() override; - gl::Error end() override; - gl::Error queryCounter() override; - gl::Error getResult(GLint *params) override; - gl::Error getResult(GLuint *params) override; - gl::Error getResult(GLint64 *params) override; - gl::Error getResult(GLuint64 *params) override; - gl::Error isResultAvailable(bool *available) override; - - private: - gl::Error testQuery(); - - template <typename T> - gl::Error getResultBase(T *params); - - GLuint64 mResult; - bool mQueryFinished; - - Renderer9 *mRenderer; - IDirect3DQuery9 *mQuery; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_QUERY9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp deleted file mode 100644 index 3e54c27f43..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp +++ /dev/null @@ -1,163 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// RenderTarget9.cpp: Implements a D3D9-specific wrapper for IDirect3DSurface9 -// pointers retained by renderbuffers. - -#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" -#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" -#include "libANGLE/renderer/d3d/d3d9/SwapChain9.h" -#include "libANGLE/renderer/d3d/d3d9/formatutils9.h" - -namespace rx -{ - -// TODO: AddRef the incoming surface to take ownership instead of expecting that its ref is being given. -TextureRenderTarget9::TextureRenderTarget9(IDirect3DBaseTexture9 *texture, - size_t textureLevel, - IDirect3DSurface9 *surface, - GLenum internalFormat, - GLsizei width, - GLsizei height, - GLsizei depth, - GLsizei samples) - : mWidth(width), - mHeight(height), - mDepth(depth), - mInternalFormat(internalFormat), - mD3DFormat(D3DFMT_UNKNOWN), - mSamples(samples), - mTexture(texture), - mTextureLevel(textureLevel), - mRenderTarget(surface) -{ - ASSERT(mDepth == 1); - - if (mRenderTarget) - { - D3DSURFACE_DESC description; - mRenderTarget->GetDesc(&description); - mD3DFormat = description.Format; - } -} - -TextureRenderTarget9::~TextureRenderTarget9() -{ - SafeRelease(mTexture); - SafeRelease(mRenderTarget); -} - -GLsizei TextureRenderTarget9::getWidth() const -{ - return mWidth; -} - -GLsizei TextureRenderTarget9::getHeight() const -{ - return mHeight; -} - -GLsizei TextureRenderTarget9::getDepth() const -{ - return mDepth; -} - -GLenum TextureRenderTarget9::getInternalFormat() const -{ - return mInternalFormat; -} - -GLsizei TextureRenderTarget9::getSamples() const -{ - return mSamples; -} - -IDirect3DBaseTexture9 *TextureRenderTarget9::getTexture() const -{ - return mTexture; -} - -size_t TextureRenderTarget9::getTextureLevel() const -{ - return mTextureLevel; -} - -IDirect3DSurface9 *TextureRenderTarget9::getSurface() const -{ - // Caller is responsible for releasing the returned surface reference. - // TODO: remove the AddRef to match RenderTarget11 - if (mRenderTarget) - { - mRenderTarget->AddRef(); - } - - return mRenderTarget; -} - -D3DFORMAT TextureRenderTarget9::getD3DFormat() const -{ - return mD3DFormat; -} - -SurfaceRenderTarget9::SurfaceRenderTarget9(SwapChain9 *swapChain, bool depth) - : mSwapChain(swapChain), - mDepth(depth) -{ -} - -SurfaceRenderTarget9::~SurfaceRenderTarget9() -{ -} - -GLsizei SurfaceRenderTarget9::getWidth() const -{ - return mSwapChain->getWidth(); -} - -GLsizei SurfaceRenderTarget9::getHeight() const -{ - return mSwapChain->getHeight(); -} - -GLsizei SurfaceRenderTarget9::getDepth() const -{ - return 1; -} - -GLenum SurfaceRenderTarget9::getInternalFormat() const -{ - return (mDepth ? mSwapChain->getDepthBufferInternalFormat() - : mSwapChain->getRenderTargetInternalFormat()); -} - -GLsizei SurfaceRenderTarget9::getSamples() const -{ - // Our EGL surfaces do not support multisampling. - return 0; -} - -IDirect3DSurface9 *SurfaceRenderTarget9::getSurface() const -{ - return (mDepth ? mSwapChain->getDepthStencil() : mSwapChain->getRenderTarget()); -} - -IDirect3DBaseTexture9 *SurfaceRenderTarget9::getTexture() const -{ - return (mDepth ? nullptr : mSwapChain->getOffscreenTexture()); -} - -size_t SurfaceRenderTarget9::getTextureLevel() const -{ - return 0; -} - -D3DFORMAT SurfaceRenderTarget9::getD3DFormat() const -{ - return d3d9::GetTextureFormatInfo(getInternalFormat()).texFormat; -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h deleted file mode 100644 index bb3b5a4ee4..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h +++ /dev/null @@ -1,98 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// RenderTarget9.h: Defines a D3D9-specific wrapper for IDirect3DSurface9 pointers -// retained by Renderbuffers. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_RENDERTARGET9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_RENDERTARGET9_H_ - -#include "libANGLE/renderer/d3d/RenderTargetD3D.h" - -namespace rx -{ -class Renderer9; -class SwapChain9; - -class RenderTarget9 : public RenderTargetD3D -{ - public: - RenderTarget9() { } - ~RenderTarget9() override {} - // Retrieve the texture that backs this render target, may be null for swap chain render - // targets. - virtual IDirect3DBaseTexture9 *getTexture() const = 0; - virtual size_t getTextureLevel() const = 0; - - virtual IDirect3DSurface9 *getSurface() const = 0; - - virtual D3DFORMAT getD3DFormat() const = 0; -}; - -class TextureRenderTarget9 : public RenderTarget9 -{ - public: - TextureRenderTarget9(IDirect3DBaseTexture9 *texture, - size_t textureLevel, - IDirect3DSurface9 *surface, - GLenum internalFormat, - GLsizei width, - GLsizei height, - GLsizei depth, - GLsizei samples); - ~TextureRenderTarget9() override; - - GLsizei getWidth() const override; - GLsizei getHeight() const override; - GLsizei getDepth() const override; - GLenum getInternalFormat() const override; - GLsizei getSamples() const override; - - IDirect3DBaseTexture9 *getTexture() const override; - size_t getTextureLevel() const override; - IDirect3DSurface9 *getSurface() const override; - - D3DFORMAT getD3DFormat() const override; - - private: - GLsizei mWidth; - GLsizei mHeight; - GLsizei mDepth; - GLenum mInternalFormat; - D3DFORMAT mD3DFormat; - GLsizei mSamples; - - IDirect3DBaseTexture9 *mTexture; - size_t mTextureLevel; - IDirect3DSurface9 *mRenderTarget; -}; - -class SurfaceRenderTarget9 : public RenderTarget9 -{ - public: - SurfaceRenderTarget9(SwapChain9 *swapChain, bool depth); - ~SurfaceRenderTarget9() override; - - GLsizei getWidth() const override; - GLsizei getHeight() const override; - GLsizei getDepth() const override; - GLenum getInternalFormat() const override; - GLsizei getSamples() const override; - - IDirect3DBaseTexture9 *getTexture() const override; - size_t getTextureLevel() const override; - IDirect3DSurface9 *getSurface() const override; - - D3DFORMAT getD3DFormat() const override; - - private: - SwapChain9 *mSwapChain; - bool mDepth; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_RENDERTARGET9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp deleted file mode 100644 index 75c6298868..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp +++ /dev/null @@ -1,3310 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// Renderer9.cpp: Implements a back-end specific class for the D3D9 renderer. - -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" - -#include <EGL/eglext.h> -#include <sstream> - -#include "common/utilities.h" -#include "libANGLE/Buffer.h" -#include "libANGLE/Context.h" -#include "libANGLE/Display.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/FramebufferAttachment.h" -#include "libANGLE/Program.h" -#include "libANGLE/Renderbuffer.h" -#include "libANGLE/State.h" -#include "libANGLE/Surface.h" -#include "libANGLE/Texture.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/features.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/CompilerD3D.h" -#include "libANGLE/renderer/d3d/DeviceD3D.h" -#include "libANGLE/renderer/d3d/FramebufferD3D.h" -#include "libANGLE/renderer/d3d/IndexDataManager.h" -#include "libANGLE/renderer/d3d/ProgramD3D.h" -#include "libANGLE/renderer/d3d/RenderbufferD3D.h" -#include "libANGLE/renderer/d3d/ShaderD3D.h" -#include "libANGLE/renderer/d3d/SurfaceD3D.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" -#include "libANGLE/renderer/d3d/d3d9/Blit9.h" -#include "libANGLE/renderer/d3d/d3d9/Buffer9.h" -#include "libANGLE/renderer/d3d/d3d9/Context9.h" -#include "libANGLE/renderer/d3d/d3d9/Fence9.h" -#include "libANGLE/renderer/d3d/d3d9/Framebuffer9.h" -#include "libANGLE/renderer/d3d/d3d9/Image9.h" -#include "libANGLE/renderer/d3d/d3d9/IndexBuffer9.h" -#include "libANGLE/renderer/d3d/d3d9/NativeWindow9.h" -#include "libANGLE/renderer/d3d/d3d9/Query9.h" -#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h" -#include "libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h" -#include "libANGLE/renderer/d3d/d3d9/SwapChain9.h" -#include "libANGLE/renderer/d3d/d3d9/TextureStorage9.h" -#include "libANGLE/renderer/d3d/d3d9/VertexArray9.h" -#include "libANGLE/renderer/d3d/d3d9/VertexBuffer9.h" -#include "libANGLE/renderer/d3d/d3d9/formatutils9.h" -#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" -#include "third_party/trace_event/trace_event.h" - -#if !defined(ANGLE_COMPILE_OPTIMIZATION_LEVEL) -#define ANGLE_COMPILE_OPTIMIZATION_LEVEL D3DCOMPILE_OPTIMIZATION_LEVEL3 -#endif - -// Enable ANGLE_SUPPORT_SHADER_MODEL_2 if you wish devices with only shader model 2. -// Such a device would not be conformant. -#ifndef ANGLE_SUPPORT_SHADER_MODEL_2 -#define ANGLE_SUPPORT_SHADER_MODEL_2 0 -#endif - -namespace rx -{ - -enum -{ - MAX_VERTEX_CONSTANT_VECTORS_D3D9 = 256, - MAX_PIXEL_CONSTANT_VECTORS_SM2 = 32, - MAX_PIXEL_CONSTANT_VECTORS_SM3 = 224, - MAX_VARYING_VECTORS_SM2 = 8, - MAX_VARYING_VECTORS_SM3 = 10, - - MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 = 4 -}; - -Renderer9::Renderer9(egl::Display *display) : RendererD3D(display), mStateManager(this) -{ - mD3d9Module = nullptr; - - mD3d9 = nullptr; - mD3d9Ex = nullptr; - mDevice = nullptr; - mDeviceEx = nullptr; - mDeviceWindow = nullptr; - mBlit = nullptr; - - mAdapter = D3DADAPTER_DEFAULT; - - const egl::AttributeMap &attributes = display->getAttributeMap(); - EGLint requestedDeviceType = static_cast<EGLint>(attributes.get( - EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE)); - switch (requestedDeviceType) - { - case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE: - mDeviceType = D3DDEVTYPE_HAL; - break; - - case EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE: - mDeviceType = D3DDEVTYPE_REF; - break; - - case EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE: - mDeviceType = D3DDEVTYPE_NULLREF; - break; - - default: - UNREACHABLE(); - } - - mMaskedClearSavedState = nullptr; - - mVertexDataManager = nullptr; - mIndexDataManager = nullptr; - mLineLoopIB = nullptr; - mCountingIB = nullptr; - - mMaxNullColorbufferLRU = 0; - for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++) - { - mNullColorbufferCache[i].lruCount = 0; - mNullColorbufferCache[i].width = 0; - mNullColorbufferCache[i].height = 0; - mNullColorbufferCache[i].buffer = nullptr; - } - - mAppliedVertexShader = nullptr; - mAppliedPixelShader = nullptr; - mAppliedProgramSerial = 0; - - gl::InitializeDebugAnnotations(&mAnnotator); - - mEGLDevice = nullptr; -} - -Renderer9::~Renderer9() -{ - if (mDevice) - { - // If the device is lost, reset it first to prevent leaving the driver in an unstable state - if (testDeviceLost()) - { - resetDevice(); - } - } - - release(); -} - -void Renderer9::release() -{ - RendererD3D::cleanup(); - - gl::UninitializeDebugAnnotations(); - - mTranslatedAttribCache.clear(); - - releaseDeviceResources(); - - SafeDelete(mEGLDevice); - SafeRelease(mDevice); - SafeRelease(mDeviceEx); - SafeRelease(mD3d9); - SafeRelease(mD3d9Ex); - - mCompiler.release(); - - if (mDeviceWindow) - { - DestroyWindow(mDeviceWindow); - mDeviceWindow = nullptr; - } - - mD3d9Module = nullptr; -} - -egl::Error Renderer9::initialize() -{ - TRACE_EVENT0("gpu.angle", "GetModuleHandle_d3d9"); - mD3d9Module = GetModuleHandle(TEXT("d3d9.dll")); - - if (mD3d9Module == nullptr) - { - return egl::EglNotInitialized(D3D9_INIT_MISSING_DEP) << "No D3D9 module found."; - } - - typedef HRESULT(WINAPI * Direct3DCreate9ExFunc)(UINT, IDirect3D9Ex **); - Direct3DCreate9ExFunc Direct3DCreate9ExPtr = - reinterpret_cast<Direct3DCreate9ExFunc>(GetProcAddress(mD3d9Module, "Direct3DCreate9Ex")); - - // Use Direct3D9Ex if available. Among other things, this version is less - // inclined to report a lost context, for example when the user switches - // desktop. Direct3D9Ex is available in Windows Vista and later if suitable drivers are - // available. - if (ANGLE_D3D9EX == ANGLE_ENABLED && Direct3DCreate9ExPtr && - SUCCEEDED(Direct3DCreate9ExPtr(D3D_SDK_VERSION, &mD3d9Ex))) - { - TRACE_EVENT0("gpu.angle", "D3d9Ex_QueryInterface"); - ASSERT(mD3d9Ex); - mD3d9Ex->QueryInterface(__uuidof(IDirect3D9), reinterpret_cast<void **>(&mD3d9)); - ASSERT(mD3d9); - } - else - { - TRACE_EVENT0("gpu.angle", "Direct3DCreate9"); - mD3d9 = Direct3DCreate9(D3D_SDK_VERSION); - } - - if (!mD3d9) - { - return egl::EglNotInitialized(D3D9_INIT_MISSING_DEP) << "Could not create D3D9 device."; - } - - if (mDisplay->getNativeDisplayId() != nullptr) - { - // UNIMPLEMENTED(); // FIXME: Determine which adapter index the device context - // corresponds to - } - - HRESULT result; - - // Give up on getting device caps after about one second. - { - TRACE_EVENT0("gpu.angle", "GetDeviceCaps"); - for (int i = 0; i < 10; ++i) - { - result = mD3d9->GetDeviceCaps(mAdapter, mDeviceType, &mDeviceCaps); - if (SUCCEEDED(result)) - { - break; - } - else if (result == D3DERR_NOTAVAILABLE) - { - Sleep(100); // Give the driver some time to initialize/recover - } - else if (FAILED(result)) // D3DERR_OUTOFVIDEOMEMORY, E_OUTOFMEMORY, - // D3DERR_INVALIDDEVICE, or another error we can't recover - // from - { - return egl::EglNotInitialized(D3D9_INIT_OTHER_ERROR) - << "Failed to get device caps, " << gl::FmtHR(result); - } - } - } - -#if ANGLE_SUPPORT_SHADER_MODEL_2 - size_t minShaderModel = 2; -#else - size_t minShaderModel = 3; -#endif - - if (mDeviceCaps.PixelShaderVersion < D3DPS_VERSION(minShaderModel, 0)) - { - return egl::EglNotInitialized(D3D9_INIT_UNSUPPORTED_VERSION) - << "Renderer does not support PS " << minShaderModel << ".0, aborting!"; - } - - // When DirectX9 is running with an older DirectX8 driver, a StretchRect from a regular texture - // to a render target texture is not supported. This is required by - // Texture2D::ensureRenderTarget. - if ((mDeviceCaps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES) == 0) - { - return egl::EglNotInitialized(D3D9_INIT_UNSUPPORTED_STRETCHRECT) - << "Renderer does not support StretctRect from textures."; - } - - { - TRACE_EVENT0("gpu.angle", "GetAdapterIdentifier"); - mD3d9->GetAdapterIdentifier(mAdapter, 0, &mAdapterIdentifier); - } - - static const TCHAR windowName[] = TEXT("AngleHiddenWindow"); - static const TCHAR className[] = TEXT("STATIC"); - - { - TRACE_EVENT0("gpu.angle", "CreateWindowEx"); - mDeviceWindow = - CreateWindowEx(WS_EX_NOACTIVATE, className, windowName, WS_DISABLED | WS_POPUP, 0, 0, 1, - 1, HWND_MESSAGE, nullptr, GetModuleHandle(nullptr), nullptr); - } - - D3DPRESENT_PARAMETERS presentParameters = getDefaultPresentParameters(); - DWORD behaviorFlags = - D3DCREATE_FPU_PRESERVE | D3DCREATE_NOWINDOWCHANGES | D3DCREATE_MULTITHREADED; - - { - TRACE_EVENT0("gpu.angle", "D3d9_CreateDevice"); - result = mD3d9->CreateDevice( - mAdapter, mDeviceType, mDeviceWindow, - behaviorFlags | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, - &presentParameters, &mDevice); - } - if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DEVICELOST) - { - return egl::EglBadAlloc(D3D9_INIT_OUT_OF_MEMORY) - << "CreateDevice failed: device lost of out of memory"; - } - - if (FAILED(result)) - { - TRACE_EVENT0("gpu.angle", "D3d9_CreateDevice2"); - result = mD3d9->CreateDevice(mAdapter, mDeviceType, mDeviceWindow, - behaviorFlags | D3DCREATE_SOFTWARE_VERTEXPROCESSING, - &presentParameters, &mDevice); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || - result == D3DERR_NOTAVAILABLE || result == D3DERR_DEVICELOST); - return egl::EglBadAlloc(D3D9_INIT_OUT_OF_MEMORY) - << "CreateDevice2 failed: device lost, not available, or of out of memory"; - } - } - - if (mD3d9Ex) - { - TRACE_EVENT0("gpu.angle", "mDevice_QueryInterface"); - result = mDevice->QueryInterface(__uuidof(IDirect3DDevice9Ex), (void **)&mDeviceEx); - ASSERT(SUCCEEDED(result)); - } - - { - TRACE_EVENT0("gpu.angle", "ShaderCache initialize"); - mVertexShaderCache.initialize(mDevice); - mPixelShaderCache.initialize(mDevice); - } - - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - // Check vertex texture support - // Only Direct3D 10 ready devices support all the necessary vertex texture formats. - // We test this using D3D9 by checking support for the R16F format. - mVertexTextureSupport = mDeviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0) && - SUCCEEDED(mD3d9->CheckDeviceFormat( - mAdapter, mDeviceType, currentDisplayMode.Format, - D3DUSAGE_QUERY_VERTEXTEXTURE, D3DRTYPE_TEXTURE, D3DFMT_R16F)); - - ANGLE_TRY(initializeDevice()); - - return egl::NoError(); -} - -// do any one-time device initialization -// NOTE: this is also needed after a device lost/reset -// to reset the scene status and ensure the default states are reset. -egl::Error Renderer9::initializeDevice() -{ - // Permanent non-default states - mDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE); - mDevice->SetRenderState(D3DRS_LASTPIXEL, FALSE); - - if (mDeviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0)) - { - mDevice->SetRenderState(D3DRS_POINTSIZE_MAX, (DWORD &)mDeviceCaps.MaxPointSize); - } - else - { - mDevice->SetRenderState(D3DRS_POINTSIZE_MAX, 0x3F800000); // 1.0f - } - - const gl::Caps &rendererCaps = getNativeCaps(); - - mCurVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits); - mCurPixelSamplerStates.resize(rendererCaps.maxTextureImageUnits); - - mCurVertexTextures.resize(rendererCaps.maxVertexTextureImageUnits); - mCurPixelTextures.resize(rendererCaps.maxTextureImageUnits); - - markAllStateDirty(); - - mSceneStarted = false; - - ASSERT(!mBlit); - mBlit = new Blit9(this); - ANGLE_TRY(mBlit->initialize()); - - ASSERT(!mVertexDataManager && !mIndexDataManager); - mVertexDataManager = new VertexDataManager(this); - mIndexDataManager = new IndexDataManager(this); - - if (mVertexDataManager->initialize().isError()) - { - return egl::EglBadAlloc() << "Error initializing VertexDataManager"; - } - - mTranslatedAttribCache.resize(getNativeCaps().maxVertexAttributes); - - mStateManager.initialize(); - - return egl::NoError(); -} - -D3DPRESENT_PARAMETERS Renderer9::getDefaultPresentParameters() -{ - D3DPRESENT_PARAMETERS presentParameters = {0}; - - // The default swap chain is never actually used. Surface will create a new swap chain with the - // proper parameters. - presentParameters.AutoDepthStencilFormat = D3DFMT_UNKNOWN; - presentParameters.BackBufferCount = 1; - presentParameters.BackBufferFormat = D3DFMT_UNKNOWN; - presentParameters.BackBufferWidth = 1; - presentParameters.BackBufferHeight = 1; - presentParameters.EnableAutoDepthStencil = FALSE; - presentParameters.Flags = 0; - presentParameters.hDeviceWindow = mDeviceWindow; - presentParameters.MultiSampleQuality = 0; - presentParameters.MultiSampleType = D3DMULTISAMPLE_NONE; - presentParameters.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; - presentParameters.SwapEffect = D3DSWAPEFFECT_DISCARD; - presentParameters.Windowed = TRUE; - - return presentParameters; -} - -egl::ConfigSet Renderer9::generateConfigs() -{ - static const GLenum colorBufferFormats[] = { - GL_BGR5_A1_ANGLEX, GL_BGRA8_EXT, GL_RGB565, - - }; - - static const GLenum depthStencilBufferFormats[] = { - GL_NONE, - GL_DEPTH_COMPONENT32_OES, - GL_DEPTH24_STENCIL8_OES, - GL_DEPTH_COMPONENT24_OES, - GL_DEPTH_COMPONENT16, - }; - - const gl::Caps &rendererCaps = getNativeCaps(); - const gl::TextureCapsMap &rendererTextureCaps = getNativeTextureCaps(); - - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - // Determine the min and max swap intervals - int minSwapInterval = 4; - int maxSwapInterval = 0; - - if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_IMMEDIATE) - { - minSwapInterval = std::min(minSwapInterval, 0); - maxSwapInterval = std::max(maxSwapInterval, 0); - } - if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_ONE) - { - minSwapInterval = std::min(minSwapInterval, 1); - maxSwapInterval = std::max(maxSwapInterval, 1); - } - if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_TWO) - { - minSwapInterval = std::min(minSwapInterval, 2); - maxSwapInterval = std::max(maxSwapInterval, 2); - } - if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_THREE) - { - minSwapInterval = std::min(minSwapInterval, 3); - maxSwapInterval = std::max(maxSwapInterval, 3); - } - if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_FOUR) - { - minSwapInterval = std::min(minSwapInterval, 4); - maxSwapInterval = std::max(maxSwapInterval, 4); - } - - egl::ConfigSet configs; - for (size_t formatIndex = 0; formatIndex < ArraySize(colorBufferFormats); formatIndex++) - { - GLenum colorBufferInternalFormat = colorBufferFormats[formatIndex]; - const gl::TextureCaps &colorBufferFormatCaps = - rendererTextureCaps.get(colorBufferInternalFormat); - if (colorBufferFormatCaps.renderable) - { - for (size_t depthStencilIndex = 0; - depthStencilIndex < ArraySize(depthStencilBufferFormats); depthStencilIndex++) - { - GLenum depthStencilBufferInternalFormat = - depthStencilBufferFormats[depthStencilIndex]; - const gl::TextureCaps &depthStencilBufferFormatCaps = - rendererTextureCaps.get(depthStencilBufferInternalFormat); - if (depthStencilBufferFormatCaps.renderable || - depthStencilBufferInternalFormat == GL_NONE) - { - const gl::InternalFormat &colorBufferFormatInfo = - gl::GetSizedInternalFormatInfo(colorBufferInternalFormat); - const gl::InternalFormat &depthStencilBufferFormatInfo = - gl::GetSizedInternalFormatInfo(depthStencilBufferInternalFormat); - const d3d9::TextureFormat &d3d9ColorBufferFormatInfo = - d3d9::GetTextureFormatInfo(colorBufferInternalFormat); - - egl::Config config; - config.renderTargetFormat = colorBufferInternalFormat; - config.depthStencilFormat = depthStencilBufferInternalFormat; - config.bufferSize = colorBufferFormatInfo.pixelBytes * 8; - config.redSize = colorBufferFormatInfo.redBits; - config.greenSize = colorBufferFormatInfo.greenBits; - config.blueSize = colorBufferFormatInfo.blueBits; - config.luminanceSize = colorBufferFormatInfo.luminanceBits; - config.alphaSize = colorBufferFormatInfo.alphaBits; - config.alphaMaskSize = 0; - config.bindToTextureRGB = (colorBufferFormatInfo.format == GL_RGB); - config.bindToTextureRGBA = (colorBufferFormatInfo.format == GL_RGBA || - colorBufferFormatInfo.format == GL_BGRA_EXT); - config.colorBufferType = EGL_RGB_BUFFER; - // Mark as slow if blits to the back-buffer won't be straight forward - config.configCaveat = - (currentDisplayMode.Format == d3d9ColorBufferFormatInfo.renderFormat) - ? EGL_NONE - : EGL_SLOW_CONFIG; - config.configID = static_cast<EGLint>(configs.size() + 1); - config.conformant = EGL_OPENGL_ES2_BIT; - config.depthSize = depthStencilBufferFormatInfo.depthBits; - config.level = 0; - config.matchNativePixmap = EGL_NONE; - config.maxPBufferWidth = rendererCaps.max2DTextureSize; - config.maxPBufferHeight = rendererCaps.max2DTextureSize; - config.maxPBufferPixels = - rendererCaps.max2DTextureSize * rendererCaps.max2DTextureSize; - config.maxSwapInterval = maxSwapInterval; - config.minSwapInterval = minSwapInterval; - config.nativeRenderable = EGL_FALSE; - config.nativeVisualID = 0; - config.nativeVisualType = EGL_NONE; - config.renderableType = EGL_OPENGL_ES2_BIT; - config.sampleBuffers = 0; // FIXME: enumerate multi-sampling - config.samples = 0; - config.stencilSize = depthStencilBufferFormatInfo.stencilBits; - config.surfaceType = - EGL_PBUFFER_BIT | EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT; - config.transparentType = EGL_NONE; - config.transparentRedValue = 0; - config.transparentGreenValue = 0; - config.transparentBlueValue = 0; - config.colorComponentType = gl_egl::GLComponentTypeToEGLColorComponentType( - colorBufferFormatInfo.componentType); - - configs.add(config); - } - } - } - } - - ASSERT(configs.size() > 0); - return configs; -} - -void Renderer9::generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const -{ - outExtensions->createContextRobustness = true; - - if (getShareHandleSupport()) - { - outExtensions->d3dShareHandleClientBuffer = true; - outExtensions->surfaceD3DTexture2DShareHandle = true; - } - outExtensions->d3dTextureClientBuffer = true; - - outExtensions->querySurfacePointer = true; - outExtensions->windowFixedSize = true; - outExtensions->postSubBuffer = true; - outExtensions->deviceQuery = true; - - outExtensions->image = true; - outExtensions->imageBase = true; - outExtensions->glTexture2DImage = true; - outExtensions->glRenderbufferImage = true; - - outExtensions->flexibleSurfaceCompatibility = true; - - // Contexts are virtualized so textures can be shared globally - outExtensions->displayTextureShareGroup = true; - - // D3D9 can be used without an output surface - outExtensions->surfacelessContext = true; - - outExtensions->robustResourceInitialization = true; -} - -void Renderer9::startScene() -{ - if (!mSceneStarted) - { - long result = mDevice->BeginScene(); - if (SUCCEEDED(result)) - { - // This is defensive checking against the device being - // lost at unexpected times. - mSceneStarted = true; - } - } -} - -void Renderer9::endScene() -{ - if (mSceneStarted) - { - // EndScene can fail if the device was lost, for example due - // to a TDR during a draw call. - mDevice->EndScene(); - mSceneStarted = false; - } -} - -gl::Error Renderer9::flush() -{ - IDirect3DQuery9 *query = nullptr; - gl::Error error = allocateEventQuery(&query); - if (error.isError()) - { - return error; - } - - HRESULT result = query->Issue(D3DISSUE_END); - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() << "Failed to issue event query, " << gl::FmtHR(result); - } - - // Grab the query data once - result = query->GetData(nullptr, 0, D3DGETDATA_FLUSH); - freeEventQuery(query); - if (FAILED(result)) - { - if (d3d9::isDeviceLostError(result)) - { - notifyDeviceLost(); - } - - return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result); - } - - return gl::NoError(); -} - -gl::Error Renderer9::finish() -{ - IDirect3DQuery9 *query = nullptr; - gl::Error error = allocateEventQuery(&query); - if (error.isError()) - { - return error; - } - - HRESULT result = query->Issue(D3DISSUE_END); - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() << "Failed to issue event query, " << gl::FmtHR(result); - } - - // Grab the query data once - result = query->GetData(nullptr, 0, D3DGETDATA_FLUSH); - if (FAILED(result)) - { - if (d3d9::isDeviceLostError(result)) - { - notifyDeviceLost(); - } - - freeEventQuery(query); - return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result); - } - - // Loop until the query completes - while (result == S_FALSE) - { - // Keep polling, but allow other threads to do something useful first - ScheduleYield(); - - result = query->GetData(nullptr, 0, D3DGETDATA_FLUSH); - - // explicitly check for device loss - // some drivers seem to return S_FALSE even if the device is lost - // instead of D3DERR_DEVICELOST like they should - if (result == S_FALSE && testDeviceLost()) - { - result = D3DERR_DEVICELOST; - } - - if (FAILED(result)) - { - if (d3d9::isDeviceLostError(result)) - { - notifyDeviceLost(); - } - - freeEventQuery(query); - return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result); - } - } - - freeEventQuery(query); - - return gl::NoError(); -} - -bool Renderer9::isValidNativeWindow(EGLNativeWindowType window) const -{ - return NativeWindow9::IsValidNativeWindow(window); -} - -NativeWindowD3D *Renderer9::createNativeWindow(EGLNativeWindowType window, - const egl::Config *, - const egl::AttributeMap &) const -{ - return new NativeWindow9(window); -} - -SwapChainD3D *Renderer9::createSwapChain(NativeWindowD3D *nativeWindow, - HANDLE shareHandle, - IUnknown *d3dTexture, - GLenum backBufferFormat, - GLenum depthBufferFormat, - EGLint orientation, - EGLint samples) -{ - return new SwapChain9(this, GetAs<NativeWindow9>(nativeWindow), shareHandle, d3dTexture, - backBufferFormat, depthBufferFormat, orientation); -} - -egl::Error Renderer9::getD3DTextureInfo(const egl::Config *config, - IUnknown *d3dTexture, - EGLint *width, - EGLint *height, - GLenum *fboFormat) const -{ - IDirect3DTexture9 *texture = nullptr; - if (FAILED(d3dTexture->QueryInterface(&texture))) - { - return egl::EglBadParameter() << "Client buffer is not a IDirect3DTexture9"; - } - - IDirect3DDevice9 *textureDevice = nullptr; - texture->GetDevice(&textureDevice); - if (textureDevice != mDevice) - { - SafeRelease(texture); - return egl::EglBadParameter() << "Texture's device does not match."; - } - SafeRelease(textureDevice); - - D3DSURFACE_DESC desc; - texture->GetLevelDesc(0, &desc); - SafeRelease(texture); - - if (width) - { - *width = static_cast<EGLint>(desc.Width); - } - if (height) - { - *height = static_cast<EGLint>(desc.Height); - } - - // From table egl.restrictions in EGL_ANGLE_d3d_texture_client_buffer. - switch (desc.Format) - { - case D3DFMT_R8G8B8: - case D3DFMT_A8R8G8B8: - case D3DFMT_A16B16G16R16F: - case D3DFMT_A32B32G32R32F: - break; - - default: - return egl::EglBadParameter() - << "Unknown client buffer texture format: " << desc.Format; - } - - if (fboFormat) - { - const auto &d3dFormatInfo = d3d9::GetD3DFormatInfo(desc.Format); - ASSERT(d3dFormatInfo.info().id != angle::Format::ID::NONE); - *fboFormat = d3dFormatInfo.info().fboImplementationInternalFormat; - } - - return egl::NoError(); -} - -egl::Error Renderer9::validateShareHandle(const egl::Config *config, - HANDLE shareHandle, - const egl::AttributeMap &attribs) const -{ - if (shareHandle == nullptr) - { - return egl::EglBadParameter() << "NULL share handle."; - } - - EGLint width = attribs.getAsInt(EGL_WIDTH, 0); - EGLint height = attribs.getAsInt(EGL_HEIGHT, 0); - ASSERT(width != 0 && height != 0); - - const d3d9::TextureFormat &backBufferd3dFormatInfo = - d3d9::GetTextureFormatInfo(config->renderTargetFormat); - - IDirect3DTexture9 *texture = nullptr; - HRESULT result = mDevice->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET, - backBufferd3dFormatInfo.texFormat, D3DPOOL_DEFAULT, - &texture, &shareHandle); - if (FAILED(result)) - { - return egl::EglBadParameter() << "Failed to open share handle, " << gl::FmtHR(result); - } - - DWORD levelCount = texture->GetLevelCount(); - - D3DSURFACE_DESC desc; - texture->GetLevelDesc(0, &desc); - SafeRelease(texture); - - if (levelCount != 1 || desc.Width != static_cast<UINT>(width) || - desc.Height != static_cast<UINT>(height) || - desc.Format != backBufferd3dFormatInfo.texFormat) - { - return egl::EglBadParameter() << "Invalid texture parameters in share handle texture."; - } - - return egl::NoError(); -} - -ContextImpl *Renderer9::createContext(const gl::ContextState &state) -{ - return new Context9(state, this); -} - -void *Renderer9::getD3DDevice() -{ - return reinterpret_cast<void *>(mDevice); -} - -gl::Error Renderer9::allocateEventQuery(IDirect3DQuery9 **outQuery) -{ - if (mEventQueryPool.empty()) - { - HRESULT result = mDevice->CreateQuery(D3DQUERYTYPE_EVENT, outQuery); - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() << "Failed to allocate event query, " << gl::FmtHR(result); - } - } - else - { - *outQuery = mEventQueryPool.back(); - mEventQueryPool.pop_back(); - } - - return gl::NoError(); -} - -void Renderer9::freeEventQuery(IDirect3DQuery9 *query) -{ - if (mEventQueryPool.size() > 1000) - { - SafeRelease(query); - } - else - { - mEventQueryPool.push_back(query); - } -} - -gl::Error Renderer9::createVertexShader(const DWORD *function, - size_t length, - IDirect3DVertexShader9 **outShader) -{ - return mVertexShaderCache.create(function, length, outShader); -} - -gl::Error Renderer9::createPixelShader(const DWORD *function, - size_t length, - IDirect3DPixelShader9 **outShader) -{ - return mPixelShaderCache.create(function, length, outShader); -} - -HRESULT Renderer9::createVertexBuffer(UINT Length, - DWORD Usage, - IDirect3DVertexBuffer9 **ppVertexBuffer) -{ - D3DPOOL Pool = getBufferPool(Usage); - return mDevice->CreateVertexBuffer(Length, Usage, 0, Pool, ppVertexBuffer, nullptr); -} - -VertexBuffer *Renderer9::createVertexBuffer() -{ - return new VertexBuffer9(this); -} - -HRESULT Renderer9::createIndexBuffer(UINT Length, - DWORD Usage, - D3DFORMAT Format, - IDirect3DIndexBuffer9 **ppIndexBuffer) -{ - D3DPOOL Pool = getBufferPool(Usage); - return mDevice->CreateIndexBuffer(Length, Usage, Format, Pool, ppIndexBuffer, nullptr); -} - -IndexBuffer *Renderer9::createIndexBuffer() -{ - return new IndexBuffer9(this); -} - -StreamProducerImpl *Renderer9::createStreamProducerD3DTextureNV12( - egl::Stream::ConsumerType consumerType, - const egl::AttributeMap &attribs) -{ - // Streams are not supported under D3D9 - UNREACHABLE(); - return nullptr; -} - -bool Renderer9::supportsFastCopyBufferToTexture(GLenum internalFormat) const -{ - // Pixel buffer objects are not supported in D3D9, since D3D9 is ES2-only and PBOs are ES3. - return false; -} - -gl::Error Renderer9::fastCopyBufferToTexture(const gl::Context *context, - const gl::PixelUnpackState &unpack, - unsigned int offset, - RenderTargetD3D *destRenderTarget, - GLenum destinationFormat, - GLenum sourcePixelsType, - const gl::Box &destArea) -{ - // Pixel buffer objects are not supported in D3D9, since D3D9 is ES2-only and PBOs are ES3. - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error Renderer9::setSamplerState(const gl::Context *context, - gl::SamplerType type, - int index, - gl::Texture *texture, - const gl::SamplerState &samplerState) -{ - CurSamplerState &appliedSampler = (type == gl::SAMPLER_PIXEL) ? mCurPixelSamplerStates[index] - : mCurVertexSamplerStates[index]; - - // Make sure to add the level offset for our tiny compressed texture workaround - TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture); - - TextureStorage *storage = nullptr; - ANGLE_TRY(textureD3D->getNativeTexture(context, &storage)); - - // Storage should exist, texture should be complete - ASSERT(storage); - - DWORD baseLevel = texture->getBaseLevel() + storage->getTopLevel(); - - if (appliedSampler.forceSet || appliedSampler.baseLevel != baseLevel || - memcmp(&samplerState, &appliedSampler, sizeof(gl::SamplerState)) != 0) - { - int d3dSamplerOffset = (type == gl::SAMPLER_PIXEL) ? 0 : D3DVERTEXTEXTURESAMPLER0; - int d3dSampler = index + d3dSamplerOffset; - - mDevice->SetSamplerState(d3dSampler, D3DSAMP_ADDRESSU, - gl_d3d9::ConvertTextureWrap(samplerState.wrapS)); - mDevice->SetSamplerState(d3dSampler, D3DSAMP_ADDRESSV, - gl_d3d9::ConvertTextureWrap(samplerState.wrapT)); - - mDevice->SetSamplerState( - d3dSampler, D3DSAMP_MAGFILTER, - gl_d3d9::ConvertMagFilter(samplerState.magFilter, samplerState.maxAnisotropy)); - - D3DTEXTUREFILTERTYPE d3dMinFilter, d3dMipFilter; - float lodBias; - gl_d3d9::ConvertMinFilter(samplerState.minFilter, &d3dMinFilter, &d3dMipFilter, &lodBias, - samplerState.maxAnisotropy, baseLevel); - mDevice->SetSamplerState(d3dSampler, D3DSAMP_MINFILTER, d3dMinFilter); - mDevice->SetSamplerState(d3dSampler, D3DSAMP_MIPFILTER, d3dMipFilter); - mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXMIPLEVEL, baseLevel); - mDevice->SetSamplerState(d3dSampler, D3DSAMP_MIPMAPLODBIAS, static_cast<DWORD>(lodBias)); - if (getNativeExtensions().textureFilterAnisotropic) - { - DWORD maxAnisotropy = - std::min(mDeviceCaps.MaxAnisotropy, static_cast<DWORD>(samplerState.maxAnisotropy)); - mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXANISOTROPY, maxAnisotropy); - } - } - - appliedSampler.forceSet = false; - appliedSampler.samplerState = samplerState; - appliedSampler.baseLevel = baseLevel; - - return gl::NoError(); -} - -gl::Error Renderer9::setTexture(const gl::Context *context, - gl::SamplerType type, - int index, - gl::Texture *texture) -{ - int d3dSamplerOffset = (type == gl::SAMPLER_PIXEL) ? 0 : D3DVERTEXTEXTURESAMPLER0; - int d3dSampler = index + d3dSamplerOffset; - IDirect3DBaseTexture9 *d3dTexture = nullptr; - bool forceSetTexture = false; - - std::vector<uintptr_t> &appliedTextures = - (type == gl::SAMPLER_PIXEL) ? mCurPixelTextures : mCurVertexTextures; - - if (texture) - { - TextureD3D *textureImpl = GetImplAs<TextureD3D>(texture); - - TextureStorage *texStorage = nullptr; - ANGLE_TRY(textureImpl->getNativeTexture(context, &texStorage)); - - // Texture should be complete and have a storage - ASSERT(texStorage); - - TextureStorage9 *storage9 = GetAs<TextureStorage9>(texStorage); - ANGLE_TRY(storage9->getBaseTexture(context, &d3dTexture)); - - // If we get NULL back from getBaseTexture here, something went wrong - // in the texture class and we're unexpectedly missing the d3d texture - ASSERT(d3dTexture != nullptr); - - forceSetTexture = textureImpl->hasDirtyImages(); - textureImpl->resetDirty(); - } - - if (forceSetTexture || appliedTextures[index] != reinterpret_cast<uintptr_t>(d3dTexture)) - { - mDevice->SetTexture(d3dSampler, d3dTexture); - } - - appliedTextures[index] = reinterpret_cast<uintptr_t>(d3dTexture); - - return gl::NoError(); -} - -gl::Error Renderer9::updateState(const gl::Context *context, GLenum drawMode) -{ - const auto &glState = context->getGLState(); - - // Applies the render target surface, depth stencil surface, viewport rectangle and - // scissor rectangle to the renderer - gl::Framebuffer *framebuffer = glState.getDrawFramebuffer(); - ASSERT(framebuffer && !framebuffer->hasAnyDirtyBit() && framebuffer->cachedComplete()); - - ANGLE_TRY(applyRenderTarget(context, framebuffer)); - - // Setting viewport state - setViewport(glState.getViewport(), glState.getNearPlane(), glState.getFarPlane(), drawMode, - glState.getRasterizerState().frontFace, false); - - // Setting scissors state - setScissorRectangle(glState.getScissor(), glState.isScissorTestEnabled()); - - // Setting blend, depth stencil, and rasterizer states - // Since framebuffer->getSamples will return the original samples which may be different with - // the sample counts that we set in render target view, here we use renderTarget->getSamples to - // get the actual samples. - GLsizei samples = 0; - const gl::FramebufferAttachment *firstColorAttachment = framebuffer->getFirstColorbuffer(); - if (firstColorAttachment) - { - ASSERT(firstColorAttachment->isAttached()); - RenderTarget9 *renderTarget = nullptr; - ANGLE_TRY(firstColorAttachment->getRenderTarget(context, &renderTarget)); - samples = renderTarget->getSamples(); - } - gl::RasterizerState rasterizer = glState.getRasterizerState(); - rasterizer.pointDrawMode = (drawMode == GL_POINTS); - rasterizer.multiSample = (samples != 0); - - unsigned int mask = GetBlendSampleMask(glState, samples); - ANGLE_TRY(setBlendDepthRasterStates(context, mask)); - - mStateManager.resetDirtyBits(); - - return gl::NoError(); -} - -void Renderer9::setScissorRectangle(const gl::Rectangle &scissor, bool enabled) -{ - mStateManager.setScissorState(scissor, enabled); -} - -gl::Error Renderer9::setBlendDepthRasterStates(const gl::Context *context, GLenum drawMode) -{ - const auto &glState = context->getGLState(); - gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer(); - ASSERT(!drawFramebuffer->hasAnyDirtyBit()); - // Since framebuffer->getSamples will return the original samples which may be different with - // the sample counts that we set in render target view, here we use renderTarget->getSamples to - // get the actual samples. - GLsizei samples = 0; - const gl::FramebufferAttachment *firstColorAttachment = drawFramebuffer->getFirstColorbuffer(); - if (firstColorAttachment) - { - ASSERT(firstColorAttachment->isAttached()); - RenderTarget9 *renderTarget = nullptr; - ANGLE_TRY(firstColorAttachment->getRenderTarget(context, &renderTarget)); - samples = renderTarget->getSamples(); - } - gl::RasterizerState rasterizer = glState.getRasterizerState(); - rasterizer.pointDrawMode = (drawMode == GL_POINTS); - rasterizer.multiSample = (samples != 0); - - unsigned int mask = GetBlendSampleMask(glState, samples); - return mStateManager.setBlendDepthRasterStates(glState, mask); -} - -void Renderer9::setViewport(const gl::Rectangle &viewport, - float zNear, - float zFar, - GLenum drawMode, - GLenum frontFace, - bool ignoreViewport) -{ - mStateManager.setViewportState(viewport, zNear, zFar, drawMode, frontFace, ignoreViewport); -} - -bool Renderer9::applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize) -{ - switch (mode) - { - case GL_POINTS: - mPrimitiveType = D3DPT_POINTLIST; - mPrimitiveCount = count; - break; - case GL_LINES: - mPrimitiveType = D3DPT_LINELIST; - mPrimitiveCount = count / 2; - break; - case GL_LINE_LOOP: - mPrimitiveType = D3DPT_LINESTRIP; - mPrimitiveCount = - count - 1; // D3D doesn't support line loops, so we draw the last line separately - break; - case GL_LINE_STRIP: - mPrimitiveType = D3DPT_LINESTRIP; - mPrimitiveCount = count - 1; - break; - case GL_TRIANGLES: - mPrimitiveType = D3DPT_TRIANGLELIST; - mPrimitiveCount = count / 3; - break; - case GL_TRIANGLE_STRIP: - mPrimitiveType = D3DPT_TRIANGLESTRIP; - mPrimitiveCount = count - 2; - break; - case GL_TRIANGLE_FAN: - mPrimitiveType = D3DPT_TRIANGLEFAN; - mPrimitiveCount = count - 2; - break; - default: - UNREACHABLE(); - return false; - } - - return mPrimitiveCount > 0; -} - -gl::Error Renderer9::getNullColorbuffer(const gl::Context *context, - const gl::FramebufferAttachment *depthbuffer, - const gl::FramebufferAttachment **outColorBuffer) -{ - ASSERT(depthbuffer); - - const gl::Extents &size = depthbuffer->getSize(); - - // search cached nullcolorbuffers - for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++) - { - if (mNullColorbufferCache[i].buffer != nullptr && - mNullColorbufferCache[i].width == size.width && - mNullColorbufferCache[i].height == size.height) - { - mNullColorbufferCache[i].lruCount = ++mMaxNullColorbufferLRU; - *outColorBuffer = mNullColorbufferCache[i].buffer; - return gl::NoError(); - } - } - - auto *implFactory = context->getImplementation(); - - gl::Renderbuffer *nullRenderbuffer = new gl::Renderbuffer(implFactory->createRenderbuffer(), 0); - gl::Error error = nullRenderbuffer->setStorage(context, GL_NONE, size.width, size.height); - if (error.isError()) - { - SafeDelete(nullRenderbuffer); - return error; - } - - gl::FramebufferAttachment *nullbuffer = new gl::FramebufferAttachment( - context, GL_RENDERBUFFER, GL_NONE, gl::ImageIndex::MakeInvalid(), nullRenderbuffer); - - // add nullbuffer to the cache - NullColorbufferCacheEntry *oldest = &mNullColorbufferCache[0]; - for (int i = 1; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++) - { - if (mNullColorbufferCache[i].lruCount < oldest->lruCount) - { - oldest = &mNullColorbufferCache[i]; - } - } - - delete oldest->buffer; - oldest->buffer = nullbuffer; - oldest->lruCount = ++mMaxNullColorbufferLRU; - oldest->width = size.width; - oldest->height = size.height; - - *outColorBuffer = nullbuffer; - return gl::NoError(); -} - -gl::Error Renderer9::applyRenderTarget(const gl::Context *context, - const gl::FramebufferAttachment *colorAttachment, - const gl::FramebufferAttachment *depthStencilAttachment) -{ - const gl::FramebufferAttachment *renderAttachment = colorAttachment; - - // if there is no color attachment we must synthesize a NULL colorattachment - // to keep the D3D runtime happy. This should only be possible if depth texturing. - if (renderAttachment == nullptr) - { - ANGLE_TRY(getNullColorbuffer(context, depthStencilAttachment, &renderAttachment)); - } - ASSERT(renderAttachment != nullptr); - - size_t renderTargetWidth = 0; - size_t renderTargetHeight = 0; - D3DFORMAT renderTargetFormat = D3DFMT_UNKNOWN; - - RenderTarget9 *renderTarget = nullptr; - ANGLE_TRY(renderAttachment->getRenderTarget(context, &renderTarget)); - ASSERT(renderTarget); - - bool renderTargetChanged = false; - unsigned int renderTargetSerial = renderTarget->getSerial(); - if (renderTargetSerial != mAppliedRenderTargetSerial) - { - // Apply the render target on the device - IDirect3DSurface9 *renderTargetSurface = renderTarget->getSurface(); - ASSERT(renderTargetSurface); - - mDevice->SetRenderTarget(0, renderTargetSurface); - SafeRelease(renderTargetSurface); - - renderTargetWidth = renderTarget->getWidth(); - renderTargetHeight = renderTarget->getHeight(); - renderTargetFormat = renderTarget->getD3DFormat(); - - mAppliedRenderTargetSerial = renderTargetSerial; - renderTargetChanged = true; - } - - RenderTarget9 *depthStencilRenderTarget = nullptr; - unsigned int depthStencilSerial = 0; - - if (depthStencilAttachment != nullptr) - { - ANGLE_TRY(depthStencilAttachment->getRenderTarget(context, &depthStencilRenderTarget)); - ASSERT(depthStencilRenderTarget); - - depthStencilSerial = depthStencilRenderTarget->getSerial(); - } - - if (depthStencilSerial != mAppliedDepthStencilSerial || !mDepthStencilInitialized) - { - unsigned int depthSize = 0; - unsigned int stencilSize = 0; - - // Apply the depth stencil on the device - if (depthStencilRenderTarget) - { - IDirect3DSurface9 *depthStencilSurface = depthStencilRenderTarget->getSurface(); - ASSERT(depthStencilSurface); - - mDevice->SetDepthStencilSurface(depthStencilSurface); - SafeRelease(depthStencilSurface); - - depthSize = depthStencilAttachment->getDepthSize(); - stencilSize = depthStencilAttachment->getStencilSize(); - } - else - { - mDevice->SetDepthStencilSurface(nullptr); - } - - mStateManager.updateDepthSizeIfChanged(mDepthStencilInitialized, depthSize); - mStateManager.updateStencilSizeIfChanged(mDepthStencilInitialized, stencilSize); - - mAppliedDepthStencilSerial = depthStencilSerial; - mDepthStencilInitialized = true; - } - - if (renderTargetChanged || !mRenderTargetDescInitialized) - { - mStateManager.forceSetBlendState(); - mStateManager.forceSetScissorState(); - mStateManager.setRenderTargetBounds(renderTargetWidth, renderTargetHeight); - mRenderTargetDescInitialized = true; - } - - return gl::NoError(); -} - -gl::Error Renderer9::applyRenderTarget(const gl::Context *context, - const gl::Framebuffer *framebuffer) -{ - return applyRenderTarget(context, framebuffer->getColorbuffer(0), - framebuffer->getDepthOrStencilbuffer()); -} - -gl::Error Renderer9::applyVertexBuffer(const gl::Context *context, - GLenum mode, - GLint first, - GLsizei count, - GLsizei instances, - TranslatedIndexData * /*indexInfo*/) -{ - const gl::State &state = context->getGLState(); - gl::Error error = mVertexDataManager->prepareVertexData(context, first, count, - &mTranslatedAttribCache, instances); - if (error.isError()) - { - return error; - } - - return mVertexDeclarationCache.applyDeclaration( - mDevice, mTranslatedAttribCache, state.getProgram(), first, instances, &mRepeatDraw); -} - -// Applies the indices and element array bindings to the Direct3D 9 device -gl::Error Renderer9::applyIndexBuffer(const gl::Context *context, - const void *indices, - GLsizei count, - GLenum mode, - GLenum type, - TranslatedIndexData *indexInfo) -{ - gl::VertexArray *vao = context->getGLState().getVertexArray(); - gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get(); - const auto &lazyIndexRange = context->getParams<gl::HasIndexRange>(); - - GLenum dstType = GetIndexTranslationDestType(type, lazyIndexRange, false); - - ANGLE_TRY(mIndexDataManager->prepareIndexData(context, type, dstType, count, elementArrayBuffer, - indices, indexInfo)); - - // Directly binding the storage buffer is not supported for d3d9 - ASSERT(indexInfo->storage == nullptr); - - if (indexInfo->serial != mAppliedIBSerial) - { - IndexBuffer9 *indexBuffer = GetAs<IndexBuffer9>(indexInfo->indexBuffer); - - mDevice->SetIndices(indexBuffer->getBuffer()); - mAppliedIBSerial = indexInfo->serial; - } - - return gl::NoError(); -} - -gl::Error Renderer9::drawArraysImpl(const gl::Context *context, - GLenum mode, - GLint startVertex, - GLsizei count, - GLsizei instances) -{ - ASSERT(!context->getGLState().isTransformFeedbackActiveUnpaused()); - - startScene(); - - if (mode == GL_LINE_LOOP) - { - return drawLineLoop(context, count, GL_NONE, nullptr, 0, nullptr); - } - else if (instances > 0) - { - StaticIndexBufferInterface *countingIB = nullptr; - gl::Error error = getCountingIB(count, &countingIB); - if (error.isError()) - { - return error; - } - - if (mAppliedIBSerial != countingIB->getSerial()) - { - IndexBuffer9 *indexBuffer = GetAs<IndexBuffer9>(countingIB->getIndexBuffer()); - - mDevice->SetIndices(indexBuffer->getBuffer()); - mAppliedIBSerial = countingIB->getSerial(); - } - - for (int i = 0; i < mRepeatDraw; i++) - { - mDevice->DrawIndexedPrimitive(mPrimitiveType, 0, 0, count, 0, mPrimitiveCount); - } - - return gl::NoError(); - } - else // Regular case - { - mDevice->DrawPrimitive(mPrimitiveType, 0, mPrimitiveCount); - return gl::NoError(); - } -} - -gl::Error Renderer9::drawElementsImpl(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices, - GLsizei instances) -{ - TranslatedIndexData indexInfo; - - ANGLE_TRY(applyIndexBuffer(context, indices, count, mode, type, &indexInfo)); - - const auto &lazyIndexRange = context->getParams<gl::HasIndexRange>(); - const gl::IndexRange &indexRange = lazyIndexRange.getIndexRange().value(); - size_t vertexCount = indexRange.vertexCount(); - ANGLE_TRY(applyVertexBuffer(context, mode, static_cast<GLsizei>(indexRange.start), - static_cast<GLsizei>(vertexCount), instances, &indexInfo)); - - startScene(); - - int minIndex = static_cast<int>(indexRange.start); - - gl::VertexArray *vao = context->getGLState().getVertexArray(); - gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get(); - - if (mode == GL_POINTS) - { - return drawIndexedPoints(context, count, type, indices, minIndex, elementArrayBuffer); - } - else if (mode == GL_LINE_LOOP) - { - return drawLineLoop(context, count, type, indices, minIndex, elementArrayBuffer); - } - else - { - for (int i = 0; i < mRepeatDraw; i++) - { - mDevice->DrawIndexedPrimitive(mPrimitiveType, -minIndex, minIndex, - static_cast<UINT>(vertexCount), indexInfo.startIndex, - mPrimitiveCount); - } - return gl::NoError(); - } -} - -gl::Error Renderer9::drawLineLoop(const gl::Context *context, - GLsizei count, - GLenum type, - const void *indices, - int minIndex, - gl::Buffer *elementArrayBuffer) -{ - // Get the raw indices for an indexed draw - if (type != GL_NONE && elementArrayBuffer) - { - BufferD3D *storage = GetImplAs<BufferD3D>(elementArrayBuffer); - intptr_t offset = reinterpret_cast<intptr_t>(indices); - const uint8_t *bufferData = nullptr; - gl::Error error = storage->getData(context, &bufferData); - if (error.isError()) - { - return error; - } - indices = bufferData + offset; - } - - unsigned int startIndex = 0; - - if (getNativeExtensions().elementIndexUint) - { - if (!mLineLoopIB) - { - mLineLoopIB = new StreamingIndexBufferInterface(this); - gl::Error error = - mLineLoopIB->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_INT); - if (error.isError()) - { - SafeDelete(mLineLoopIB); - return error; - } - } - - // Checked by Renderer9::applyPrimitiveType - ASSERT(count >= 0); - - if (static_cast<unsigned int>(count) + 1 > - (std::numeric_limits<unsigned int>::max() / sizeof(unsigned int))) - { - return gl::OutOfMemory() << "Failed to create a 32-bit looping index buffer for " - "GL_LINE_LOOP, too many indices required."; - } - - const unsigned int spaceNeeded = - (static_cast<unsigned int>(count) + 1) * sizeof(unsigned int); - gl::Error error = mLineLoopIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT); - if (error.isError()) - { - return error; - } - - void *mappedMemory = nullptr; - unsigned int offset = 0; - error = mLineLoopIB->mapBuffer(spaceNeeded, &mappedMemory, &offset); - if (error.isError()) - { - return error; - } - - startIndex = static_cast<unsigned int>(offset) / 4; - unsigned int *data = reinterpret_cast<unsigned int *>(mappedMemory); - - switch (type) - { - case GL_NONE: // Non-indexed draw - for (int i = 0; i < count; i++) - { - data[i] = i; - } - data[count] = 0; - break; - case GL_UNSIGNED_BYTE: - for (int i = 0; i < count; i++) - { - data[i] = static_cast<const GLubyte *>(indices)[i]; - } - data[count] = static_cast<const GLubyte *>(indices)[0]; - break; - case GL_UNSIGNED_SHORT: - for (int i = 0; i < count; i++) - { - data[i] = static_cast<const GLushort *>(indices)[i]; - } - data[count] = static_cast<const GLushort *>(indices)[0]; - break; - case GL_UNSIGNED_INT: - for (int i = 0; i < count; i++) - { - data[i] = static_cast<const GLuint *>(indices)[i]; - } - data[count] = static_cast<const GLuint *>(indices)[0]; - break; - default: - UNREACHABLE(); - } - - error = mLineLoopIB->unmapBuffer(); - if (error.isError()) - { - return error; - } - } - else - { - if (!mLineLoopIB) - { - mLineLoopIB = new StreamingIndexBufferInterface(this); - gl::Error error = - mLineLoopIB->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_SHORT); - if (error.isError()) - { - SafeDelete(mLineLoopIB); - return error; - } - } - - // Checked by Renderer9::applyPrimitiveType - ASSERT(count >= 0); - - if (static_cast<unsigned int>(count) + 1 > - (std::numeric_limits<unsigned short>::max() / sizeof(unsigned short))) - { - return gl::OutOfMemory() << "Failed to create a 16-bit looping index buffer for " - "GL_LINE_LOOP, too many indices required."; - } - - const unsigned int spaceNeeded = - (static_cast<unsigned int>(count) + 1) * sizeof(unsigned short); - gl::Error error = mLineLoopIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_SHORT); - if (error.isError()) - { - return error; - } - - void *mappedMemory = nullptr; - unsigned int offset; - error = mLineLoopIB->mapBuffer(spaceNeeded, &mappedMemory, &offset); - if (error.isError()) - { - return error; - } - - startIndex = static_cast<unsigned int>(offset) / 2; - unsigned short *data = reinterpret_cast<unsigned short *>(mappedMemory); - - switch (type) - { - case GL_NONE: // Non-indexed draw - for (int i = 0; i < count; i++) - { - data[i] = static_cast<unsigned short>(i); - } - data[count] = 0; - break; - case GL_UNSIGNED_BYTE: - for (int i = 0; i < count; i++) - { - data[i] = static_cast<const GLubyte *>(indices)[i]; - } - data[count] = static_cast<const GLubyte *>(indices)[0]; - break; - case GL_UNSIGNED_SHORT: - for (int i = 0; i < count; i++) - { - data[i] = static_cast<const GLushort *>(indices)[i]; - } - data[count] = static_cast<const GLushort *>(indices)[0]; - break; - case GL_UNSIGNED_INT: - for (int i = 0; i < count; i++) - { - data[i] = static_cast<unsigned short>(static_cast<const GLuint *>(indices)[i]); - } - data[count] = static_cast<unsigned short>(static_cast<const GLuint *>(indices)[0]); - break; - default: - UNREACHABLE(); - } - - error = mLineLoopIB->unmapBuffer(); - if (error.isError()) - { - return error; - } - } - - if (mAppliedIBSerial != mLineLoopIB->getSerial()) - { - IndexBuffer9 *indexBuffer = GetAs<IndexBuffer9>(mLineLoopIB->getIndexBuffer()); - - mDevice->SetIndices(indexBuffer->getBuffer()); - mAppliedIBSerial = mLineLoopIB->getSerial(); - } - - mDevice->DrawIndexedPrimitive(D3DPT_LINESTRIP, -minIndex, minIndex, count, startIndex, count); - - return gl::NoError(); -} - -template <typename T> -static gl::Error drawPoints(IDirect3DDevice9 *device, - GLsizei count, - const void *indices, - int minIndex) -{ - for (int i = 0; i < count; i++) - { - unsigned int indexValue = - static_cast<unsigned int>(static_cast<const T *>(indices)[i]) - minIndex; - device->DrawPrimitive(D3DPT_POINTLIST, indexValue, 1); - } - - return gl::NoError(); -} - -gl::Error Renderer9::drawIndexedPoints(const gl::Context *context, - GLsizei count, - GLenum type, - const void *indices, - int minIndex, - gl::Buffer *elementArrayBuffer) -{ - // Drawing index point lists is unsupported in d3d9, fall back to a regular DrawPrimitive call - // for each individual point. This call is not expected to happen often. - - if (elementArrayBuffer) - { - BufferD3D *storage = GetImplAs<BufferD3D>(elementArrayBuffer); - intptr_t offset = reinterpret_cast<intptr_t>(indices); - - const uint8_t *bufferData = nullptr; - gl::Error error = storage->getData(context, &bufferData); - if (error.isError()) - { - return error; - } - - indices = bufferData + offset; - } - - switch (type) - { - case GL_UNSIGNED_BYTE: - return drawPoints<GLubyte>(mDevice, count, indices, minIndex); - case GL_UNSIGNED_SHORT: - return drawPoints<GLushort>(mDevice, count, indices, minIndex); - case GL_UNSIGNED_INT: - return drawPoints<GLuint>(mDevice, count, indices, minIndex); - default: - UNREACHABLE(); - return gl::InternalError(); - } -} - -gl::Error Renderer9::getCountingIB(size_t count, StaticIndexBufferInterface **outIB) -{ - // Update the counting index buffer if it is not large enough or has not been created yet. - if (count <= 65536) // 16-bit indices - { - const unsigned int spaceNeeded = static_cast<unsigned int>(count) * sizeof(unsigned short); - - if (!mCountingIB || mCountingIB->getBufferSize() < spaceNeeded) - { - SafeDelete(mCountingIB); - mCountingIB = new StaticIndexBufferInterface(this); - ANGLE_TRY(mCountingIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_SHORT)); - - void *mappedMemory = nullptr; - ANGLE_TRY(mCountingIB->mapBuffer(spaceNeeded, &mappedMemory, nullptr)); - - unsigned short *data = reinterpret_cast<unsigned short *>(mappedMemory); - for (size_t i = 0; i < count; i++) - { - data[i] = static_cast<unsigned short>(i); - } - - ANGLE_TRY(mCountingIB->unmapBuffer()); - } - } - else if (getNativeExtensions().elementIndexUint) - { - const unsigned int spaceNeeded = static_cast<unsigned int>(count) * sizeof(unsigned int); - - if (!mCountingIB || mCountingIB->getBufferSize() < spaceNeeded) - { - SafeDelete(mCountingIB); - mCountingIB = new StaticIndexBufferInterface(this); - ANGLE_TRY(mCountingIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT)); - - void *mappedMemory = nullptr; - ANGLE_TRY(mCountingIB->mapBuffer(spaceNeeded, &mappedMemory, nullptr)); - - unsigned int *data = reinterpret_cast<unsigned int *>(mappedMemory); - for (unsigned int i = 0; i < count; i++) - { - data[i] = i; - } - - ANGLE_TRY(mCountingIB->unmapBuffer()); - } - } - else - { - return gl::OutOfMemory() - << "Could not create a counting index buffer for glDrawArraysInstanced."; - } - - *outIB = mCountingIB; - return gl::NoError(); -} - -gl::Error Renderer9::applyShaders(const gl::Context *context, GLenum drawMode) -{ - const gl::State &state = context->getContextState().getState(); - // This method is called single-threaded. - ANGLE_TRY(ensureHLSLCompilerInitialized()); - - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(state.getProgram()); - VertexArray9 *vao = GetImplAs<VertexArray9>(state.getVertexArray()); - programD3D->updateCachedInputLayout(vao->getCurrentStateSerial(), state); - - ShaderExecutableD3D *vertexExe = nullptr; - ANGLE_TRY(programD3D->getVertexExecutableForCachedInputLayout(&vertexExe, nullptr)); - - const gl::Framebuffer *drawFramebuffer = state.getDrawFramebuffer(); - programD3D->updateCachedOutputLayout(context, drawFramebuffer); - - ShaderExecutableD3D *pixelExe = nullptr; - ANGLE_TRY(programD3D->getPixelExecutableForCachedOutputLayout(&pixelExe, nullptr)); - - IDirect3DVertexShader9 *vertexShader = - (vertexExe ? GetAs<ShaderExecutable9>(vertexExe)->getVertexShader() : nullptr); - IDirect3DPixelShader9 *pixelShader = - (pixelExe ? GetAs<ShaderExecutable9>(pixelExe)->getPixelShader() : nullptr); - - if (vertexShader != mAppliedVertexShader) - { - mDevice->SetVertexShader(vertexShader); - mAppliedVertexShader = vertexShader; - } - - if (pixelShader != mAppliedPixelShader) - { - mDevice->SetPixelShader(pixelShader); - mAppliedPixelShader = pixelShader; - } - - // D3D9 has a quirk where creating multiple shaders with the same content - // can return the same shader pointer. Because GL programs store different data - // per-program, checking the program serial guarantees we upload fresh - // uniform data even if our shader pointers are the same. - // https://code.google.com/p/angleproject/issues/detail?id=661 - unsigned int programSerial = programD3D->getSerial(); - if (programSerial != mAppliedProgramSerial) - { - programD3D->dirtyAllUniforms(); - mStateManager.forceSetDXUniformsState(); - mAppliedProgramSerial = programSerial; - } - - ANGLE_TRY(applyUniforms(programD3D)); - - // Driver uniforms - mStateManager.setShaderConstants(); - - return gl::NoError(); -} - -gl::Error Renderer9::applyUniforms(ProgramD3D *programD3D) -{ - // Skip updates if we're not dirty. Note that D3D9 cannot have compute. - if (!programD3D->areVertexUniformsDirty() && !programD3D->areFragmentUniformsDirty()) - { - return gl::NoError(); - } - - const auto &uniformArray = programD3D->getD3DUniforms(); - - for (const D3DUniform *targetUniform : uniformArray) - { - // Built-in uniforms must be skipped. - if (!targetUniform->isReferencedByFragmentShader() && - !targetUniform->isReferencedByVertexShader()) - continue; - - const GLfloat *f = reinterpret_cast<const GLfloat *>(targetUniform->firstNonNullData()); - const GLint *i = reinterpret_cast<const GLint *>(targetUniform->firstNonNullData()); - - switch (targetUniform->typeInfo.type) - { - case GL_SAMPLER_2D: - case GL_SAMPLER_CUBE: - case GL_SAMPLER_EXTERNAL_OES: - break; - case GL_BOOL: - case GL_BOOL_VEC2: - case GL_BOOL_VEC3: - case GL_BOOL_VEC4: - applyUniformnbv(targetUniform, i); - break; - case GL_FLOAT: - case GL_FLOAT_VEC2: - case GL_FLOAT_VEC3: - case GL_FLOAT_VEC4: - case GL_FLOAT_MAT2: - case GL_FLOAT_MAT3: - case GL_FLOAT_MAT4: - applyUniformnfv(targetUniform, f); - break; - case GL_INT: - case GL_INT_VEC2: - case GL_INT_VEC3: - case GL_INT_VEC4: - applyUniformniv(targetUniform, i); - break; - default: - UNREACHABLE(); - } - } - - programD3D->markUniformsClean(); - return gl::NoError(); -} - -void Renderer9::applyUniformnfv(const D3DUniform *targetUniform, const GLfloat *v) -{ - if (targetUniform->isReferencedByFragmentShader()) - { - mDevice->SetPixelShaderConstantF(targetUniform->psRegisterIndex, v, - targetUniform->registerCount); - } - - if (targetUniform->isReferencedByVertexShader()) - { - mDevice->SetVertexShaderConstantF(targetUniform->vsRegisterIndex, v, - targetUniform->registerCount); - } -} - -void Renderer9::applyUniformniv(const D3DUniform *targetUniform, const GLint *v) -{ - ASSERT(targetUniform->registerCount <= MAX_VERTEX_CONSTANT_VECTORS_D3D9); - GLfloat vector[MAX_VERTEX_CONSTANT_VECTORS_D3D9][4]; - - for (unsigned int i = 0; i < targetUniform->registerCount; i++) - { - vector[i][0] = (GLfloat)v[4 * i + 0]; - vector[i][1] = (GLfloat)v[4 * i + 1]; - vector[i][2] = (GLfloat)v[4 * i + 2]; - vector[i][3] = (GLfloat)v[4 * i + 3]; - } - - applyUniformnfv(targetUniform, (GLfloat *)vector); -} - -void Renderer9::applyUniformnbv(const D3DUniform *targetUniform, const GLint *v) -{ - ASSERT(targetUniform->registerCount <= MAX_VERTEX_CONSTANT_VECTORS_D3D9); - GLfloat vector[MAX_VERTEX_CONSTANT_VECTORS_D3D9][4]; - - for (unsigned int i = 0; i < targetUniform->registerCount; i++) - { - vector[i][0] = (v[4 * i + 0] == GL_FALSE) ? 0.0f : 1.0f; - vector[i][1] = (v[4 * i + 1] == GL_FALSE) ? 0.0f : 1.0f; - vector[i][2] = (v[4 * i + 2] == GL_FALSE) ? 0.0f : 1.0f; - vector[i][3] = (v[4 * i + 3] == GL_FALSE) ? 0.0f : 1.0f; - } - - applyUniformnfv(targetUniform, (GLfloat *)vector); -} - -gl::Error Renderer9::clear(const gl::Context *context, - const ClearParameters &clearParams, - const gl::FramebufferAttachment *colorBuffer, - const gl::FramebufferAttachment *depthStencilBuffer) -{ - if (clearParams.colorType != GL_FLOAT) - { - // Clearing buffers with non-float values is not supported by Renderer9 and ES 2.0 - UNREACHABLE(); - return gl::InternalError(); - } - - bool clearColor = clearParams.clearColor[0]; - for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++) - { - if (clearParams.clearColor[i] != clearColor) - { - // Clearing individual buffers other than buffer zero is not supported by Renderer9 and - // ES 2.0 - UNREACHABLE(); - return gl::InternalError(); - } - } - - float depth = gl::clamp01(clearParams.depthValue); - DWORD stencil = clearParams.stencilValue & 0x000000FF; - - unsigned int stencilUnmasked = 0x0; - if (clearParams.clearStencil && depthStencilBuffer->getStencilSize() > 0) - { - ASSERT(depthStencilBuffer != nullptr); - - RenderTargetD3D *stencilRenderTarget = nullptr; - gl::Error error = depthStencilBuffer->getRenderTarget(context, &stencilRenderTarget); - if (error.isError()) - { - return error; - } - - RenderTarget9 *stencilRenderTarget9 = GetAs<RenderTarget9>(stencilRenderTarget); - ASSERT(stencilRenderTarget9); - - const d3d9::D3DFormat &d3dFormatInfo = - d3d9::GetD3DFormatInfo(stencilRenderTarget9->getD3DFormat()); - stencilUnmasked = (0x1 << d3dFormatInfo.stencilBits) - 1; - } - - const bool needMaskedStencilClear = - clearParams.clearStencil && - (clearParams.stencilWriteMask & stencilUnmasked) != stencilUnmasked; - - bool needMaskedColorClear = false; - D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 0); - if (clearColor) - { - ASSERT(colorBuffer != nullptr); - - RenderTargetD3D *colorRenderTarget = nullptr; - gl::Error error = colorBuffer->getRenderTarget(context, &colorRenderTarget); - if (error.isError()) - { - return error; - } - - RenderTarget9 *colorRenderTarget9 = GetAs<RenderTarget9>(colorRenderTarget); - ASSERT(colorRenderTarget9); - - const gl::InternalFormat &formatInfo = *colorBuffer->getFormat().info; - const d3d9::D3DFormat &d3dFormatInfo = - d3d9::GetD3DFormatInfo(colorRenderTarget9->getD3DFormat()); - - color = - D3DCOLOR_ARGB(gl::unorm<8>((formatInfo.alphaBits == 0 && d3dFormatInfo.alphaBits > 0) - ? 1.0f - : clearParams.colorF.alpha), - gl::unorm<8>((formatInfo.redBits == 0 && d3dFormatInfo.redBits > 0) - ? 0.0f - : clearParams.colorF.red), - gl::unorm<8>((formatInfo.greenBits == 0 && d3dFormatInfo.greenBits > 0) - ? 0.0f - : clearParams.colorF.green), - gl::unorm<8>((formatInfo.blueBits == 0 && d3dFormatInfo.blueBits > 0) - ? 0.0f - : clearParams.colorF.blue)); - - if ((formatInfo.redBits > 0 && !clearParams.colorMaskRed) || - (formatInfo.greenBits > 0 && !clearParams.colorMaskGreen) || - (formatInfo.blueBits > 0 && !clearParams.colorMaskBlue) || - (formatInfo.alphaBits > 0 && !clearParams.colorMaskAlpha)) - { - needMaskedColorClear = true; - } - } - - if (needMaskedColorClear || needMaskedStencilClear) - { - // State which is altered in all paths from this point to the clear call is saved. - // State which is altered in only some paths will be flagged dirty in the case that - // that path is taken. - HRESULT hr; - if (mMaskedClearSavedState == nullptr) - { - hr = mDevice->BeginStateBlock(); - ASSERT(SUCCEEDED(hr) || hr == D3DERR_OUTOFVIDEOMEMORY || hr == E_OUTOFMEMORY); - - mDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); - mDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); - mDevice->SetRenderState(D3DRS_ZENABLE, FALSE); - mDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - mDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - mDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - mDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - mDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 0); - mDevice->SetRenderState(D3DRS_COLORWRITEENABLE, 0); - mDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); - mDevice->SetPixelShader(nullptr); - mDevice->SetVertexShader(nullptr); - mDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE); - mDevice->SetStreamSource(0, nullptr, 0, 0); - mDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE); - mDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); - mDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR); - mDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - mDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR); - mDevice->SetRenderState(D3DRS_TEXTUREFACTOR, color); - mDevice->SetRenderState(D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF); - - for (int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++) - { - mDevice->SetStreamSourceFreq(i, 1); - } - - hr = mDevice->EndStateBlock(&mMaskedClearSavedState); - ASSERT(SUCCEEDED(hr) || hr == D3DERR_OUTOFVIDEOMEMORY || hr == E_OUTOFMEMORY); - } - - ASSERT(mMaskedClearSavedState != nullptr); - - if (mMaskedClearSavedState != nullptr) - { - hr = mMaskedClearSavedState->Capture(); - ASSERT(SUCCEEDED(hr)); - } - - mDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); - mDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); - mDevice->SetRenderState(D3DRS_ZENABLE, FALSE); - mDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - mDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - mDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - mDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - mDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 0); - - if (clearColor) - { - mDevice->SetRenderState( - D3DRS_COLORWRITEENABLE, - gl_d3d9::ConvertColorMask(clearParams.colorMaskRed, clearParams.colorMaskGreen, - clearParams.colorMaskBlue, clearParams.colorMaskAlpha)); - } - else - { - mDevice->SetRenderState(D3DRS_COLORWRITEENABLE, 0); - } - - if (stencilUnmasked != 0x0 && clearParams.clearStencil) - { - mDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE); - mDevice->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, FALSE); - mDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); - mDevice->SetRenderState(D3DRS_STENCILREF, stencil); - mDevice->SetRenderState(D3DRS_STENCILWRITEMASK, clearParams.stencilWriteMask); - mDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_REPLACE); - mDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_REPLACE); - mDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE); - } - else - { - mDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); - } - - mDevice->SetPixelShader(nullptr); - mDevice->SetVertexShader(nullptr); - mDevice->SetFVF(D3DFVF_XYZRHW); - mDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE); - mDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); - mDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR); - mDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - mDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR); - mDevice->SetRenderState(D3DRS_TEXTUREFACTOR, color); - mDevice->SetRenderState(D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF); - - for (int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++) - { - mDevice->SetStreamSourceFreq(i, 1); - } - - int renderTargetWidth = mStateManager.getRenderTargetWidth(); - int renderTargetHeight = mStateManager.getRenderTargetHeight(); - - float quad[4][4]; // A quadrilateral covering the target, aligned to match the edges - quad[0][0] = -0.5f; - quad[0][1] = renderTargetHeight - 0.5f; - quad[0][2] = 0.0f; - quad[0][3] = 1.0f; - - quad[1][0] = renderTargetWidth - 0.5f; - quad[1][1] = renderTargetHeight - 0.5f; - quad[1][2] = 0.0f; - quad[1][3] = 1.0f; - - quad[2][0] = -0.5f; - quad[2][1] = -0.5f; - quad[2][2] = 0.0f; - quad[2][3] = 1.0f; - - quad[3][0] = renderTargetWidth - 0.5f; - quad[3][1] = -0.5f; - quad[3][2] = 0.0f; - quad[3][3] = 1.0f; - - startScene(); - mDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, quad, sizeof(float[4])); - - if (clearParams.clearDepth) - { - mDevice->SetRenderState(D3DRS_ZENABLE, TRUE); - mDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); - mDevice->Clear(0, nullptr, D3DCLEAR_ZBUFFER, color, depth, stencil); - } - - if (mMaskedClearSavedState != nullptr) - { - mMaskedClearSavedState->Apply(); - } - } - else if (clearColor || clearParams.clearDepth || clearParams.clearStencil) - { - DWORD dxClearFlags = 0; - if (clearColor) - { - dxClearFlags |= D3DCLEAR_TARGET; - } - if (clearParams.clearDepth) - { - dxClearFlags |= D3DCLEAR_ZBUFFER; - } - if (clearParams.clearStencil) - { - dxClearFlags |= D3DCLEAR_STENCIL; - } - - mDevice->Clear(0, nullptr, dxClearFlags, color, depth, stencil); - } - - return gl::NoError(); -} - -void Renderer9::markAllStateDirty() -{ - mAppliedRenderTargetSerial = 0; - mAppliedDepthStencilSerial = 0; - mDepthStencilInitialized = false; - mRenderTargetDescInitialized = false; - - mStateManager.forceSetRasterState(); - mStateManager.forceSetDepthStencilState(); - mStateManager.forceSetBlendState(); - mStateManager.forceSetScissorState(); - mStateManager.forceSetViewportState(); - - ASSERT(mCurVertexSamplerStates.size() == mCurVertexTextures.size()); - for (unsigned int i = 0; i < mCurVertexTextures.size(); i++) - { - mCurVertexSamplerStates[i].forceSet = true; - mCurVertexTextures[i] = angle::DirtyPointer; - } - - ASSERT(mCurPixelSamplerStates.size() == mCurPixelTextures.size()); - for (unsigned int i = 0; i < mCurPixelSamplerStates.size(); i++) - { - mCurPixelSamplerStates[i].forceSet = true; - mCurPixelTextures[i] = angle::DirtyPointer; - } - - mAppliedIBSerial = 0; - mAppliedVertexShader = nullptr; - mAppliedPixelShader = nullptr; - mAppliedProgramSerial = 0; - mStateManager.forceSetDXUniformsState(); - - mVertexDeclarationCache.markStateDirty(); -} - -void Renderer9::releaseDeviceResources() -{ - for (size_t i = 0; i < mEventQueryPool.size(); i++) - { - SafeRelease(mEventQueryPool[i]); - } - mEventQueryPool.clear(); - - SafeRelease(mMaskedClearSavedState); - - mVertexShaderCache.clear(); - mPixelShaderCache.clear(); - - SafeDelete(mBlit); - SafeDelete(mVertexDataManager); - SafeDelete(mIndexDataManager); - SafeDelete(mLineLoopIB); - SafeDelete(mCountingIB); - - for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++) - { - if (mNullColorbufferCache[i].buffer) - { - mNullColorbufferCache[i].buffer->detach(mDisplay->getProxyContext()); - } - SafeDelete(mNullColorbufferCache[i].buffer); - } -} - -// set notify to true to broadcast a message to all contexts of the device loss -bool Renderer9::testDeviceLost() -{ - HRESULT status = getDeviceStatusCode(); - return FAILED(status); -} - -HRESULT Renderer9::getDeviceStatusCode() -{ - HRESULT status = D3D_OK; - - if (mDeviceEx) - { - status = mDeviceEx->CheckDeviceState(nullptr); - } - else if (mDevice) - { - status = mDevice->TestCooperativeLevel(); - } - - return status; -} - -bool Renderer9::testDeviceResettable() -{ - // On D3D9Ex, DEVICELOST represents a hung device that needs to be restarted - // DEVICEREMOVED indicates the device has been stopped and must be recreated - switch (getDeviceStatusCode()) - { - case D3DERR_DEVICENOTRESET: - case D3DERR_DEVICEHUNG: - return true; - case D3DERR_DEVICELOST: - return (mDeviceEx != nullptr); - case D3DERR_DEVICEREMOVED: - ASSERT(mDeviceEx != nullptr); - return isRemovedDeviceResettable(); - default: - return false; - } -} - -bool Renderer9::resetDevice() -{ - releaseDeviceResources(); - - D3DPRESENT_PARAMETERS presentParameters = getDefaultPresentParameters(); - - HRESULT result = D3D_OK; - bool lost = testDeviceLost(); - bool removedDevice = (getDeviceStatusCode() == D3DERR_DEVICEREMOVED); - - // Device Removed is a feature which is only present with D3D9Ex - ASSERT(mDeviceEx != nullptr || !removedDevice); - - for (int attempts = 3; lost && attempts > 0; attempts--) - { - if (removedDevice) - { - // Device removed, which may trigger on driver reinstallation, - // may cause a longer wait other reset attempts before the - // system is ready to handle creating a new device. - Sleep(800); - lost = !resetRemovedDevice(); - } - else if (mDeviceEx) - { - Sleep(500); // Give the graphics driver some CPU time - result = mDeviceEx->ResetEx(&presentParameters, nullptr); - lost = testDeviceLost(); - } - else - { - result = mDevice->TestCooperativeLevel(); - while (result == D3DERR_DEVICELOST) - { - Sleep(100); // Give the graphics driver some CPU time - result = mDevice->TestCooperativeLevel(); - } - - if (result == D3DERR_DEVICENOTRESET) - { - result = mDevice->Reset(&presentParameters); - } - lost = testDeviceLost(); - } - } - - if (FAILED(result)) - { - ERR() << "Reset/ResetEx failed multiple times, " << gl::FmtHR(result); - return false; - } - - if (removedDevice && lost) - { - ERR() << "Device lost reset failed multiple times"; - return false; - } - - // If the device was removed, we already finished re-initialization in resetRemovedDevice - if (!removedDevice) - { - // reset device defaults - if (initializeDevice().isError()) - { - return false; - } - } - - return true; -} - -bool Renderer9::isRemovedDeviceResettable() const -{ - bool success = false; - -#if ANGLE_D3D9EX == ANGLE_ENABLED - IDirect3D9Ex *d3d9Ex = nullptr; - typedef HRESULT(WINAPI * Direct3DCreate9ExFunc)(UINT, IDirect3D9Ex **); - Direct3DCreate9ExFunc Direct3DCreate9ExPtr = - reinterpret_cast<Direct3DCreate9ExFunc>(GetProcAddress(mD3d9Module, "Direct3DCreate9Ex")); - - if (Direct3DCreate9ExPtr && SUCCEEDED(Direct3DCreate9ExPtr(D3D_SDK_VERSION, &d3d9Ex))) - { - D3DCAPS9 deviceCaps; - HRESULT result = d3d9Ex->GetDeviceCaps(mAdapter, mDeviceType, &deviceCaps); - success = SUCCEEDED(result); - } - - SafeRelease(d3d9Ex); -#else - ASSERT(UNREACHABLE()); -#endif - - return success; -} - -bool Renderer9::resetRemovedDevice() -{ - // From http://msdn.microsoft.com/en-us/library/windows/desktop/bb172554(v=vs.85).aspx: - // The hardware adapter has been removed. Application must destroy the device, do enumeration of - // adapters and create another Direct3D device. If application continues rendering without - // calling Reset, the rendering calls will succeed. Applies to Direct3D 9Ex only. - release(); - return !initialize().isError(); -} - -VendorID Renderer9::getVendorId() const -{ - return static_cast<VendorID>(mAdapterIdentifier.VendorId); -} - -std::string Renderer9::getRendererDescription() const -{ - std::ostringstream rendererString; - - rendererString << mAdapterIdentifier.Description; - if (getShareHandleSupport()) - { - rendererString << " Direct3D9Ex"; - } - else - { - rendererString << " Direct3D9"; - } - - rendererString << " vs_" << D3DSHADER_VERSION_MAJOR(mDeviceCaps.VertexShaderVersion) << "_" - << D3DSHADER_VERSION_MINOR(mDeviceCaps.VertexShaderVersion); - rendererString << " ps_" << D3DSHADER_VERSION_MAJOR(mDeviceCaps.PixelShaderVersion) << "_" - << D3DSHADER_VERSION_MINOR(mDeviceCaps.PixelShaderVersion); - - return rendererString.str(); -} - -DeviceIdentifier Renderer9::getAdapterIdentifier() const -{ - DeviceIdentifier deviceIdentifier = {0}; - deviceIdentifier.VendorId = static_cast<UINT>(mAdapterIdentifier.VendorId); - deviceIdentifier.DeviceId = static_cast<UINT>(mAdapterIdentifier.DeviceId); - deviceIdentifier.SubSysId = static_cast<UINT>(mAdapterIdentifier.SubSysId); - deviceIdentifier.Revision = static_cast<UINT>(mAdapterIdentifier.Revision); - deviceIdentifier.FeatureLevel = 0; - - return deviceIdentifier; -} - -unsigned int Renderer9::getReservedVertexUniformVectors() const -{ - return d3d9_gl::GetReservedVertexUniformVectors(); -} - -unsigned int Renderer9::getReservedFragmentUniformVectors() const -{ - return d3d9_gl::GetReservedFragmentUniformVectors(); -} - -bool Renderer9::getShareHandleSupport() const -{ - // PIX doesn't seem to support using share handles, so disable them. - return (mD3d9Ex != nullptr) && !gl::DebugAnnotationsActive(); -} - -int Renderer9::getMajorShaderModel() const -{ - return D3DSHADER_VERSION_MAJOR(mDeviceCaps.PixelShaderVersion); -} - -int Renderer9::getMinorShaderModel() const -{ - return D3DSHADER_VERSION_MINOR(mDeviceCaps.PixelShaderVersion); -} - -std::string Renderer9::getShaderModelSuffix() const -{ - return ""; -} - -DWORD Renderer9::getCapsDeclTypes() const -{ - return mDeviceCaps.DeclTypes; -} - -D3DPOOL Renderer9::getBufferPool(DWORD usage) const -{ - if (mD3d9Ex != nullptr) - { - return D3DPOOL_DEFAULT; - } - else - { - if (!(usage & D3DUSAGE_DYNAMIC)) - { - return D3DPOOL_MANAGED; - } - } - - return D3DPOOL_DEFAULT; -} - -gl::Error Renderer9::copyImage2D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) -{ - RECT rect; - rect.left = sourceRect.x; - rect.top = sourceRect.y; - rect.right = sourceRect.x + sourceRect.width; - rect.bottom = sourceRect.y + sourceRect.height; - - return mBlit->copy2D(context, framebuffer, rect, destFormat, destOffset, storage, level); -} - -gl::Error Renderer9::copyImageCube(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum target, - GLint level) -{ - RECT rect; - rect.left = sourceRect.x; - rect.top = sourceRect.y; - rect.right = sourceRect.x + sourceRect.width; - rect.bottom = sourceRect.y + sourceRect.height; - - return mBlit->copyCube(context, framebuffer, rect, destFormat, destOffset, storage, target, - level); -} - -gl::Error Renderer9::copyImage3D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) -{ - // 3D textures are not available in the D3D9 backend. - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error Renderer9::copyImage2DArray(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) -{ - // 2D array textures are not available in the D3D9 backend. - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error Renderer9::copyTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum destTarget, - GLint destLevel, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) -{ - RECT rect; - rect.left = sourceRect.x; - rect.top = sourceRect.y; - rect.right = sourceRect.x + sourceRect.width; - rect.bottom = sourceRect.y + sourceRect.height; - - return mBlit->copyTexture(context, source, sourceLevel, rect, destFormat, destOffset, storage, - destTarget, destLevel, unpackFlipY, unpackPremultiplyAlpha, - unpackUnmultiplyAlpha); -} - -gl::Error Renderer9::copyCompressedTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - TextureStorage *storage, - GLint destLevel) -{ - UNIMPLEMENTED(); - return gl::InternalError(); -} - -gl::Error Renderer9::createRenderTarget(int width, - int height, - GLenum format, - GLsizei samples, - RenderTargetD3D **outRT) -{ - const d3d9::TextureFormat &d3d9FormatInfo = d3d9::GetTextureFormatInfo(format); - - const gl::TextureCaps &textureCaps = getNativeTextureCaps().get(format); - GLuint supportedSamples = textureCaps.getNearestSamples(samples); - - IDirect3DTexture9 *texture = nullptr; - IDirect3DSurface9 *renderTarget = nullptr; - if (width > 0 && height > 0) - { - bool requiresInitialization = false; - HRESULT result = D3DERR_INVALIDCALL; - - const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(format); - if (formatInfo.depthBits > 0 || formatInfo.stencilBits > 0) - { - result = mDevice->CreateDepthStencilSurface( - width, height, d3d9FormatInfo.renderFormat, - gl_d3d9::GetMultisampleType(supportedSamples), 0, FALSE, &renderTarget, nullptr); - } - else - { - requiresInitialization = (d3d9FormatInfo.dataInitializerFunction != nullptr); - if (supportedSamples > 0) - { - result = mDevice->CreateRenderTarget(width, height, d3d9FormatInfo.renderFormat, - gl_d3d9::GetMultisampleType(supportedSamples), - 0, FALSE, &renderTarget, nullptr); - } - else - { - result = mDevice->CreateTexture( - width, height, 1, D3DUSAGE_RENDERTARGET, d3d9FormatInfo.texFormat, - getTexturePool(D3DUSAGE_RENDERTARGET), &texture, nullptr); - if (!FAILED(result)) - { - result = texture->GetSurfaceLevel(0, &renderTarget); - } - } - } - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() << "Failed to create render target, " << gl::FmtHR(result); - } - - if (requiresInitialization) - { - // This format requires that the data be initialized before the render target can be - // used Unfortunately this requires a Get call on the d3d device but it is far better - // than having to mark the render target as lockable and copy data to the gpu. - IDirect3DSurface9 *prevRenderTarget = nullptr; - mDevice->GetRenderTarget(0, &prevRenderTarget); - mDevice->SetRenderTarget(0, renderTarget); - mDevice->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_RGBA(0, 0, 0, 255), 0.0f, 0); - mDevice->SetRenderTarget(0, prevRenderTarget); - } - } - - *outRT = new TextureRenderTarget9(texture, 0, renderTarget, format, width, height, 1, - supportedSamples); - return gl::NoError(); -} - -gl::Error Renderer9::createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) -{ - ASSERT(source != nullptr); - - RenderTargetD3D *newRT = nullptr; - gl::Error error = createRenderTarget(source->getWidth(), source->getHeight(), - source->getInternalFormat(), source->getSamples(), &newRT); - if (error.isError()) - { - return error; - } - - RenderTarget9 *source9 = GetAs<RenderTarget9>(source); - RenderTarget9 *dest9 = GetAs<RenderTarget9>(newRT); - - HRESULT result = mDevice->StretchRect(source9->getSurface(), nullptr, dest9->getSurface(), - nullptr, D3DTEXF_NONE); - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() << "Failed to copy render target, " << gl::FmtHR(result); - } - - *outRT = newRT; - return gl::NoError(); -} - -gl::Error Renderer9::loadExecutable(const uint8_t *function, - size_t length, - gl::ShaderType type, - const std::vector<D3DVarying> &streamOutVaryings, - bool separatedOutputBuffers, - ShaderExecutableD3D **outExecutable) -{ - // Transform feedback is not supported in ES2 or D3D9 - ASSERT(streamOutVaryings.empty()); - - switch (type) - { - case gl::SHADER_VERTEX: - { - IDirect3DVertexShader9 *vshader = nullptr; - gl::Error error = createVertexShader((DWORD *)function, length, &vshader); - if (error.isError()) - { - return error; - } - *outExecutable = new ShaderExecutable9(function, length, vshader); - } - break; - case gl::SHADER_FRAGMENT: - { - IDirect3DPixelShader9 *pshader = nullptr; - gl::Error error = createPixelShader((DWORD *)function, length, &pshader); - if (error.isError()) - { - return error; - } - *outExecutable = new ShaderExecutable9(function, length, pshader); - } - break; - default: - UNREACHABLE(); - return gl::InternalError(); - } - - return gl::NoError(); -} - -gl::Error Renderer9::compileToExecutable(gl::InfoLog &infoLog, - const std::string &shaderHLSL, - gl::ShaderType type, - const std::vector<D3DVarying> &streamOutVaryings, - bool separatedOutputBuffers, - const angle::CompilerWorkaroundsD3D &workarounds, - ShaderExecutableD3D **outExectuable) -{ - // Transform feedback is not supported in ES2 or D3D9 - ASSERT(streamOutVaryings.empty()); - - std::stringstream profileStream; - - switch (type) - { - case gl::SHADER_VERTEX: - profileStream << "vs"; - break; - case gl::SHADER_FRAGMENT: - profileStream << "ps"; - break; - default: - UNREACHABLE(); - return gl::InternalError(); - } - - profileStream << "_" << ((getMajorShaderModel() >= 3) ? 3 : 2); - profileStream << "_" - << "0"; - - std::string profile = profileStream.str(); - - UINT flags = ANGLE_COMPILE_OPTIMIZATION_LEVEL; - - if (workarounds.skipOptimization) - { - flags = D3DCOMPILE_SKIP_OPTIMIZATION; - } - else if (workarounds.useMaxOptimization) - { - flags = D3DCOMPILE_OPTIMIZATION_LEVEL3; - } - - if (gl::DebugAnnotationsActive()) - { -#ifndef NDEBUG - flags = D3DCOMPILE_SKIP_OPTIMIZATION; -#endif - - flags |= D3DCOMPILE_DEBUG; - } - - // Sometimes D3DCompile will fail with the default compilation flags for complicated shaders - // when it would otherwise pass with alternative options. Try the default flags first and if - // compilation fails, try some alternatives. - std::vector<CompileConfig> configs; - configs.push_back(CompileConfig(flags, "default")); - configs.push_back(CompileConfig(flags | D3DCOMPILE_AVOID_FLOW_CONTROL, "avoid flow control")); - configs.push_back(CompileConfig(flags | D3DCOMPILE_PREFER_FLOW_CONTROL, "prefer flow control")); - - ID3DBlob *binary = nullptr; - std::string debugInfo; - gl::Error error = mCompiler.compileToBinary(infoLog, shaderHLSL, profile, configs, nullptr, - &binary, &debugInfo); - if (error.isError()) - { - return error; - } - - // It's possible that binary is NULL if the compiler failed in all configurations. Set the - // executable to NULL and return GL_NO_ERROR to signify that there was a link error but the - // internal state is still OK. - if (!binary) - { - *outExectuable = nullptr; - return gl::NoError(); - } - - error = loadExecutable(reinterpret_cast<const uint8_t *>(binary->GetBufferPointer()), - binary->GetBufferSize(), type, streamOutVaryings, separatedOutputBuffers, - outExectuable); - - SafeRelease(binary); - if (error.isError()) - { - return error; - } - - if (!debugInfo.empty()) - { - (*outExectuable)->appendDebugInfo(debugInfo); - } - - return gl::NoError(); -} - -gl::Error Renderer9::ensureHLSLCompilerInitialized() -{ - return mCompiler.ensureInitialized(); -} - -UniformStorageD3D *Renderer9::createUniformStorage(size_t storageSize) -{ - return new UniformStorageD3D(storageSize); -} - -gl::Error Renderer9::boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest) -{ - return mBlit->boxFilter(source, dest); -} - -D3DPOOL Renderer9::getTexturePool(DWORD usage) const -{ - if (mD3d9Ex != nullptr) - { - return D3DPOOL_DEFAULT; - } - else - { - if (!(usage & (D3DUSAGE_DEPTHSTENCIL | D3DUSAGE_RENDERTARGET))) - { - return D3DPOOL_MANAGED; - } - } - - return D3DPOOL_DEFAULT; -} - -gl::Error Renderer9::copyToRenderTarget(IDirect3DSurface9 *dest, - IDirect3DSurface9 *source, - bool fromManaged) -{ - ASSERT(source && dest); - - HRESULT result = D3DERR_OUTOFVIDEOMEMORY; - - if (fromManaged) - { - D3DSURFACE_DESC desc; - source->GetDesc(&desc); - - IDirect3DSurface9 *surf = 0; - result = mDevice->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, - D3DPOOL_SYSTEMMEM, &surf, nullptr); - - if (SUCCEEDED(result)) - { - ANGLE_TRY(Image9::copyLockableSurfaces(surf, source)); - result = mDevice->UpdateSurface(surf, nullptr, dest, nullptr); - SafeRelease(surf); - } - } - else - { - endScene(); - result = mDevice->StretchRect(source, nullptr, dest, nullptr, D3DTEXF_NONE); - } - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() << "Failed to blit internal texture, " << gl::FmtHR(result); - } - - return gl::NoError(); -} - -RendererClass Renderer9::getRendererClass() const -{ - return RENDERER_D3D9; -} - -ImageD3D *Renderer9::createImage() -{ - return new Image9(this); -} - -gl::Error Renderer9::generateMipmap(const gl::Context *context, ImageD3D *dest, ImageD3D *src) -{ - Image9 *src9 = GetAs<Image9>(src); - Image9 *dst9 = GetAs<Image9>(dest); - return Image9::generateMipmap(dst9, src9); -} - -gl::Error Renderer9::generateMipmapUsingD3D(const gl::Context *context, - TextureStorage *storage, - const gl::TextureState &textureState) -{ - UNREACHABLE(); - return gl::NoError(); -} - -gl::Error Renderer9::copyImage(const gl::Context *context, - ImageD3D *dest, - ImageD3D *source, - const gl::Rectangle &sourceRect, - const gl::Offset &destOffset, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) -{ - Image9 *dest9 = GetAs<Image9>(dest); - Image9 *src9 = GetAs<Image9>(source); - return Image9::CopyImage(context, dest9, src9, sourceRect, destOffset, unpackFlipY, - unpackPremultiplyAlpha, unpackUnmultiplyAlpha); -} - -TextureStorage *Renderer9::createTextureStorage2D(SwapChainD3D *swapChain) -{ - SwapChain9 *swapChain9 = GetAs<SwapChain9>(swapChain); - return new TextureStorage9_2D(this, swapChain9); -} - -TextureStorage *Renderer9::createTextureStorageEGLImage(EGLImageD3D *eglImage, - RenderTargetD3D *renderTargetD3D) -{ - return new TextureStorage9_EGLImage(this, eglImage, GetAs<RenderTarget9>(renderTargetD3D)); -} - -TextureStorage *Renderer9::createTextureStorageExternal( - egl::Stream *stream, - const egl::Stream::GLTextureDescription &desc) -{ - UNIMPLEMENTED(); - return nullptr; -} - -TextureStorage *Renderer9::createTextureStorage2D(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - int levels, - bool hintLevelZeroOnly) -{ - return new TextureStorage9_2D(this, internalformat, renderTarget, width, height, levels); -} - -TextureStorage *Renderer9::createTextureStorageCube(GLenum internalformat, - bool renderTarget, - int size, - int levels, - bool hintLevelZeroOnly) -{ - return new TextureStorage9_Cube(this, internalformat, renderTarget, size, levels, - hintLevelZeroOnly); -} - -TextureStorage *Renderer9::createTextureStorage3D(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - GLsizei depth, - int levels) -{ - // 3D textures are not supported by the D3D9 backend. - UNREACHABLE(); - - return nullptr; -} - -TextureStorage *Renderer9::createTextureStorage2DArray(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - GLsizei depth, - int levels) -{ - // 2D array textures are not supported by the D3D9 backend. - UNREACHABLE(); - - return nullptr; -} - -TextureStorage *Renderer9::createTextureStorage2DMultisample(GLenum internalformat, - GLsizei width, - GLsizei height, - int levels, - int samples, - bool fixedSampleLocations) -{ - // 2D multisampled textures are not supported by the D3D9 backend. - UNREACHABLE(); - - return NULL; -} - -bool Renderer9::getLUID(LUID *adapterLuid) const -{ - adapterLuid->HighPart = 0; - adapterLuid->LowPart = 0; - - if (mD3d9Ex) - { - mD3d9Ex->GetAdapterLUID(mAdapter, adapterLuid); - return true; - } - - return false; -} - -VertexConversionType Renderer9::getVertexConversionType(gl::VertexFormatType vertexFormatType) const -{ - return d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormatType).conversionType; -} - -GLenum Renderer9::getVertexComponentType(gl::VertexFormatType vertexFormatType) const -{ - return d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormatType).componentType; -} - -gl::ErrorOrResult<unsigned int> Renderer9::getVertexSpaceRequired(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLsizei count, - GLsizei instances) const -{ - if (!attrib.enabled) - { - return 16u; - } - - gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, GL_FLOAT); - const d3d9::VertexFormat &d3d9VertexInfo = - d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormatType); - - unsigned int elementCount = 0; - const unsigned int divisor = binding.getDivisor(); - if (instances == 0 || divisor == 0) - { - elementCount = static_cast<unsigned int>(count); - } - else - { - // Round up to divisor, if possible - elementCount = UnsignedCeilDivide(static_cast<unsigned int>(instances), divisor); - } - - if (d3d9VertexInfo.outputElementSize > std::numeric_limits<unsigned int>::max() / elementCount) - { - return gl::OutOfMemory() << "New vertex buffer size would result in an overflow."; - } - - return static_cast<unsigned int>(d3d9VertexInfo.outputElementSize) * elementCount; -} - -void Renderer9::generateCaps(gl::Caps *outCaps, - gl::TextureCapsMap *outTextureCaps, - gl::Extensions *outExtensions, - gl::Limitations *outLimitations) const -{ - d3d9_gl::GenerateCaps(mD3d9, mDevice, mDeviceType, mAdapter, outCaps, outTextureCaps, - outExtensions, outLimitations); -} - -angle::WorkaroundsD3D Renderer9::generateWorkarounds() const -{ - return d3d9::GenerateWorkarounds(); -} - -egl::Error Renderer9::getEGLDevice(DeviceImpl **device) -{ - if (mEGLDevice == nullptr) - { - ASSERT(mDevice != nullptr); - mEGLDevice = new DeviceD3D(); - egl::Error error = mEGLDevice->initialize(reinterpret_cast<void *>(mDevice), - EGL_D3D9_DEVICE_ANGLE, EGL_FALSE); - - if (error.isError()) - { - SafeDelete(mEGLDevice); - return error; - } - } - - *device = static_cast<DeviceImpl *>(mEGLDevice); - return egl::NoError(); -} - -Renderer9::CurSamplerState::CurSamplerState() - : forceSet(true), baseLevel(std::numeric_limits<size_t>::max()), samplerState() -{ -} - -gl::Error Renderer9::genericDrawElements(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices, - GLsizei instances) -{ - const auto &data = context->getContextState(); - gl::Program *program = context->getGLState().getProgram(); - ASSERT(program != nullptr); - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program); - bool usesPointSize = programD3D->usesPointSize(); - - programD3D->updateSamplerMapping(); - - if (!applyPrimitiveType(mode, count, usesPointSize)) - { - return gl::NoError(); - } - - ANGLE_TRY(updateState(context, mode)); - ANGLE_TRY(applyTextures(context)); - ANGLE_TRY(applyShaders(context, mode)); - - if (!skipDraw(data.getState(), mode)) - { - ANGLE_TRY(drawElementsImpl(context, mode, count, type, indices, instances)); - } - - return gl::NoError(); -} - -gl::Error Renderer9::genericDrawArrays(const gl::Context *context, - GLenum mode, - GLint first, - GLsizei count, - GLsizei instances) -{ - gl::Program *program = context->getGLState().getProgram(); - ASSERT(program != nullptr); - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program); - bool usesPointSize = programD3D->usesPointSize(); - - programD3D->updateSamplerMapping(); - - if (!applyPrimitiveType(mode, count, usesPointSize)) - { - return gl::NoError(); - } - - ANGLE_TRY(updateState(context, mode)); - ANGLE_TRY(applyVertexBuffer(context, mode, first, count, instances, nullptr)); - ANGLE_TRY(applyTextures(context)); - ANGLE_TRY(applyShaders(context, mode)); - - if (!skipDraw(context->getGLState(), mode)) - { - ANGLE_TRY(drawArraysImpl(context, mode, first, count, instances)); - } - - return gl::NoError(); -} - -FramebufferImpl *Renderer9::createDefaultFramebuffer(const gl::FramebufferState &state) -{ - return new Framebuffer9(state, this); -} - -gl::Version Renderer9::getMaxSupportedESVersion() const -{ - return gl::Version(2, 0); -} - -gl::Error Renderer9::clearRenderTarget(RenderTargetD3D *renderTarget, - const gl::ColorF &clearColorValue, - const float clearDepthValue, - const unsigned int clearStencilValue) -{ - D3DCOLOR color = - D3DCOLOR_ARGB(gl::unorm<8>(clearColorValue.alpha), gl::unorm<8>(clearColorValue.red), - gl::unorm<8>(clearColorValue.green), gl::unorm<8>(clearColorValue.blue)); - float depth = clearDepthValue; - DWORD stencil = clearStencilValue & 0x000000FF; - - unsigned int renderTargetSerial = renderTarget->getSerial(); - RenderTarget9 *renderTarget9 = GetAs<RenderTarget9>(renderTarget); - IDirect3DSurface9 *renderTargetSurface = renderTarget9->getSurface(); - ASSERT(renderTargetSurface); - - DWORD dxClearFlags = 0; - - const gl::InternalFormat &internalFormatInfo = - gl::GetSizedInternalFormatInfo(renderTarget->getInternalFormat()); - if (internalFormatInfo.depthBits > 0 || internalFormatInfo.stencilBits > 0) - { - dxClearFlags = D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL; - if (mAppliedDepthStencilSerial != renderTargetSerial) - { - mDevice->SetDepthStencilSurface(renderTargetSurface); - } - } - else - { - dxClearFlags = D3DCLEAR_TARGET; - if (mAppliedRenderTargetSerial != renderTargetSerial) - { - mDevice->SetRenderTarget(0, renderTargetSurface); - } - } - SafeRelease(renderTargetSurface); - - D3DVIEWPORT9 viewport; - viewport.X = 0; - viewport.Y = 0; - viewport.Width = renderTarget->getWidth(); - viewport.Height = renderTarget->getHeight(); - mDevice->SetViewport(&viewport); - - mDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); - - mDevice->Clear(0, nullptr, dxClearFlags, color, depth, stencil); - - markAllStateDirty(); - - return gl::NoError(); -} - -bool Renderer9::canSelectViewInVertexShader() const -{ - return false; -} - -// For each Direct3D sampler of either the pixel or vertex stage, -// looks up the corresponding OpenGL texture image unit and texture type, -// and sets the texture and its addressing/filtering state (or NULL when inactive). -// Sampler mapping needs to be up-to-date on the program object before this is called. -gl::Error Renderer9::applyTextures(const gl::Context *context, gl::SamplerType shaderType) -{ - const auto &glState = context->getGLState(); - const auto &caps = context->getCaps(); - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram()); - - ASSERT(!programD3D->isSamplerMappingDirty()); - - // TODO(jmadill): Use the Program's sampler bindings. - const auto &completeTextures = glState.getCompleteTextureCache(); - - unsigned int samplerRange = programD3D->getUsedSamplerRange(shaderType); - for (unsigned int samplerIndex = 0; samplerIndex < samplerRange; samplerIndex++) - { - GLint textureUnit = programD3D->getSamplerMapping(shaderType, samplerIndex, caps); - ASSERT(textureUnit != -1); - gl::Texture *texture = completeTextures[textureUnit]; - - // A nullptr texture indicates incomplete. - if (texture) - { - gl::Sampler *samplerObject = glState.getSampler(textureUnit); - - const gl::SamplerState &samplerState = - samplerObject ? samplerObject->getSamplerState() : texture->getSamplerState(); - - ANGLE_TRY(setSamplerState(context, shaderType, samplerIndex, texture, samplerState)); - ANGLE_TRY(setTexture(context, shaderType, samplerIndex, texture)); - } - else - { - GLenum textureType = programD3D->getSamplerTextureType(shaderType, samplerIndex); - - // Texture is not sampler complete or it is in use by the framebuffer. Bind the - // incomplete texture. - gl::Texture *incompleteTexture = nullptr; - ANGLE_TRY(getIncompleteTexture(context, textureType, &incompleteTexture)); - ANGLE_TRY(setSamplerState(context, shaderType, samplerIndex, incompleteTexture, - incompleteTexture->getSamplerState())); - ANGLE_TRY(setTexture(context, shaderType, samplerIndex, incompleteTexture)); - } - } - - // Set all the remaining textures to NULL - size_t samplerCount = (shaderType == gl::SAMPLER_PIXEL) ? caps.maxTextureImageUnits - : caps.maxVertexTextureImageUnits; - - // TODO(jmadill): faster way? - for (size_t samplerIndex = samplerRange; samplerIndex < samplerCount; samplerIndex++) - { - ANGLE_TRY(setTexture(context, shaderType, static_cast<int>(samplerIndex), nullptr)); - } - - return gl::NoError(); -} - -gl::Error Renderer9::applyTextures(const gl::Context *context) -{ - ANGLE_TRY(applyTextures(context, gl::SAMPLER_VERTEX)); - ANGLE_TRY(applyTextures(context, gl::SAMPLER_PIXEL)); - return gl::NoError(); -} - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h deleted file mode 100644 index 9ddee45f0f..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h +++ /dev/null @@ -1,543 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// Renderer9.h: Defines a back-end specific class for the D3D9 renderer. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_ - -#include "common/angleutils.h" -#include "common/mathutil.h" -#include "libANGLE/renderer/d3d/HLSLCompiler.h" -#include "libANGLE/renderer/d3d/RenderTargetD3D.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" -#include "libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h" -#include "libANGLE/renderer/d3d/d3d9/ShaderCache.h" -#include "libANGLE/renderer/d3d/d3d9/StateManager9.h" -#include "libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h" -#include "libANGLE/renderer/driver_utils.h" - -namespace gl -{ -class FramebufferAttachment; -} - -namespace egl -{ -class AttributeMap; -} - -namespace rx -{ -class Blit9; -class Context9; -class IndexDataManager; -class ProgramD3D; -class StreamingIndexBufferInterface; -class StaticIndexBufferInterface; -class VertexDataManager; -struct ClearParameters; -struct D3DUniform; -struct TranslatedAttribute; - -enum D3D9InitError -{ - D3D9_INIT_SUCCESS = 0, - // Failed to load the D3D or ANGLE compiler - D3D9_INIT_COMPILER_ERROR, - // Failed to load a necessary DLL - D3D9_INIT_MISSING_DEP, - // Device creation error - D3D9_INIT_CREATE_DEVICE_ERROR, - // System does not meet minimum shader spec - D3D9_INIT_UNSUPPORTED_VERSION, - // System does not support stretchrect from textures - D3D9_INIT_UNSUPPORTED_STRETCHRECT, - // A call returned out of memory or device lost - D3D9_INIT_OUT_OF_MEMORY, - // Other unspecified error - D3D9_INIT_OTHER_ERROR, - NUM_D3D9_INIT_ERRORS -}; - -class Renderer9 : public RendererD3D -{ - public: - explicit Renderer9(egl::Display *display); - ~Renderer9() override; - - egl::Error initialize() override; - bool resetDevice() override; - - egl::ConfigSet generateConfigs() override; - void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const override; - - void startScene(); - void endScene(); - - gl::Error flush(); - gl::Error finish(); - - bool isValidNativeWindow(EGLNativeWindowType window) const override; - NativeWindowD3D *createNativeWindow(EGLNativeWindowType window, - const egl::Config *config, - const egl::AttributeMap &attribs) const override; - - SwapChainD3D *createSwapChain(NativeWindowD3D *nativeWindow, - HANDLE shareHandle, - IUnknown *d3dTexture, - GLenum backBufferFormat, - GLenum depthBufferFormat, - EGLint orientation, - EGLint samples) override; - egl::Error getD3DTextureInfo(const egl::Config *configuration, - IUnknown *d3dTexture, - EGLint *width, - EGLint *height, - GLenum *fboFormat) const override; - egl::Error validateShareHandle(const egl::Config *config, - HANDLE shareHandle, - const egl::AttributeMap &attribs) const override; - - ContextImpl *createContext(const gl::ContextState &state) override; - - gl::Error allocateEventQuery(IDirect3DQuery9 **outQuery); - void freeEventQuery(IDirect3DQuery9 *query); - - // resource creation - gl::Error createVertexShader(const DWORD *function, - size_t length, - IDirect3DVertexShader9 **outShader); - gl::Error createPixelShader(const DWORD *function, - size_t length, - IDirect3DPixelShader9 **outShader); - HRESULT createVertexBuffer(UINT Length, DWORD Usage, IDirect3DVertexBuffer9 **ppVertexBuffer); - HRESULT createIndexBuffer(UINT Length, - DWORD Usage, - D3DFORMAT Format, - IDirect3DIndexBuffer9 **ppIndexBuffer); - gl::Error setSamplerState(const gl::Context *context, - gl::SamplerType type, - int index, - gl::Texture *texture, - const gl::SamplerState &sampler); - gl::Error setTexture(const gl::Context *context, - gl::SamplerType type, - int index, - gl::Texture *texture); - - gl::Error updateState(const gl::Context *context, GLenum drawMode); - - void setScissorRectangle(const gl::Rectangle &scissor, bool enabled); - void setViewport(const gl::Rectangle &viewport, - float zNear, - float zFar, - GLenum drawMode, - GLenum frontFace, - bool ignoreViewport); - - gl::Error applyRenderTarget(const gl::Context *context, const gl::Framebuffer *frameBuffer); - gl::Error applyRenderTarget(const gl::Context *context, - const gl::FramebufferAttachment *colorAttachment, - const gl::FramebufferAttachment *depthStencilAttachment); - gl::Error applyUniforms(ProgramD3D *programD3D); - bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount, bool usesPointSize); - gl::Error applyVertexBuffer(const gl::Context *context, - GLenum mode, - GLint first, - GLsizei count, - GLsizei instances, - TranslatedIndexData *indexInfo); - gl::Error applyIndexBuffer(const gl::Context *context, - const void *indices, - GLsizei count, - GLenum mode, - GLenum type, - TranslatedIndexData *indexInfo); - - gl::Error clear(const gl::Context *context, - const ClearParameters &clearParams, - const gl::FramebufferAttachment *colorBuffer, - const gl::FramebufferAttachment *depthStencilBuffer); - - void markAllStateDirty(); - - // lost device - bool testDeviceLost() override; - bool testDeviceResettable() override; - - VendorID getVendorId() const; - std::string getRendererDescription() const; - DeviceIdentifier getAdapterIdentifier() const override; - - IDirect3DDevice9 *getDevice() { return mDevice; } - void *getD3DDevice() override; - - unsigned int getReservedVertexUniformVectors() const; - unsigned int getReservedFragmentUniformVectors() const; - - bool getShareHandleSupport() const; - - int getMajorShaderModel() const override; - int getMinorShaderModel() const override; - std::string getShaderModelSuffix() const override; - - DWORD getCapsDeclTypes() const; - - // Pixel operations - gl::Error copyImage2D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) override; - gl::Error copyImageCube(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum target, - GLint level) override; - gl::Error copyImage3D(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) override; - gl::Error copyImage2DArray(const gl::Context *context, - const gl::Framebuffer *framebuffer, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLint level) override; - - gl::Error copyTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - const gl::Rectangle &sourceRect, - GLenum destFormat, - const gl::Offset &destOffset, - TextureStorage *storage, - GLenum destTarget, - GLint destLevel, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) override; - gl::Error copyCompressedTexture(const gl::Context *context, - const gl::Texture *source, - GLint sourceLevel, - TextureStorage *storage, - GLint destLevel) override; - - // RenderTarget creation - gl::Error createRenderTarget(int width, - int height, - GLenum format, - GLsizei samples, - RenderTargetD3D **outRT) override; - gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override; - - // Shader operations - gl::Error loadExecutable(const uint8_t *function, - size_t length, - gl::ShaderType type, - const std::vector<D3DVarying> &streamOutVaryings, - bool separatedOutputBuffers, - ShaderExecutableD3D **outExecutable) override; - gl::Error compileToExecutable(gl::InfoLog &infoLog, - const std::string &shaderHLSL, - gl::ShaderType type, - const std::vector<D3DVarying> &streamOutVaryings, - bool separatedOutputBuffers, - const angle::CompilerWorkaroundsD3D &workarounds, - ShaderExecutableD3D **outExectuable) override; - gl::Error ensureHLSLCompilerInitialized() override; - - UniformStorageD3D *createUniformStorage(size_t storageSize) override; - - // Image operations - ImageD3D *createImage() override; - gl::Error generateMipmap(const gl::Context *context, ImageD3D *dest, ImageD3D *source) override; - gl::Error generateMipmapUsingD3D(const gl::Context *context, - TextureStorage *storage, - const gl::TextureState &textureState) override; - gl::Error copyImage(const gl::Context *context, - ImageD3D *dest, - ImageD3D *source, - const gl::Rectangle &sourceRect, - const gl::Offset &destOffset, - bool unpackFlipY, - bool unpackPremultiplyAlpha, - bool unpackUnmultiplyAlpha) override; - TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain) override; - TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage, - RenderTargetD3D *renderTargetD3D) override; - TextureStorage *createTextureStorageExternal( - egl::Stream *stream, - const egl::Stream::GLTextureDescription &desc) override; - TextureStorage *createTextureStorage2D(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - int levels, - bool hintLevelZeroOnly) override; - TextureStorage *createTextureStorageCube(GLenum internalformat, - bool renderTarget, - int size, - int levels, - bool hintLevelZeroOnly) override; - TextureStorage *createTextureStorage3D(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - GLsizei depth, - int levels) override; - TextureStorage *createTextureStorage2DArray(GLenum internalformat, - bool renderTarget, - GLsizei width, - GLsizei height, - GLsizei depth, - int levels) override; - - TextureStorage *createTextureStorage2DMultisample(GLenum internalformat, - GLsizei width, - GLsizei height, - int levels, - int samples, - bool fixedSampleLocations) override; - - // Buffer creation - VertexBuffer *createVertexBuffer() override; - IndexBuffer *createIndexBuffer() override; - - // Stream Creation - StreamProducerImpl *createStreamProducerD3DTextureNV12( - egl::Stream::ConsumerType consumerType, - const egl::AttributeMap &attribs) override; - - // Buffer-to-texture and Texture-to-buffer copies - bool supportsFastCopyBufferToTexture(GLenum internalFormat) const override; - gl::Error fastCopyBufferToTexture(const gl::Context *context, - const gl::PixelUnpackState &unpack, - unsigned int offset, - RenderTargetD3D *destRenderTarget, - GLenum destinationFormat, - GLenum sourcePixelsType, - const gl::Box &destArea) override; - - // D3D9-renderer specific methods - gl::Error boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest); - - D3DPOOL getTexturePool(DWORD usage) const; - - bool getLUID(LUID *adapterLuid) const override; - VertexConversionType getVertexConversionType( - gl::VertexFormatType vertexFormatType) const override; - GLenum getVertexComponentType(gl::VertexFormatType vertexFormatType) const override; - - // Warning: you should ensure binding really matches attrib.bindingIndex before using this - // function. - gl::ErrorOrResult<unsigned int> getVertexSpaceRequired(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLsizei count, - GLsizei instances) const override; - - gl::Error copyToRenderTarget(IDirect3DSurface9 *dest, - IDirect3DSurface9 *source, - bool fromManaged); - - RendererClass getRendererClass() const override; - - D3DDEVTYPE getD3D9DeviceType() const { return mDeviceType; } - - egl::Error getEGLDevice(DeviceImpl **device) override; - - StateManager9 *getStateManager() { return &mStateManager; } - - gl::Error genericDrawArrays(const gl::Context *context, - GLenum mode, - GLint first, - GLsizei count, - GLsizei instances); - - gl::Error genericDrawElements(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices, - GLsizei instances); - - // Necessary hack for default framebuffers in D3D. - FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override; - - DebugAnnotator9 *getAnnotator() { return &mAnnotator; } - - gl::Version getMaxSupportedESVersion() const override; - - gl::Error clearRenderTarget(RenderTargetD3D *renderTarget, - const gl::ColorF &clearColorValue, - const float clearDepthValue, - const unsigned int clearStencilValue) override; - - bool canSelectViewInVertexShader() const override; - - private: - gl::Error drawArraysImpl(const gl::Context *context, - GLenum mode, - GLint startVertex, - GLsizei count, - GLsizei instances); - gl::Error drawElementsImpl(const gl::Context *context, - GLenum mode, - GLsizei count, - GLenum type, - const void *indices, - GLsizei instances); - - gl::Error applyShaders(const gl::Context *context, GLenum drawMode); - - gl::Error applyTextures(const gl::Context *context); - gl::Error applyTextures(const gl::Context *context, gl::SamplerType shaderType); - - void generateCaps(gl::Caps *outCaps, - gl::TextureCapsMap *outTextureCaps, - gl::Extensions *outExtensions, - gl::Limitations *outLimitations) const override; - - angle::WorkaroundsD3D generateWorkarounds() const override; - - gl::Error setBlendDepthRasterStates(const gl::Context *context, GLenum drawMode); - - void release(); - - void applyUniformnfv(const D3DUniform *targetUniform, const GLfloat *v); - void applyUniformniv(const D3DUniform *targetUniform, const GLint *v); - void applyUniformnbv(const D3DUniform *targetUniform, const GLint *v); - - gl::Error drawLineLoop(const gl::Context *context, - GLsizei count, - GLenum type, - const void *indices, - int minIndex, - gl::Buffer *elementArrayBuffer); - gl::Error drawIndexedPoints(const gl::Context *context, - GLsizei count, - GLenum type, - const void *indices, - int minIndex, - gl::Buffer *elementArrayBuffer); - - gl::Error getCountingIB(size_t count, StaticIndexBufferInterface **outIB); - - gl::Error getNullColorbuffer(const gl::Context *context, - const gl::FramebufferAttachment *depthbuffer, - const gl::FramebufferAttachment **outColorBuffer); - - D3DPOOL getBufferPool(DWORD usage) const; - - HMODULE mD3d9Module; - - egl::Error initializeDevice(); - D3DPRESENT_PARAMETERS getDefaultPresentParameters(); - void releaseDeviceResources(); - - HRESULT getDeviceStatusCode(); - bool isRemovedDeviceResettable() const; - bool resetRemovedDevice(); - - UINT mAdapter; - D3DDEVTYPE mDeviceType; - IDirect3D9 *mD3d9; // Always valid after successful initialization. - IDirect3D9Ex *mD3d9Ex; // Might be null if D3D9Ex is not supported. - IDirect3DDevice9 *mDevice; - IDirect3DDevice9Ex *mDeviceEx; // Might be null if D3D9Ex is not supported. - - HLSLCompiler mCompiler; - - Blit9 *mBlit; - - HWND mDeviceWindow; - - D3DCAPS9 mDeviceCaps; - D3DADAPTER_IDENTIFIER9 mAdapterIdentifier; - - D3DPRIMITIVETYPE mPrimitiveType; - int mPrimitiveCount; - GLsizei mRepeatDraw; - - bool mSceneStarted; - - bool mVertexTextureSupport; - - // current render target states - unsigned int mAppliedRenderTargetSerial; - unsigned int mAppliedDepthStencilSerial; - bool mDepthStencilInitialized; - bool mRenderTargetDescInitialized; - - IDirect3DStateBlock9 *mMaskedClearSavedState; - - StateManager9 mStateManager; - - // Currently applied sampler states - struct CurSamplerState - { - CurSamplerState(); - - bool forceSet; - size_t baseLevel; - gl::SamplerState samplerState; - }; - std::vector<CurSamplerState> mCurVertexSamplerStates; - std::vector<CurSamplerState> mCurPixelSamplerStates; - - // Currently applied textures - std::vector<uintptr_t> mCurVertexTextures; - std::vector<uintptr_t> mCurPixelTextures; - - unsigned int mAppliedIBSerial; - IDirect3DVertexShader9 *mAppliedVertexShader; - IDirect3DPixelShader9 *mAppliedPixelShader; - unsigned int mAppliedProgramSerial; - - // A pool of event queries that are currently unused. - std::vector<IDirect3DQuery9 *> mEventQueryPool; - VertexShaderCache mVertexShaderCache; - PixelShaderCache mPixelShaderCache; - - VertexDataManager *mVertexDataManager; - VertexDeclarationCache mVertexDeclarationCache; - - IndexDataManager *mIndexDataManager; - StreamingIndexBufferInterface *mLineLoopIB; - StaticIndexBufferInterface *mCountingIB; - - enum - { - NUM_NULL_COLORBUFFER_CACHE_ENTRIES = 12 - }; - struct NullColorbufferCacheEntry - { - UINT lruCount; - int width; - int height; - gl::FramebufferAttachment *buffer; - } mNullColorbufferCache[NUM_NULL_COLORBUFFER_CACHE_ENTRIES]; - UINT mMaxNullColorbufferLRU; - - DeviceD3D *mEGLDevice; - std::vector<TranslatedAttribute> mTranslatedAttribCache; - - DebugAnnotator9 mAnnotator; -}; - -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h deleted file mode 100644 index 399770dd8d..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h +++ /dev/null @@ -1,106 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// ShaderCache: Defines rx::ShaderCache, a cache of Direct3D shader objects -// keyed by their byte code. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_SHADERCACHE_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_SHADERCACHE_H_ - -#include "libANGLE/Error.h" - -#include "common/debug.h" - -#include <cstddef> -#include <unordered_map> -#include <string> - -namespace rx -{ -template <typename ShaderObject> -class ShaderCache : angle::NonCopyable -{ - public: - ShaderCache() : mDevice(nullptr) {} - - ~ShaderCache() - { - // Call clear while the device is still valid. - ASSERT(mMap.empty()); - } - - void initialize(IDirect3DDevice9* device) - { - mDevice = device; - } - - gl::Error create(const DWORD *function, size_t length, ShaderObject **outShaderObject) - { - std::string key(reinterpret_cast<const char*>(function), length); - typename Map::iterator it = mMap.find(key); - if (it != mMap.end()) - { - it->second->AddRef(); - *outShaderObject = it->second; - return gl::NoError(); - } - - ShaderObject *shader; - HRESULT result = createShader(function, &shader); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to create shader, " << gl::FmtHR(result); - } - - // Random eviction policy. - if (mMap.size() >= kMaxMapSize) - { - SafeRelease(mMap.begin()->second); - mMap.erase(mMap.begin()); - } - - shader->AddRef(); - mMap[key] = shader; - - *outShaderObject = shader; - return gl::NoError(); - } - - void clear() - { - for (typename Map::iterator it = mMap.begin(); it != mMap.end(); ++it) - { - SafeRelease(it->second); - } - - mMap.clear(); - } - - private: - const static size_t kMaxMapSize = 100; - - HRESULT createShader(const DWORD *function, IDirect3DVertexShader9 **shader) - { - return mDevice->CreateVertexShader(function, shader); - } - - HRESULT createShader(const DWORD *function, IDirect3DPixelShader9 **shader) - { - return mDevice->CreatePixelShader(function, shader); - } - - typedef std::unordered_map<std::string, ShaderObject*> Map; - Map mMap; - - IDirect3DDevice9 *mDevice; -}; - -typedef ShaderCache<IDirect3DVertexShader9> VertexShaderCache; -typedef ShaderCache<IDirect3DPixelShader9> PixelShaderCache; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_SHADERCACHE_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp deleted file mode 100644 index 362c6c60a3..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// -// Copyright (c) 2012-2013 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. -// - -// ShaderExecutable9.cpp: Implements a D3D9-specific class to contain shader -// executable implementation details. - -#include "libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h" - -#include "common/debug.h" - -namespace rx -{ - -ShaderExecutable9::ShaderExecutable9(const void *function, size_t length, IDirect3DPixelShader9 *executable) - : ShaderExecutableD3D(function, length) -{ - mPixelExecutable = executable; - mVertexExecutable = nullptr; -} - -ShaderExecutable9::ShaderExecutable9(const void *function, size_t length, IDirect3DVertexShader9 *executable) - : ShaderExecutableD3D(function, length) -{ - mVertexExecutable = executable; - mPixelExecutable = nullptr; -} - -ShaderExecutable9::~ShaderExecutable9() -{ - SafeRelease(mVertexExecutable); - SafeRelease(mPixelExecutable); -} - -IDirect3DVertexShader9 *ShaderExecutable9::getVertexShader() const -{ - return mVertexExecutable; -} - -IDirect3DPixelShader9 *ShaderExecutable9::getPixelShader() const -{ - return mPixelExecutable; -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h deleted file mode 100644 index 0b6b87947e..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// Copyright (c) 2012-2013 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. -// - -// ShaderExecutable9.h: Defines a D3D9-specific class to contain shader -// executable implementation details. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_SHADEREXECUTABLE9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_SHADEREXECUTABLE9_H_ - -#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h" - -namespace rx -{ - -class ShaderExecutable9 : public ShaderExecutableD3D -{ - public: - ShaderExecutable9(const void *function, size_t length, IDirect3DPixelShader9 *executable); - ShaderExecutable9(const void *function, size_t length, IDirect3DVertexShader9 *executable); - ~ShaderExecutable9() override; - - IDirect3DPixelShader9 *getPixelShader() const; - IDirect3DVertexShader9 *getVertexShader() const; - - private: - IDirect3DPixelShader9 *mPixelExecutable; - IDirect3DVertexShader9 *mVertexExecutable; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_SHADEREXECUTABLE9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp deleted file mode 100644 index a3bdc14efb..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp +++ /dev/null @@ -1,945 +0,0 @@ -// -// Copyright (c) 2015 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. -// - -// StateManager9.cpp: Defines a class for caching D3D9 state -#include "libANGLE/renderer/d3d/d3d9/StateManager9.h" - -#include "common/bitset_utils.h" -#include "common/utilities.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" -#include "libANGLE/renderer/d3d/d3d9/Framebuffer9.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" - -namespace rx -{ - -StateManager9::StateManager9(Renderer9 *renderer9) - : mUsingZeroColorMaskWorkaround(false), - mCurBlendState(), - mCurBlendColor(0, 0, 0, 0), - mCurSampleMask(0), - mCurRasterState(), - mCurDepthSize(0), - mCurDepthStencilState(), - mCurStencilRef(0), - mCurStencilBackRef(0), - mCurFrontFaceCCW(0), - mCurStencilSize(0), - mCurScissorRect(), - mCurScissorEnabled(false), - mCurViewport(), - mCurNear(0.0f), - mCurFar(0.0f), - mCurDepthFront(0.0f), - mCurIgnoreViewport(false), - mRenderer9(renderer9), - mDirtyBits() -{ - mBlendStateDirtyBits.set(DIRTY_BIT_BLEND_ENABLED); - mBlendStateDirtyBits.set(DIRTY_BIT_BLEND_COLOR); - mBlendStateDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS); - mBlendStateDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE); - mBlendStateDirtyBits.set(DIRTY_BIT_COLOR_MASK); - mBlendStateDirtyBits.set(DIRTY_BIT_DITHER); - mBlendStateDirtyBits.set(DIRTY_BIT_SAMPLE_MASK); - - mRasterizerStateDirtyBits.set(DIRTY_BIT_CULL_MODE); - mRasterizerStateDirtyBits.set(DIRTY_BIT_DEPTH_BIAS); - - mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_MASK); - mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_FUNC); - mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED); - mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT); - mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK); - mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT); - mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK); - mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT); - mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK); - - mScissorStateDirtyBits.set(DIRTY_BIT_SCISSOR_ENABLED); - mScissorStateDirtyBits.set(DIRTY_BIT_SCISSOR_RECT); -} - -StateManager9::~StateManager9() -{ -} - -void StateManager9::initialize() -{ - mUsingZeroColorMaskWorkaround = IsAMD(mRenderer9->getVendorId()); -} - -void StateManager9::forceSetBlendState() -{ - mDirtyBits |= mBlendStateDirtyBits; -} - -void StateManager9::forceSetRasterState() -{ - mDirtyBits |= mRasterizerStateDirtyBits; -} - -void StateManager9::forceSetDepthStencilState() -{ - mDirtyBits |= mDepthStencilStateDirtyBits; -} - -void StateManager9::forceSetScissorState() -{ - mDirtyBits |= mScissorStateDirtyBits; -} - -void StateManager9::forceSetViewportState() -{ - mForceSetViewport = true; -} - -void StateManager9::forceSetDXUniformsState() -{ - mDxUniformsDirty = true; -} - -void StateManager9::updateStencilSizeIfChanged(bool depthStencilInitialized, - unsigned int stencilSize) -{ - if (!depthStencilInitialized || stencilSize != mCurStencilSize) - { - mCurStencilSize = stencilSize; - forceSetDepthStencilState(); - } -} - -void StateManager9::syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits) -{ - if (!dirtyBits.any()) - { - return; - } - - for (auto dirtyBit : dirtyBits) - { - switch (dirtyBit) - { - case gl::State::DIRTY_BIT_BLEND_ENABLED: - if (state.getBlendState().blend != mCurBlendState.blend) - { - mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED); - // BlendColor and funcs and equations has to be set if blend is enabled - mDirtyBits.set(DIRTY_BIT_BLEND_COLOR); - mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS); - - // The color mask may have to be updated if the blend state changes - if (mUsingZeroColorMaskWorkaround) - { - mDirtyBits.set(DIRTY_BIT_COLOR_MASK); - } - } - break; - case gl::State::DIRTY_BIT_BLEND_FUNCS: - { - const gl::BlendState &blendState = state.getBlendState(); - if (blendState.sourceBlendRGB != mCurBlendState.sourceBlendRGB || - blendState.destBlendRGB != mCurBlendState.destBlendRGB || - blendState.sourceBlendAlpha != mCurBlendState.sourceBlendAlpha || - blendState.destBlendAlpha != mCurBlendState.destBlendAlpha) - { - mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS); - // BlendColor depends on the values of blend funcs - mDirtyBits.set(DIRTY_BIT_BLEND_COLOR); - - // The color mask may have to be updated if the blend funcs change - if (mUsingZeroColorMaskWorkaround) - { - mDirtyBits.set(DIRTY_BIT_COLOR_MASK); - } - } - break; - } - case gl::State::DIRTY_BIT_BLEND_EQUATIONS: - { - const gl::BlendState &blendState = state.getBlendState(); - if (blendState.blendEquationRGB != mCurBlendState.blendEquationRGB || - blendState.blendEquationAlpha != mCurBlendState.blendEquationAlpha) - { - mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS); - - // The color mask may have to be updated if the blend funcs change - if (mUsingZeroColorMaskWorkaround) - { - mDirtyBits.set(DIRTY_BIT_COLOR_MASK); - } - } - break; - } - case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED: - if (state.getBlendState().sampleAlphaToCoverage != - mCurBlendState.sampleAlphaToCoverage) - { - mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE); - } - break; - case gl::State::DIRTY_BIT_COLOR_MASK: - { - const gl::BlendState &blendState = state.getBlendState(); - if (blendState.colorMaskRed != mCurBlendState.colorMaskRed || - blendState.colorMaskGreen != mCurBlendState.colorMaskGreen || - blendState.colorMaskBlue != mCurBlendState.colorMaskBlue || - blendState.colorMaskAlpha != mCurBlendState.colorMaskAlpha) - { - mDirtyBits.set(DIRTY_BIT_COLOR_MASK); - - // The color mask can cause the blend state to get out of sync when using the - // zero color mask workaround - if (mUsingZeroColorMaskWorkaround) - { - mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED); - mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS); - } - } - break; - } - case gl::State::DIRTY_BIT_DITHER_ENABLED: - if (state.getBlendState().dither != mCurBlendState.dither) - { - mDirtyBits.set(DIRTY_BIT_DITHER); - } - break; - case gl::State::DIRTY_BIT_BLEND_COLOR: - if (state.getBlendColor() != mCurBlendColor) - { - mDirtyBits.set(DIRTY_BIT_BLEND_COLOR); - } - break; - case gl::State::DIRTY_BIT_CULL_FACE_ENABLED: - if (state.getRasterizerState().cullFace != mCurRasterState.cullFace) - { - mDirtyBits.set(DIRTY_BIT_CULL_MODE); - } - break; - case gl::State::DIRTY_BIT_CULL_FACE: - if (state.getRasterizerState().cullMode != mCurRasterState.cullMode) - { - mDirtyBits.set(DIRTY_BIT_CULL_MODE); - } - break; - case gl::State::DIRTY_BIT_FRONT_FACE: - if (state.getRasterizerState().frontFace != mCurRasterState.frontFace) - { - mDirtyBits.set(DIRTY_BIT_CULL_MODE); - - // Viewport state depends on rasterizer.frontface - mDirtyBits.set(DIRTY_BIT_VIEWPORT); - } - break; - case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED: - if (state.getRasterizerState().polygonOffsetFill != - mCurRasterState.polygonOffsetFill) - { - mDirtyBits.set(DIRTY_BIT_DEPTH_BIAS); - } - break; - case gl::State::DIRTY_BIT_POLYGON_OFFSET: - { - const gl::RasterizerState &rasterizerState = state.getRasterizerState(); - if (rasterizerState.polygonOffsetFactor != mCurRasterState.polygonOffsetFactor || - rasterizerState.polygonOffsetUnits != mCurRasterState.polygonOffsetUnits) - { - mDirtyBits.set(DIRTY_BIT_DEPTH_BIAS); - } - } - case gl::State::DIRTY_BIT_DEPTH_MASK: - if (state.getDepthStencilState().depthMask != mCurDepthStencilState.depthMask) - { - mDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_MASK); - } - break; - case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED: - if (state.getDepthStencilState().depthTest != mCurDepthStencilState.depthTest) - { - mDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_FUNC); - } - break; - case gl::State::DIRTY_BIT_DEPTH_FUNC: - if (state.getDepthStencilState().depthFunc != mCurDepthStencilState.depthFunc) - { - mDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_FUNC); - } - break; - case gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED: - if (state.getDepthStencilState().stencilTest != mCurDepthStencilState.stencilTest) - { - mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED); - // If we enable the stencil test, all of these must be set - mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK); - mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT); - mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT); - mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK); - mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT); - mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK); - } - break; - case gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT: - { - const gl::DepthStencilState &depthStencilState = state.getDepthStencilState(); - if (depthStencilState.stencilFunc != mCurDepthStencilState.stencilFunc || - depthStencilState.stencilMask != mCurDepthStencilState.stencilMask || - state.getStencilRef() != mCurStencilRef) - { - mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT); - } - break; - } - case gl::State::DIRTY_BIT_STENCIL_FUNCS_BACK: - { - const gl::DepthStencilState &depthStencilState = state.getDepthStencilState(); - if (depthStencilState.stencilBackFunc != mCurDepthStencilState.stencilBackFunc || - depthStencilState.stencilBackMask != mCurDepthStencilState.stencilBackMask || - state.getStencilBackRef() != mCurStencilBackRef) - { - mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK); - } - break; - } - case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT: - if (state.getDepthStencilState().stencilWritemask != - mCurDepthStencilState.stencilWritemask) - { - mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT); - } - break; - case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK: - if (state.getDepthStencilState().stencilBackWritemask != - mCurDepthStencilState.stencilBackWritemask) - { - mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK); - } - break; - case gl::State::DIRTY_BIT_STENCIL_OPS_FRONT: - { - const gl::DepthStencilState &depthStencilState = state.getDepthStencilState(); - if (depthStencilState.stencilFail != mCurDepthStencilState.stencilFail || - depthStencilState.stencilPassDepthFail != - mCurDepthStencilState.stencilPassDepthFail || - depthStencilState.stencilPassDepthPass != - mCurDepthStencilState.stencilPassDepthPass) - { - mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT); - } - break; - } - case gl::State::DIRTY_BIT_STENCIL_OPS_BACK: - { - const gl::DepthStencilState &depthStencilState = state.getDepthStencilState(); - if (depthStencilState.stencilBackFail != mCurDepthStencilState.stencilBackFail || - depthStencilState.stencilBackPassDepthFail != - mCurDepthStencilState.stencilBackPassDepthFail || - depthStencilState.stencilBackPassDepthPass != - mCurDepthStencilState.stencilBackPassDepthPass) - { - mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK); - } - break; - } - case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED: - if (state.isScissorTestEnabled() != mCurScissorEnabled) - { - mDirtyBits.set(DIRTY_BIT_SCISSOR_ENABLED); - // If scissor is enabled, we have to set the scissor rect - mDirtyBits.set(DIRTY_BIT_SCISSOR_RECT); - } - break; - case gl::State::DIRTY_BIT_SCISSOR: - if (state.getScissor() != mCurScissorRect) - { - mDirtyBits.set(DIRTY_BIT_SCISSOR_RECT); - } - break; - case gl::State::DIRTY_BIT_DEPTH_RANGE: - if (state.getNearPlane() != mCurNear || state.getFarPlane() != mCurFar) - { - mDirtyBits.set(DIRTY_BIT_VIEWPORT); - } - break; - case gl::State::DIRTY_BIT_VIEWPORT: - if (state.getViewport() != mCurViewport) - { - mDirtyBits.set(DIRTY_BIT_VIEWPORT); - } - break; - default: - break; - } - } -} - -gl::Error StateManager9::setBlendDepthRasterStates(const gl::State &glState, - unsigned int sampleMask) -{ - const gl::Framebuffer *framebuffer = glState.getDrawFramebuffer(); - - const gl::BlendState &blendState = glState.getBlendState(); - const gl::ColorF &blendColor = glState.getBlendColor(); - const gl::RasterizerState &rasterState = glState.getRasterizerState(); - - const auto &depthStencilState = glState.getDepthStencilState(); - bool frontFaceCCW = (glState.getRasterizerState().frontFace == GL_CCW); - unsigned int maxStencil = (1 << mCurStencilSize) - 1; - - // All the depth stencil states depends on the front face ccw variable - if (frontFaceCCW != mCurFrontFaceCCW) - { - forceSetDepthStencilState(); - mCurFrontFaceCCW = frontFaceCCW; - } - - for (auto dirtyBit : mDirtyBits) - { - switch (dirtyBit) - { - case DIRTY_BIT_BLEND_ENABLED: - setBlendEnabled(blendState.blend); - break; - case DIRTY_BIT_BLEND_COLOR: - setBlendColor(blendState, blendColor); - break; - case DIRTY_BIT_BLEND_FUNCS_EQUATIONS: - setBlendFuncsEquations(blendState); - break; - case DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE: - setSampleAlphaToCoverage(blendState.sampleAlphaToCoverage); - break; - case DIRTY_BIT_COLOR_MASK: - setColorMask(framebuffer, blendState.colorMaskRed, blendState.colorMaskBlue, - blendState.colorMaskGreen, blendState.colorMaskAlpha); - break; - case DIRTY_BIT_DITHER: - setDither(blendState.dither); - break; - case DIRTY_BIT_CULL_MODE: - setCullMode(rasterState.cullFace, rasterState.cullMode, rasterState.frontFace); - break; - case DIRTY_BIT_DEPTH_BIAS: - setDepthBias(rasterState.polygonOffsetFill, rasterState.polygonOffsetFactor, - rasterState.polygonOffsetUnits); - break; - case DIRTY_BIT_STENCIL_DEPTH_MASK: - setDepthMask(depthStencilState.depthMask); - break; - case DIRTY_BIT_STENCIL_DEPTH_FUNC: - setDepthFunc(depthStencilState.depthTest, depthStencilState.depthFunc); - break; - case DIRTY_BIT_STENCIL_TEST_ENABLED: - setStencilTestEnabled(depthStencilState.stencilTest); - break; - case DIRTY_BIT_STENCIL_FUNCS_FRONT: - setStencilFuncsFront(depthStencilState.stencilFunc, depthStencilState.stencilMask, - glState.getStencilRef(), frontFaceCCW, maxStencil); - break; - case DIRTY_BIT_STENCIL_FUNCS_BACK: - setStencilFuncsBack(depthStencilState.stencilBackFunc, - depthStencilState.stencilBackMask, glState.getStencilBackRef(), - frontFaceCCW, maxStencil); - break; - case DIRTY_BIT_STENCIL_WRITEMASK_FRONT: - setStencilWriteMask(depthStencilState.stencilWritemask, frontFaceCCW); - break; - case DIRTY_BIT_STENCIL_WRITEMASK_BACK: - setStencilBackWriteMask(depthStencilState.stencilBackWritemask, frontFaceCCW); - break; - case DIRTY_BIT_STENCIL_OPS_FRONT: - setStencilOpsFront(depthStencilState.stencilFail, - depthStencilState.stencilPassDepthFail, - depthStencilState.stencilPassDepthPass, frontFaceCCW); - break; - case DIRTY_BIT_STENCIL_OPS_BACK: - setStencilOpsBack(depthStencilState.stencilBackFail, - depthStencilState.stencilBackPassDepthFail, - depthStencilState.stencilBackPassDepthPass, frontFaceCCW); - break; - default: - break; - } - } - - if (sampleMask != mCurSampleMask) - { - setSampleMask(sampleMask); - } - - return gl::NoError(); -} - -void StateManager9::setViewportState(const gl::Rectangle &viewport, - float zNear, - float zFar, - GLenum drawMode, - GLenum frontFace, - bool ignoreViewport) -{ - if (!mDirtyBits.test(DIRTY_BIT_VIEWPORT) && mCurIgnoreViewport == ignoreViewport) - return; - - gl::Rectangle actualViewport = viewport; - float actualZNear = gl::clamp01(zNear); - float actualZFar = gl::clamp01(zFar); - - if (ignoreViewport) - { - actualViewport.x = 0; - actualViewport.y = 0; - actualViewport.width = static_cast<int>(mRenderTargetBounds.width); - actualViewport.height = static_cast<int>(mRenderTargetBounds.height); - actualZNear = 0.0f; - actualZFar = 1.0f; - } - - D3DVIEWPORT9 dxViewport; - dxViewport.X = gl::clamp(actualViewport.x, 0, static_cast<int>(mRenderTargetBounds.width)); - dxViewport.Y = gl::clamp(actualViewport.y, 0, static_cast<int>(mRenderTargetBounds.height)); - dxViewport.Width = - gl::clamp(actualViewport.width, 0, - static_cast<int>(mRenderTargetBounds.width) - static_cast<int>(dxViewport.X)); - dxViewport.Height = - gl::clamp(actualViewport.height, 0, - static_cast<int>(mRenderTargetBounds.height) - static_cast<int>(dxViewport.Y)); - dxViewport.MinZ = actualZNear; - dxViewport.MaxZ = actualZFar; - - float depthFront = !gl::IsTriangleMode(drawMode) ? 0.0f : (frontFace == GL_CCW ? 1.0f : -1.0f); - - mRenderer9->getDevice()->SetViewport(&dxViewport); - - mCurViewport = actualViewport; - mCurNear = actualZNear; - mCurFar = actualZFar; - mCurDepthFront = depthFront; - mCurIgnoreViewport = ignoreViewport; - - // Setting shader constants - dx_VertexConstants9 vc = {}; - dx_PixelConstants9 pc = {}; - - vc.viewAdjust[0] = - static_cast<float>((actualViewport.width - static_cast<int>(dxViewport.Width)) + - 2 * (actualViewport.x - static_cast<int>(dxViewport.X)) - 1) / - dxViewport.Width; - vc.viewAdjust[1] = - static_cast<float>((actualViewport.height - static_cast<int>(dxViewport.Height)) + - 2 * (actualViewport.y - static_cast<int>(dxViewport.Y)) - 1) / - dxViewport.Height; - vc.viewAdjust[2] = static_cast<float>(actualViewport.width) / dxViewport.Width; - vc.viewAdjust[3] = static_cast<float>(actualViewport.height) / dxViewport.Height; - - pc.viewCoords[0] = actualViewport.width * 0.5f; - pc.viewCoords[1] = actualViewport.height * 0.5f; - pc.viewCoords[2] = actualViewport.x + (actualViewport.width * 0.5f); - pc.viewCoords[3] = actualViewport.y + (actualViewport.height * 0.5f); - - pc.depthFront[0] = (actualZFar - actualZNear) * 0.5f; - pc.depthFront[1] = (actualZNear + actualZFar) * 0.5f; - pc.depthFront[2] = depthFront; - - vc.depthRange[0] = actualZNear; - vc.depthRange[1] = actualZFar; - vc.depthRange[2] = actualZFar - actualZNear; - - pc.depthRange[0] = actualZNear; - pc.depthRange[1] = actualZFar; - pc.depthRange[2] = actualZFar - actualZNear; - - if (memcmp(&vc, &mVertexConstants, sizeof(dx_VertexConstants9)) != 0) - { - mVertexConstants = vc; - mDxUniformsDirty = true; - } - - if (memcmp(&pc, &mPixelConstants, sizeof(dx_PixelConstants9)) != 0) - { - mPixelConstants = pc; - mDxUniformsDirty = true; - } - - mForceSetViewport = false; -} - -void StateManager9::setShaderConstants() -{ - if (!mDxUniformsDirty) - return; - - IDirect3DDevice9 *device = mRenderer9->getDevice(); - device->SetVertexShaderConstantF(0, reinterpret_cast<float *>(&mVertexConstants), - sizeof(dx_VertexConstants9) / sizeof(float[4])); - device->SetPixelShaderConstantF(0, reinterpret_cast<float *>(&mPixelConstants), - sizeof(dx_PixelConstants9) / sizeof(float[4])); - mDxUniformsDirty = false; -} - -// This is separate from the main state loop because other functions -// outside call only setScissorState to update scissor state -void StateManager9::setScissorState(const gl::Rectangle &scissor, bool enabled) -{ - if (mDirtyBits.test(DIRTY_BIT_SCISSOR_ENABLED)) - setScissorEnabled(enabled); - - if (mDirtyBits.test(DIRTY_BIT_SCISSOR_RECT)) - setScissorRect(scissor, enabled); -} - -void StateManager9::setRenderTargetBounds(size_t width, size_t height) -{ - mRenderTargetBounds.width = (int)width; - mRenderTargetBounds.height = (int)height; - forceSetViewportState(); -} - -void StateManager9::setScissorEnabled(bool scissorEnabled) -{ - mRenderer9->getDevice()->SetRenderState(D3DRS_SCISSORTESTENABLE, scissorEnabled ? TRUE : FALSE); - mCurScissorEnabled = scissorEnabled; -} - -void StateManager9::setScissorRect(const gl::Rectangle &scissor, bool enabled) -{ - if (!enabled) - return; - - RECT rect; - rect.left = gl::clamp(scissor.x, 0, static_cast<int>(mRenderTargetBounds.width)); - rect.top = gl::clamp(scissor.y, 0, static_cast<int>(mRenderTargetBounds.height)); - rect.right = - gl::clamp(scissor.x + scissor.width, 0, static_cast<int>(mRenderTargetBounds.width)); - rect.bottom = - gl::clamp(scissor.y + scissor.height, 0, static_cast<int>(mRenderTargetBounds.height)); - mRenderer9->getDevice()->SetScissorRect(&rect); -} - -void StateManager9::setDepthFunc(bool depthTest, GLenum depthFunc) -{ - if (depthTest) - { - IDirect3DDevice9 *device = mRenderer9->getDevice(); - device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - device->SetRenderState(D3DRS_ZFUNC, gl_d3d9::ConvertComparison(depthFunc)); - } - else - { - mRenderer9->getDevice()->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - } - - mCurDepthStencilState.depthTest = depthTest; - mCurDepthStencilState.depthFunc = depthFunc; -} - -void StateManager9::setStencilOpsFront(GLenum stencilFail, - GLenum stencilPassDepthFail, - GLenum stencilPassDepthPass, - bool frontFaceCCW) -{ - // TODO(dianx) It may be slightly more efficient todo these and other similar areas - // with separate dirty bits. - IDirect3DDevice9 *device = mRenderer9->getDevice(); - device->SetRenderState(frontFaceCCW ? D3DRS_STENCILFAIL : D3DRS_CCW_STENCILFAIL, - gl_d3d9::ConvertStencilOp(stencilFail)); - device->SetRenderState(frontFaceCCW ? D3DRS_STENCILZFAIL : D3DRS_CCW_STENCILZFAIL, - gl_d3d9::ConvertStencilOp(stencilPassDepthFail)); - device->SetRenderState(frontFaceCCW ? D3DRS_STENCILPASS : D3DRS_CCW_STENCILPASS, - gl_d3d9::ConvertStencilOp(stencilPassDepthPass)); - - mCurDepthStencilState.stencilFail = stencilFail; - mCurDepthStencilState.stencilPassDepthFail = stencilPassDepthFail; - mCurDepthStencilState.stencilPassDepthPass = stencilPassDepthPass; -} - -void StateManager9::setStencilOpsBack(GLenum stencilBackFail, - GLenum stencilBackPassDepthFail, - GLenum stencilBackPassDepthPass, - bool frontFaceCCW) -{ - IDirect3DDevice9 *device = mRenderer9->getDevice(); - device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILFAIL : D3DRS_CCW_STENCILFAIL, - gl_d3d9::ConvertStencilOp(stencilBackFail)); - device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILZFAIL : D3DRS_CCW_STENCILZFAIL, - gl_d3d9::ConvertStencilOp(stencilBackPassDepthFail)); - device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILPASS : D3DRS_CCW_STENCILPASS, - gl_d3d9::ConvertStencilOp(stencilBackPassDepthPass)); - - mCurDepthStencilState.stencilBackFail = stencilBackFail; - mCurDepthStencilState.stencilBackPassDepthFail = stencilBackPassDepthFail; - mCurDepthStencilState.stencilBackPassDepthPass = stencilBackPassDepthPass; -} - -void StateManager9::setStencilBackWriteMask(GLuint stencilBackWriteMask, bool frontFaceCCW) -{ - mRenderer9->getDevice()->SetRenderState( - !frontFaceCCW ? D3DRS_STENCILWRITEMASK : D3DRS_CCW_STENCILWRITEMASK, stencilBackWriteMask); - - mCurDepthStencilState.stencilBackWritemask = stencilBackWriteMask; -} - -void StateManager9::setStencilFuncsBack(GLenum stencilBackFunc, - GLuint stencilBackMask, - GLint stencilBackRef, - bool frontFaceCCW, - unsigned int maxStencil) -{ - IDirect3DDevice9 *device = mRenderer9->getDevice(); - device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILFUNC : D3DRS_CCW_STENCILFUNC, - gl_d3d9::ConvertComparison(stencilBackFunc)); - device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILREF : D3DRS_CCW_STENCILREF, - (stencilBackRef < (int)maxStencil) ? stencilBackRef : maxStencil); - device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILMASK : D3DRS_CCW_STENCILMASK, - stencilBackMask); - - mCurDepthStencilState.stencilBackFunc = stencilBackFunc; - mCurStencilBackRef = stencilBackRef; - mCurDepthStencilState.stencilBackMask = stencilBackMask; -} - -void StateManager9::setStencilWriteMask(GLuint stencilWriteMask, bool frontFaceCCW) -{ - mRenderer9->getDevice()->SetRenderState( - frontFaceCCW ? D3DRS_STENCILWRITEMASK : D3DRS_CCW_STENCILWRITEMASK, stencilWriteMask); - mCurDepthStencilState.stencilWritemask = stencilWriteMask; -} - -void StateManager9::setStencilFuncsFront(GLenum stencilFunc, - GLuint stencilMask, - GLint stencilRef, - bool frontFaceCCW, - unsigned int maxStencil) -{ - IDirect3DDevice9 *device = mRenderer9->getDevice(); - device->SetRenderState(frontFaceCCW ? D3DRS_STENCILFUNC : D3DRS_CCW_STENCILFUNC, - gl_d3d9::ConvertComparison(stencilFunc)); - device->SetRenderState(frontFaceCCW ? D3DRS_STENCILREF : D3DRS_CCW_STENCILREF, - (stencilRef < static_cast<int>(maxStencil)) ? stencilRef : maxStencil); - device->SetRenderState(frontFaceCCW ? D3DRS_STENCILMASK : D3DRS_CCW_STENCILMASK, stencilMask); - - mCurDepthStencilState.stencilFunc = stencilFunc; - mCurStencilRef = stencilRef; - mCurDepthStencilState.stencilMask = stencilMask; -} -void StateManager9::setStencilTestEnabled(bool stencilTestEnabled) -{ - if (stencilTestEnabled && mCurStencilSize > 0) - { - mRenderer9->getDevice()->SetRenderState(D3DRS_STENCILENABLE, TRUE); - mRenderer9->getDevice()->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, TRUE); - } - else - { - mRenderer9->getDevice()->SetRenderState(D3DRS_STENCILENABLE, FALSE); - } - - mCurDepthStencilState.stencilTest = stencilTestEnabled; -} - -void StateManager9::setDepthMask(bool depthMask) -{ - mRenderer9->getDevice()->SetRenderState(D3DRS_ZWRITEENABLE, depthMask ? TRUE : FALSE); - mCurDepthStencilState.depthMask = depthMask; -} - -// TODO(dianx) one bit for sampleAlphaToCoverage -void StateManager9::setSampleAlphaToCoverage(bool enabled) -{ - if (enabled) - { - UNREACHABLE(); - } -} - -void StateManager9::setBlendColor(const gl::BlendState &blendState, const gl::ColorF &blendColor) -{ - if (!blendState.blend) - return; - - if (blendState.sourceBlendRGB != GL_CONSTANT_ALPHA && - blendState.sourceBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA && - blendState.destBlendRGB != GL_CONSTANT_ALPHA && - blendState.destBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA) - { - mRenderer9->getDevice()->SetRenderState(D3DRS_BLENDFACTOR, - gl_d3d9::ConvertColor(blendColor)); - } - else - { - mRenderer9->getDevice()->SetRenderState( - D3DRS_BLENDFACTOR, - D3DCOLOR_RGBA(gl::unorm<8>(blendColor.alpha), gl::unorm<8>(blendColor.alpha), - gl::unorm<8>(blendColor.alpha), gl::unorm<8>(blendColor.alpha))); - } - mCurBlendColor = blendColor; -} - -void StateManager9::setBlendFuncsEquations(const gl::BlendState &blendState) -{ - if (!blendState.blend) - return; - - IDirect3DDevice9 *device = mRenderer9->getDevice(); - - device->SetRenderState(D3DRS_SRCBLEND, gl_d3d9::ConvertBlendFunc(blendState.sourceBlendRGB)); - device->SetRenderState(D3DRS_DESTBLEND, gl_d3d9::ConvertBlendFunc(blendState.destBlendRGB)); - device->SetRenderState(D3DRS_BLENDOP, gl_d3d9::ConvertBlendOp(blendState.blendEquationRGB)); - - if (blendState.sourceBlendRGB != blendState.sourceBlendAlpha || - blendState.destBlendRGB != blendState.destBlendAlpha || - blendState.blendEquationRGB != blendState.blendEquationAlpha) - { - device->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE); - - device->SetRenderState(D3DRS_SRCBLENDALPHA, - gl_d3d9::ConvertBlendFunc(blendState.sourceBlendAlpha)); - device->SetRenderState(D3DRS_DESTBLENDALPHA, - gl_d3d9::ConvertBlendFunc(blendState.destBlendAlpha)); - device->SetRenderState(D3DRS_BLENDOPALPHA, - gl_d3d9::ConvertBlendOp(blendState.blendEquationAlpha)); - } - else - { - device->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE); - } - - mCurBlendState.sourceBlendRGB = blendState.sourceBlendRGB; - mCurBlendState.destBlendRGB = blendState.destBlendRGB; - mCurBlendState.blendEquationRGB = blendState.blendEquationRGB; - mCurBlendState.blendEquationAlpha = blendState.blendEquationAlpha; -} - -void StateManager9::setBlendEnabled(bool enabled) -{ - mRenderer9->getDevice()->SetRenderState(D3DRS_ALPHABLENDENABLE, enabled ? TRUE : FALSE); - mCurBlendState.blend = enabled; -} - -void StateManager9::setDither(bool dither) -{ - mRenderer9->getDevice()->SetRenderState(D3DRS_DITHERENABLE, dither ? TRUE : FALSE); - mCurBlendState.dither = dither; -} - -// TODO(dianx) one bit for color mask -void StateManager9::setColorMask(const gl::Framebuffer *framebuffer, - bool red, - bool blue, - bool green, - bool alpha) -{ - // Set the color mask - - const auto *attachment = framebuffer->getFirstColorbuffer(); - const auto &format = attachment ? attachment->getFormat() : gl::Format::Invalid(); - - DWORD colorMask = gl_d3d9::ConvertColorMask( - format.info->redBits > 0 && red, format.info->greenBits > 0 && green, - format.info->blueBits > 0 && blue, format.info->alphaBits > 0 && alpha); - - // Apparently some ATI cards have a bug where a draw with a zero color write mask can cause - // later draws to have incorrect results. Instead, set a nonzero color write mask but modify the - // blend state so that no drawing is done. - // http://anglebug.com/169 - if (colorMask == 0 && mUsingZeroColorMaskWorkaround) - { - IDirect3DDevice9 *device = mRenderer9->getDevice(); - // Enable green channel, but set blending so nothing will be drawn. - device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_GREEN); - - device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - - device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); - device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); - device->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); - - mCurBlendState.colorMaskRed = false; - mCurBlendState.colorMaskGreen = true; - mCurBlendState.colorMaskBlue = false; - mCurBlendState.colorMaskAlpha = false; - - mCurBlendState.blend = true; - mCurBlendState.sourceBlendRGB = GL_ZERO; - mCurBlendState.sourceBlendAlpha = GL_ZERO; - mCurBlendState.destBlendRGB = GL_ONE; - mCurBlendState.destBlendAlpha = GL_ONE; - mCurBlendState.blendEquationRGB = GL_FUNC_ADD; - mCurBlendState.blendEquationAlpha = GL_FUNC_ADD; - } - else - { - mRenderer9->getDevice()->SetRenderState(D3DRS_COLORWRITEENABLE, colorMask); - - mCurBlendState.colorMaskRed = red; - mCurBlendState.colorMaskGreen = green; - mCurBlendState.colorMaskBlue = blue; - mCurBlendState.colorMaskAlpha = alpha; - } -} - -void StateManager9::setSampleMask(unsigned int sampleMask) -{ - IDirect3DDevice9 *device = mRenderer9->getDevice(); - // Set the multisample mask - device->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE); - device->SetRenderState(D3DRS_MULTISAMPLEMASK, static_cast<DWORD>(sampleMask)); - - mCurSampleMask = sampleMask; -} - -void StateManager9::setCullMode(bool cullFace, gl::CullFaceMode cullMode, GLenum frontFace) -{ - if (cullFace) - { - mRenderer9->getDevice()->SetRenderState(D3DRS_CULLMODE, - gl_d3d9::ConvertCullMode(cullMode, frontFace)); - } - else - { - mRenderer9->getDevice()->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - } - - mCurRasterState.cullFace = cullFace; - mCurRasterState.cullMode = cullMode; - mCurRasterState.frontFace = frontFace; -} - -void StateManager9::setDepthBias(bool polygonOffsetFill, - GLfloat polygonOffsetFactor, - GLfloat polygonOffsetUnits) -{ - if (polygonOffsetFill) - { - if (mCurDepthSize > 0) - { - IDirect3DDevice9 *device = mRenderer9->getDevice(); - device->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, *(DWORD *)&polygonOffsetFactor); - - float depthBias = ldexp(polygonOffsetUnits, -static_cast<int>(mCurDepthSize)); - device->SetRenderState(D3DRS_DEPTHBIAS, *(DWORD *)&depthBias); - } - } - else - { - IDirect3DDevice9 *device = mRenderer9->getDevice(); - device->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, 0); - device->SetRenderState(D3DRS_DEPTHBIAS, 0); - } - - mCurRasterState.polygonOffsetFill = polygonOffsetFill; - mCurRasterState.polygonOffsetFactor = polygonOffsetFactor; - mCurRasterState.polygonOffsetUnits = polygonOffsetUnits; -} - -void StateManager9::updateDepthSizeIfChanged(bool depthStencilInitialized, unsigned int depthSize) -{ - if (!depthStencilInitialized || depthSize != mCurDepthSize) - { - mCurDepthSize = depthSize; - forceSetRasterState(); - } -} -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h deleted file mode 100644 index 63ce17cb1e..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h +++ /dev/null @@ -1,209 +0,0 @@ -// -// Copyright (c) 2015 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. -// - -// StateManager9.h: Defines a class for caching D3D9 state - -#ifndef LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_ -#define LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_ - -#include "libANGLE/angletypes.h" -#include "libANGLE/ContextState.h" -#include "libANGLE/State.h" -#include "libANGLE/renderer/d3d/RendererD3D.h" - -namespace rx -{ - -class Renderer9; - -struct dx_VertexConstants9 -{ - float depthRange[4]; - float viewAdjust[4]; - float viewCoords[4]; -}; - -struct dx_PixelConstants9 -{ - float depthRange[4]; - float viewCoords[4]; - float depthFront[4]; -}; - -class StateManager9 final : angle::NonCopyable -{ - public: - StateManager9(Renderer9 *renderer9); - ~StateManager9(); - - void initialize(); - - void syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits); - - gl::Error setBlendDepthRasterStates(const gl::State &glState, unsigned int sampleMask); - void setScissorState(const gl::Rectangle &scissor, bool enabled); - void setViewportState(const gl::Rectangle &viewport, - float zNear, - float zFar, - GLenum drawMode, - GLenum frontFace, - bool ignoreViewport); - - void setShaderConstants(); - - void forceSetBlendState(); - void forceSetRasterState(); - void forceSetDepthStencilState(); - void forceSetScissorState(); - void forceSetViewportState(); - void forceSetDXUniformsState(); - - void updateDepthSizeIfChanged(bool depthStencilInitialized, unsigned int depthSize); - void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize); - - void setRenderTargetBounds(size_t width, size_t height); - - int getRenderTargetWidth() const { return mRenderTargetBounds.width; } - int getRenderTargetHeight() const { return mRenderTargetBounds.height; } - - void resetDirtyBits() { mDirtyBits.reset(); } - - private: - // Blend state functions - void setBlendEnabled(bool enabled); - void setBlendColor(const gl::BlendState &blendState, const gl::ColorF &blendColor); - void setBlendFuncsEquations(const gl::BlendState &blendState); - void setColorMask(const gl::Framebuffer *framebuffer, - bool red, - bool blue, - bool green, - bool alpha); - void setSampleAlphaToCoverage(bool enabled); - void setDither(bool dither); - void setSampleMask(unsigned int sampleMask); - - // Current raster state functions - void setCullMode(bool cullFace, gl::CullFaceMode cullMode, GLenum frontFace); - void setDepthBias(bool polygonOffsetFill, - GLfloat polygonOffsetFactor, - GLfloat polygonOffsetUnits); - - // Depth stencil state functions - void setStencilOpsFront(GLenum stencilFail, - GLenum stencilPassDepthFail, - GLenum stencilPassDepthPass, - bool frontFaceCCW); - void setStencilOpsBack(GLenum stencilBackFail, - GLenum stencilBackPassDepthFail, - GLenum stencilBackPassDepthPass, - bool frontFaceCCW); - void setStencilBackWriteMask(GLuint stencilBackWriteMask, bool frontFaceCCW); - void setDepthFunc(bool depthTest, GLenum depthFunc); - void setStencilTestEnabled(bool enabled); - void setDepthMask(bool depthMask); - void setStencilFuncsFront(GLenum stencilFunc, - GLuint stencilMask, - GLint stencilRef, - bool frontFaceCCW, - unsigned int maxStencil); - void setStencilFuncsBack(GLenum stencilBackFunc, - GLuint stencilBackMask, - GLint stencilBackRef, - bool frontFaceCCW, - unsigned int maxStencil); - void setStencilWriteMask(GLuint stencilWriteMask, bool frontFaceCCW); - - void setScissorEnabled(bool scissorEnabled); - void setScissorRect(const gl::Rectangle &scissor, bool enabled); - - enum DirtyBitType - { - // Blend dirty bits - DIRTY_BIT_BLEND_ENABLED, - DIRTY_BIT_BLEND_COLOR, - DIRTY_BIT_BLEND_FUNCS_EQUATIONS, - DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE, - DIRTY_BIT_COLOR_MASK, - DIRTY_BIT_DITHER, - DIRTY_BIT_SAMPLE_MASK, - - // Rasterizer dirty bits - DIRTY_BIT_CULL_MODE, - DIRTY_BIT_DEPTH_BIAS, - - // Depth stencil dirty bits - DIRTY_BIT_STENCIL_DEPTH_MASK, - DIRTY_BIT_STENCIL_DEPTH_FUNC, - DIRTY_BIT_STENCIL_TEST_ENABLED, - DIRTY_BIT_STENCIL_FUNCS_FRONT, - DIRTY_BIT_STENCIL_FUNCS_BACK, - DIRTY_BIT_STENCIL_WRITEMASK_FRONT, - DIRTY_BIT_STENCIL_WRITEMASK_BACK, - DIRTY_BIT_STENCIL_OPS_FRONT, - DIRTY_BIT_STENCIL_OPS_BACK, - - // Scissor dirty bits - DIRTY_BIT_SCISSOR_ENABLED, - DIRTY_BIT_SCISSOR_RECT, - - // Viewport dirty bits - DIRTY_BIT_VIEWPORT, - - DIRTY_BIT_MAX - }; - - using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>; - - bool mUsingZeroColorMaskWorkaround; - - // Currently applied blend state - gl::BlendState mCurBlendState; - gl::ColorF mCurBlendColor; - unsigned int mCurSampleMask; - DirtyBits mBlendStateDirtyBits; - - // Currently applied raster state - gl::RasterizerState mCurRasterState; - unsigned int mCurDepthSize; - DirtyBits mRasterizerStateDirtyBits; - - // Currently applied depth stencil state - gl::DepthStencilState mCurDepthStencilState; - int mCurStencilRef; - int mCurStencilBackRef; - bool mCurFrontFaceCCW; - unsigned int mCurStencilSize; - DirtyBits mDepthStencilStateDirtyBits; - - // Currently applied scissor states - gl::Rectangle mCurScissorRect; - bool mCurScissorEnabled; - gl::Extents mRenderTargetBounds; - DirtyBits mScissorStateDirtyBits; - - // Currently applied viewport states - bool mForceSetViewport; - gl::Rectangle mCurViewport; - float mCurNear; - float mCurFar; - float mCurDepthFront; - bool mCurIgnoreViewport; - - dx_VertexConstants9 mVertexConstants; - dx_PixelConstants9 mPixelConstants; - bool mDxUniformsDirty; - - // FIXME: Unsupported by D3D9 - static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILREF = D3DRS_STENCILREF; - static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILMASK = D3DRS_STENCILMASK; - static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILWRITEMASK = D3DRS_STENCILWRITEMASK; - - Renderer9 *mRenderer9; - DirtyBits mDirtyBits; -}; - -} // namespace rx -#endif // LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp deleted file mode 100644 index bc81aa18ec..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp +++ /dev/null @@ -1,467 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// SwapChain9.cpp: Implements a back-end specific class for the D3D9 swap chain. - -#include "libANGLE/renderer/d3d/d3d9/SwapChain9.h" - -#include "libANGLE/features.h" -#include "libANGLE/renderer/d3d/d3d9/formatutils9.h" -#include "libANGLE/renderer/d3d/d3d9/NativeWindow9.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" -#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" - -namespace rx -{ - -SwapChain9::SwapChain9(Renderer9 *renderer, - NativeWindow9 *nativeWindow, - HANDLE shareHandle, - IUnknown *d3dTexture, - GLenum backBufferFormat, - GLenum depthBufferFormat, - EGLint orientation) - : SwapChainD3D(shareHandle, d3dTexture, backBufferFormat, depthBufferFormat), - mRenderer(renderer), - mWidth(-1), - mHeight(-1), - mSwapInterval(-1), - mNativeWindow(nativeWindow), - mSwapChain(nullptr), - mBackBuffer(nullptr), - mRenderTarget(nullptr), - mDepthStencil(nullptr), - mOffscreenTexture(nullptr), - mColorRenderTarget(this, false), - mDepthStencilRenderTarget(this, true) -{ - ASSERT(orientation == 0); -} - -SwapChain9::~SwapChain9() -{ - release(); -} - -void SwapChain9::release() -{ - SafeRelease(mSwapChain); - SafeRelease(mBackBuffer); - SafeRelease(mDepthStencil); - SafeRelease(mRenderTarget); - SafeRelease(mOffscreenTexture); - - if (mNativeWindow->getNativeWindow()) - { - mShareHandle = nullptr; - } -} - -static DWORD convertInterval(EGLint interval) -{ -#if ANGLE_VSYNC == ANGLE_DISABLED - return D3DPRESENT_INTERVAL_IMMEDIATE; -#else - switch(interval) - { - case 0: return D3DPRESENT_INTERVAL_IMMEDIATE; - case 1: return D3DPRESENT_INTERVAL_ONE; - case 2: return D3DPRESENT_INTERVAL_TWO; - case 3: return D3DPRESENT_INTERVAL_THREE; - case 4: return D3DPRESENT_INTERVAL_FOUR; - default: UNREACHABLE(); - } - - return D3DPRESENT_INTERVAL_DEFAULT; -#endif -} - -EGLint SwapChain9::resize(const gl::Context *context, int backbufferWidth, int backbufferHeight) -{ - // D3D9 does not support resizing swap chains without recreating them - return reset(context, backbufferWidth, backbufferHeight, mSwapInterval); -} - -EGLint SwapChain9::reset(const gl::Context *context, - int backbufferWidth, - int backbufferHeight, - EGLint swapInterval) -{ - IDirect3DDevice9 *device = mRenderer->getDevice(); - - if (device == nullptr) - { - return EGL_BAD_ACCESS; - } - - // Evict all non-render target textures to system memory and release all resources - // before reallocating them to free up as much video memory as possible. - device->EvictManagedResources(); - - HRESULT result; - - // Release specific resources to free up memory for the new render target, while the - // old render target still exists for the purpose of preserving its contents. - SafeRelease(mSwapChain); - SafeRelease(mBackBuffer); - SafeRelease(mOffscreenTexture); - SafeRelease(mDepthStencil); - - const d3d9::TextureFormat &backBufferd3dFormatInfo = - d3d9::GetTextureFormatInfo(mOffscreenRenderTargetFormat); - if (mD3DTexture != nullptr) - { - result = mD3DTexture->QueryInterface(&mOffscreenTexture); - ASSERT(SUCCEEDED(result)); - } - else - { - HANDLE *pShareHandle = nullptr; - if (!mNativeWindow->getNativeWindow() && mRenderer->getShareHandleSupport()) - { - pShareHandle = &mShareHandle; - } - - result = device->CreateTexture(backbufferWidth, backbufferHeight, 1, D3DUSAGE_RENDERTARGET, - backBufferd3dFormatInfo.texFormat, D3DPOOL_DEFAULT, - &mOffscreenTexture, pShareHandle); - if (FAILED(result)) - { - ERR() << "Could not create offscreen texture, " << gl::FmtHR(result); - release(); - - if (d3d9::isDeviceLostError(result)) - { - return EGL_CONTEXT_LOST; - } - else - { - return EGL_BAD_ALLOC; - } - } - } - - IDirect3DSurface9 *oldRenderTarget = mRenderTarget; - - result = mOffscreenTexture->GetSurfaceLevel(0, &mRenderTarget); - ASSERT(SUCCEEDED(result)); - - if (oldRenderTarget) - { - RECT rect = - { - 0, 0, - mWidth, mHeight - }; - - if (rect.right > static_cast<LONG>(backbufferWidth)) - { - rect.right = backbufferWidth; - } - - if (rect.bottom > static_cast<LONG>(backbufferHeight)) - { - rect.bottom = backbufferHeight; - } - - mRenderer->endScene(); - - result = device->StretchRect(oldRenderTarget, &rect, mRenderTarget, &rect, D3DTEXF_NONE); - ASSERT(SUCCEEDED(result)); - - SafeRelease(oldRenderTarget); - } - - const d3d9::TextureFormat &depthBufferd3dFormatInfo = d3d9::GetTextureFormatInfo(mDepthBufferFormat); - - // Don't create a swapchain for NULLREF devices - D3DDEVTYPE deviceType = mRenderer->getD3D9DeviceType(); - EGLNativeWindowType window = mNativeWindow->getNativeWindow(); - if (window && deviceType != D3DDEVTYPE_NULLREF) - { - D3DPRESENT_PARAMETERS presentParameters = {0}; - presentParameters.AutoDepthStencilFormat = depthBufferd3dFormatInfo.renderFormat; - presentParameters.BackBufferCount = 1; - presentParameters.BackBufferFormat = backBufferd3dFormatInfo.renderFormat; - presentParameters.EnableAutoDepthStencil = FALSE; - presentParameters.Flags = 0; - presentParameters.hDeviceWindow = window; - presentParameters.MultiSampleQuality = 0; // FIXME: Unimplemented - presentParameters.MultiSampleType = D3DMULTISAMPLE_NONE; // FIXME: Unimplemented - presentParameters.PresentationInterval = convertInterval(swapInterval); - presentParameters.SwapEffect = D3DSWAPEFFECT_DISCARD; - presentParameters.Windowed = TRUE; - presentParameters.BackBufferWidth = backbufferWidth; - presentParameters.BackBufferHeight = backbufferHeight; - - // http://crbug.com/140239 - // http://crbug.com/143434 - // - // Some AMD/Intel switchable systems / drivers appear to round swap chain surfaces to a multiple of 64 pixels in width - // when using the integrated Intel. This rounds the width up rather than down. - // - // Some non-switchable AMD GPUs / drivers do not respect the source rectangle to Present. Therefore, when the vendor ID - // is not Intel, the back buffer width must be exactly the same width as the window or horizontal scaling will occur. - if (IsIntel(mRenderer->getVendorId())) - { - presentParameters.BackBufferWidth = (presentParameters.BackBufferWidth + 63) / 64 * 64; - } - - result = device->CreateAdditionalSwapChain(&presentParameters, &mSwapChain); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_INVALIDCALL || result == D3DERR_DEVICELOST); - - ERR() << "Could not create additional swap chains or offscreen surfaces, " - << gl::FmtHR(result); - release(); - - if (d3d9::isDeviceLostError(result)) - { - return EGL_CONTEXT_LOST; - } - else - { - return EGL_BAD_ALLOC; - } - } - - result = mSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &mBackBuffer); - ASSERT(SUCCEEDED(result)); - InvalidateRect(window, nullptr, FALSE); - } - - if (mDepthBufferFormat != GL_NONE) - { - result = device->CreateDepthStencilSurface( - backbufferWidth, backbufferHeight, depthBufferd3dFormatInfo.renderFormat, - D3DMULTISAMPLE_NONE, 0, FALSE, &mDepthStencil, nullptr); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_INVALIDCALL); - - ERR() << "Could not create depthstencil surface for new swap chain, " - << gl::FmtHR(result); - release(); - - if (d3d9::isDeviceLostError(result)) - { - return EGL_CONTEXT_LOST; - } - else - { - return EGL_BAD_ALLOC; - } - } - } - - mWidth = backbufferWidth; - mHeight = backbufferHeight; - mSwapInterval = swapInterval; - - return EGL_SUCCESS; -} - -// parameters should be validated/clamped by caller -EGLint SwapChain9::swapRect(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height) -{ - if (!mSwapChain) - { - return EGL_SUCCESS; - } - - IDirect3DDevice9 *device = mRenderer->getDevice(); - - // Disable all pipeline operations - device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - device->SetRenderState(D3DRS_STENCILENABLE, FALSE); - device->SetRenderState(D3DRS_CLIPPLANEENABLE, 0); - device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED); - device->SetRenderState(D3DRS_SRGBWRITEENABLE, FALSE); - device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); - device->SetPixelShader(nullptr); - device->SetVertexShader(nullptr); - - device->SetRenderTarget(0, mBackBuffer); - device->SetDepthStencilSurface(nullptr); - - device->SetTexture(0, mOffscreenTexture); - device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); - device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); - device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); - device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); - device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); - device->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1); - - for (UINT streamIndex = 0; streamIndex < gl::MAX_VERTEX_ATTRIBS; streamIndex++) - { - device->SetStreamSourceFreq(streamIndex, 1); - } - - D3DVIEWPORT9 viewport = {0, 0, static_cast<DWORD>(mWidth), static_cast<DWORD>(mHeight), 0.0f, 1.0f}; - device->SetViewport(&viewport); - - float x1 = x - 0.5f; - float y1 = (mHeight - y - height) - 0.5f; - float x2 = (x + width) - 0.5f; - float y2 = (mHeight - y) - 0.5f; - - float u1 = x / float(mWidth); - float v1 = y / float(mHeight); - float u2 = (x + width) / float(mWidth); - float v2 = (y + height) / float(mHeight); - - float quad[4][6] = {{x1, y1, 0.0f, 1.0f, u1, v2}, - {x2, y1, 0.0f, 1.0f, u2, v2}, - {x2, y2, 0.0f, 1.0f, u2, v1}, - {x1, y2, 0.0f, 1.0f, u1, v1}}; // x, y, z, rhw, u, v - - mRenderer->startScene(); - device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, quad, 6 * sizeof(float)); - mRenderer->endScene(); - - device->SetTexture(0, nullptr); - - RECT rect = - { - static_cast<LONG>(x), static_cast<LONG>(mHeight - y - height), - static_cast<LONG>(x + width), static_cast<LONG>(mHeight - y) - }; - - HRESULT result = mSwapChain->Present(&rect, &rect, nullptr, nullptr, 0); - - mRenderer->markAllStateDirty(); - - if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DRIVERINTERNALERROR) - { - return EGL_BAD_ALLOC; - } - - // On Windows 8 systems, IDirect3DSwapChain9::Present sometimes returns 0x88760873 when the windows is - // in the process of entering/exiting fullscreen. This code doesn't seem to have any documentation. The - // device appears to be ok after emitting this error so simply return a failure to swap. - if (result == static_cast<HRESULT>(0x88760873)) - { - return EGL_BAD_MATCH; - } - - // http://crbug.com/313210 - // If our swap failed, trigger a device lost event. Resetting will work around an AMD-specific - // device removed bug with lost contexts when reinstalling drivers. - if (FAILED(result)) - { - mRenderer->notifyDeviceLost(); - return EGL_CONTEXT_LOST; - } - - return EGL_SUCCESS; -} - -// Increments refcount on surface. -// caller must Release() the returned surface -// TODO: remove the AddRef to match SwapChain11 -IDirect3DSurface9 *SwapChain9::getRenderTarget() -{ - if (mRenderTarget) - { - mRenderTarget->AddRef(); - } - - return mRenderTarget; -} - -// Increments refcount on surface. -// caller must Release() the returned surface -// TODO: remove the AddRef to match SwapChain11 -IDirect3DSurface9 *SwapChain9::getDepthStencil() -{ - if (mDepthStencil) - { - mDepthStencil->AddRef(); - } - - return mDepthStencil; -} - -// Increments refcount on texture. -// caller must Release() the returned texture -// TODO: remove the AddRef to match SwapChain11 -IDirect3DTexture9 *SwapChain9::getOffscreenTexture() -{ - if (mOffscreenTexture) - { - mOffscreenTexture->AddRef(); - } - - return mOffscreenTexture; -} - -void *SwapChain9::getKeyedMutex() -{ - UNREACHABLE(); - return nullptr; -} - -egl::Error SwapChain9::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) -{ - UNREACHABLE(); - return egl::EglBadSurface(); -} - -void SwapChain9::recreate() -{ - if (!mSwapChain) - { - return; - } - - IDirect3DDevice9 *device = mRenderer->getDevice(); - if (device == nullptr) - { - return; - } - - D3DPRESENT_PARAMETERS presentParameters; - HRESULT result = mSwapChain->GetPresentParameters(&presentParameters); - ASSERT(SUCCEEDED(result)); - - IDirect3DSwapChain9 *newSwapChain = nullptr; - result = device->CreateAdditionalSwapChain(&presentParameters, &newSwapChain); - if (FAILED(result)) - { - return; - } - - SafeRelease(mSwapChain); - mSwapChain = newSwapChain; - - SafeRelease(mBackBuffer); - result = mSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &mBackBuffer); - ASSERT(SUCCEEDED(result)); -} - -RenderTargetD3D *SwapChain9::getColorRenderTarget() -{ - return &mColorRenderTarget; -} - -RenderTargetD3D *SwapChain9::getDepthStencilRenderTarget() -{ - return &mDepthStencilRenderTarget; -} -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h deleted file mode 100644 index 5753637c47..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h +++ /dev/null @@ -1,81 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// SwapChain9.h: Defines a back-end specific class for the D3D9 swap chain. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_SWAPCHAIN9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_SWAPCHAIN9_H_ - -#include "common/angleutils.h" -#include "libANGLE/renderer/d3d/SwapChainD3D.h" -#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h" - -namespace rx -{ -class NativeWindow9; -class Renderer9; - -class SwapChain9 : public SwapChainD3D -{ - public: - SwapChain9(Renderer9 *renderer, - NativeWindow9 *nativeWindow, - HANDLE shareHandle, - IUnknown *d3dTexture, - GLenum backBufferFormat, - GLenum depthBufferFormat, - EGLint orientation); - ~SwapChain9() override; - - EGLint resize(const gl::Context *context, EGLint backbufferWidth, EGLint backbufferHeight) - override; - EGLint reset(const gl::Context *context, - EGLint backbufferWidth, - EGLint backbufferHeight, - EGLint swapInterval) override; - EGLint swapRect(const gl::Context *context, - EGLint x, - EGLint y, - EGLint width, - EGLint height) override; - void recreate() override; - - RenderTargetD3D *getColorRenderTarget() override; - RenderTargetD3D *getDepthStencilRenderTarget() override; - - virtual IDirect3DSurface9 *getRenderTarget(); - virtual IDirect3DSurface9 *getDepthStencil(); - virtual IDirect3DTexture9 *getOffscreenTexture(); - - EGLint getWidth() const { return mWidth; } - EGLint getHeight() const { return mHeight; } - - void *getKeyedMutex() override; - - egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) override; - - private: - void release(); - - Renderer9 *mRenderer; - EGLint mWidth; - EGLint mHeight; - EGLint mSwapInterval; - - NativeWindow9 *mNativeWindow; - - IDirect3DSwapChain9 *mSwapChain; - IDirect3DSurface9 *mBackBuffer; - IDirect3DSurface9 *mRenderTarget; - IDirect3DSurface9 *mDepthStencil; - IDirect3DTexture9* mOffscreenTexture; - - SurfaceRenderTarget9 mColorRenderTarget; - SurfaceRenderTarget9 mDepthStencilRenderTarget; -}; - -} -#endif // LIBANGLE_RENDERER_D3D_D3D9_SWAPCHAIN9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp deleted file mode 100644 index 6404af6bba..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp +++ /dev/null @@ -1,647 +0,0 @@ -// -// Copyright (c) 2012-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. -// - -// TextureStorage9.cpp: Implements the abstract rx::TextureStorage9 class and its concrete derived -// classes TextureStorage9_2D and TextureStorage9_Cube, which act as the interface to the -// D3D9 texture. - -#include "libANGLE/renderer/d3d/d3d9/TextureStorage9.h" - -#include "libANGLE/formatutils.h" -#include "libANGLE/Texture.h" -#include "libANGLE/renderer/d3d/EGLImageD3D.h" -#include "libANGLE/renderer/d3d/TextureD3D.h" -#include "libANGLE/renderer/d3d/d3d9/formatutils9.h" -#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" -#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h" -#include "libANGLE/renderer/d3d/d3d9/SwapChain9.h" - -namespace rx -{ -TextureStorage9::TextureStorage9(Renderer9 *renderer, DWORD usage) - : mTopLevel(0), - mMipLevels(0), - mTextureWidth(0), - mTextureHeight(0), - mInternalFormat(GL_NONE), - mTextureFormat(D3DFMT_UNKNOWN), - mRenderer(renderer), - mD3DUsage(usage), - mD3DPool(mRenderer->getTexturePool(usage)) -{ -} - -TextureStorage9::~TextureStorage9() -{ -} - -DWORD TextureStorage9::GetTextureUsage(GLenum internalformat, bool renderTarget) -{ - DWORD d3dusage = 0; - - const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalformat); - const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(internalformat); - if (formatInfo.depthBits > 0 || formatInfo.stencilBits > 0) - { - d3dusage |= D3DUSAGE_DEPTHSTENCIL; - } - else if (renderTarget && (d3dFormatInfo.renderFormat != D3DFMT_UNKNOWN)) - { - d3dusage |= D3DUSAGE_RENDERTARGET; - } - - return d3dusage; -} - - -bool TextureStorage9::isRenderTarget() const -{ - return (mD3DUsage & (D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL)) != 0; -} - -bool TextureStorage9::isManaged() const -{ - return (mD3DPool == D3DPOOL_MANAGED); -} - -bool TextureStorage9::supportsNativeMipmapFunction() const -{ - return false; -} - -D3DPOOL TextureStorage9::getPool() const -{ - return mD3DPool; -} - -DWORD TextureStorage9::getUsage() const -{ - return mD3DUsage; -} - -int TextureStorage9::getTopLevel() const -{ - return mTopLevel; -} - -int TextureStorage9::getLevelCount() const -{ - return static_cast<int>(mMipLevels) - mTopLevel; -} - -gl::Error TextureStorage9::setData(const gl::Context *context, - const gl::ImageIndex &index, - ImageD3D *image, - const gl::Box *destBox, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixelData) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, SwapChain9 *swapchain) - : TextureStorage9(renderer, D3DUSAGE_RENDERTARGET) -{ - IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture(); - mTexture = surfaceTexture; - mMipLevels = surfaceTexture->GetLevelCount(); - - mInternalFormat = swapchain->getRenderTargetInternalFormat(); - - D3DSURFACE_DESC surfaceDesc; - surfaceTexture->GetLevelDesc(0, &surfaceDesc); - mTextureWidth = surfaceDesc.Width; - mTextureHeight = surfaceDesc.Height; - mTextureFormat = surfaceDesc.Format; - - mRenderTargets.resize(mMipLevels, nullptr); -} - -TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels) - : TextureStorage9(renderer, GetTextureUsage(internalformat, renderTarget)) -{ - mTexture = nullptr; - - mInternalFormat = internalformat; - - const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(internalformat); - mTextureFormat = d3dFormatInfo.texFormat; - - d3d9::MakeValidSize(false, d3dFormatInfo.texFormat, &width, &height, &mTopLevel); - mTextureWidth = width; - mTextureHeight = height; - mMipLevels = mTopLevel + levels; - - mRenderTargets.resize(levels, nullptr); -} - -TextureStorage9_2D::~TextureStorage9_2D() -{ - SafeRelease(mTexture); - for (RenderTargetD3D *renderTarget : mRenderTargets) - { - SafeDelete(renderTarget); - } -} - -// Increments refcount on surface. -// caller must Release() the returned surface -gl::Error TextureStorage9_2D::getSurfaceLevel(const gl::Context *context, - GLenum target, - int level, - bool dirty, - IDirect3DSurface9 **outSurface) -{ - ASSERT(target == GL_TEXTURE_2D); - - IDirect3DBaseTexture9 *baseTexture = nullptr; - gl::Error error = getBaseTexture(context, &baseTexture); - if (error.isError()) - { - return error; - } - - IDirect3DTexture9 *texture = static_cast<IDirect3DTexture9*>(baseTexture); - - HRESULT result = texture->GetSurfaceLevel(level + mTopLevel, outSurface); - - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to get the surface from a texture, " - << gl::FmtHR(result); - } - - // With managed textures the driver needs to be informed of updates to the lower mipmap levels - if (level + mTopLevel != 0 && isManaged() && dirty) - { - texture->AddDirtyRect(nullptr); - } - - return gl::NoError(); -} - -gl::Error TextureStorage9_2D::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - ASSERT(index.mipIndex < getLevelCount()); - - if (!mRenderTargets[index.mipIndex] && isRenderTarget()) - { - IDirect3DBaseTexture9 *baseTexture = nullptr; - gl::Error error = getBaseTexture(context, &baseTexture); - if (error.isError()) - { - return error; - } - - IDirect3DSurface9 *surface = nullptr; - error = getSurfaceLevel(context, GL_TEXTURE_2D, index.mipIndex, false, &surface); - if (error.isError()) - { - return error; - } - - size_t textureMipLevel = mTopLevel + index.mipIndex; - size_t mipWidth = std::max<size_t>(mTextureWidth >> textureMipLevel, 1u); - size_t mipHeight = std::max<size_t>(mTextureHeight >> textureMipLevel, 1u); - - baseTexture->AddRef(); - mRenderTargets[index.mipIndex] = new TextureRenderTarget9( - baseTexture, textureMipLevel, surface, mInternalFormat, static_cast<GLsizei>(mipWidth), - static_cast<GLsizei>(mipHeight), 1, 0); - } - - ASSERT(outRT); - *outRT = mRenderTargets[index.mipIndex]; - return gl::NoError(); -} - -gl::Error TextureStorage9_2D::generateMipmap(const gl::Context *context, - const gl::ImageIndex &sourceIndex, - const gl::ImageIndex &destIndex) -{ - IDirect3DSurface9 *upper = nullptr; - gl::Error error = getSurfaceLevel(context, GL_TEXTURE_2D, sourceIndex.mipIndex, false, &upper); - if (error.isError()) - { - return error; - } - - IDirect3DSurface9 *lower = nullptr; - error = getSurfaceLevel(context, GL_TEXTURE_2D, destIndex.mipIndex, true, &lower); - if (error.isError()) - { - SafeRelease(upper); - return error; - } - - ASSERT(upper && lower); - error = mRenderer->boxFilter(upper, lower); - - SafeRelease(upper); - SafeRelease(lower); - - return error; -} - -gl::Error TextureStorage9_2D::getBaseTexture(const gl::Context *context, - IDirect3DBaseTexture9 **outTexture) -{ - // if the width or height is not positive this should be treated as an incomplete texture - // we handle that here by skipping the d3d texture creation - if (mTexture == nullptr && mTextureWidth > 0 && mTextureHeight > 0) - { - ASSERT(mMipLevels > 0); - - IDirect3DDevice9 *device = mRenderer->getDevice(); - HRESULT result = device->CreateTexture(static_cast<unsigned int>(mTextureWidth), - static_cast<unsigned int>(mTextureHeight), - static_cast<unsigned int>(mMipLevels), getUsage(), - mTextureFormat, getPool(), &mTexture, nullptr); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() - << "Failed to create 2D storage texture, " << gl::FmtHR(result); - } - } - - *outTexture = mTexture; - return gl::NoError(); -} - -gl::Error TextureStorage9_2D::copyToStorage(const gl::Context *context, TextureStorage *destStorage) -{ - ASSERT(destStorage); - - TextureStorage9_2D *dest9 = GetAs<TextureStorage9_2D>(destStorage); - - int levels = getLevelCount(); - for (int i = 0; i < levels; ++i) - { - IDirect3DSurface9 *srcSurf = nullptr; - gl::Error error = getSurfaceLevel(context, GL_TEXTURE_2D, i, false, &srcSurf); - if (error.isError()) - { - return error; - } - - IDirect3DSurface9 *dstSurf = nullptr; - error = dest9->getSurfaceLevel(context, GL_TEXTURE_2D, i, true, &dstSurf); - if (error.isError()) - { - SafeRelease(srcSurf); - return error; - } - - error = mRenderer->copyToRenderTarget(dstSurf, srcSurf, isManaged()); - - SafeRelease(srcSurf); - SafeRelease(dstSurf); - - if (error.isError()) - { - return error; - } - } - - return gl::NoError(); -} - -TextureStorage9_EGLImage::TextureStorage9_EGLImage(Renderer9 *renderer, - EGLImageD3D *image, - RenderTarget9 *renderTarget9) - : TextureStorage9(renderer, D3DUSAGE_RENDERTARGET), mImage(image) -{ - mInternalFormat = renderTarget9->getInternalFormat(); - mTextureFormat = renderTarget9->getD3DFormat(); - mTextureWidth = renderTarget9->getWidth(); - mTextureHeight = renderTarget9->getHeight(); - mTopLevel = static_cast<int>(renderTarget9->getTextureLevel()); - mMipLevels = mTopLevel + 1; -} - -TextureStorage9_EGLImage::~TextureStorage9_EGLImage() -{ -} - -gl::Error TextureStorage9_EGLImage::getSurfaceLevel(const gl::Context *context, - GLenum target, - int level, - bool, - IDirect3DSurface9 **outSurface) -{ - ASSERT(target == GL_TEXTURE_2D); - ASSERT(level == 0); - - RenderTargetD3D *renderTargetD3D = nullptr; - gl::Error error = mImage->getRenderTarget(context, &renderTargetD3D); - if (error.isError()) - { - return error; - } - - RenderTarget9 *renderTarget9 = GetAs<RenderTarget9>(renderTargetD3D); - - *outSurface = renderTarget9->getSurface(); - return gl::NoError(); -} - -gl::Error TextureStorage9_EGLImage::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - ASSERT(!index.hasLayer()); - ASSERT(index.mipIndex == 0); - - return mImage->getRenderTarget(context, outRT); -} - -gl::Error TextureStorage9_EGLImage::getBaseTexture(const gl::Context *context, - IDirect3DBaseTexture9 **outTexture) -{ - RenderTargetD3D *renderTargetD3D = nullptr; - gl::Error error = mImage->getRenderTarget(context, &renderTargetD3D); - if (error.isError()) - { - return error; - } - - RenderTarget9 *renderTarget9 = GetAs<RenderTarget9>(renderTargetD3D); - *outTexture = renderTarget9->getTexture(); - ASSERT(*outTexture != nullptr); - - return gl::NoError(); -} - -gl::Error TextureStorage9_EGLImage::generateMipmap(const gl::Context *context, - const gl::ImageIndex &, - const gl::ImageIndex &) -{ - UNREACHABLE(); - return gl::InternalError(); -} - -gl::Error TextureStorage9_EGLImage::copyToStorage(const gl::Context *context, - TextureStorage *destStorage) -{ - ASSERT(destStorage); - ASSERT(getLevelCount() == 1); - - TextureStorage9 *dest9 = GetAs<TextureStorage9>(destStorage); - - IDirect3DBaseTexture9 *destBaseTexture9 = nullptr; - gl::Error error = dest9->getBaseTexture(context, &destBaseTexture9); - if (error.isError()) - { - return error; - } - - IDirect3DTexture9 *destTexture9 = static_cast<IDirect3DTexture9 *>(destBaseTexture9); - - IDirect3DSurface9 *destSurface = nullptr; - HRESULT result = destTexture9->GetSurfaceLevel(destStorage->getTopLevel(), &destSurface); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to get the surface from a texture, " - << gl::FmtHR(result); - } - - RenderTargetD3D *sourceRenderTarget = nullptr; - error = mImage->getRenderTarget(context, &sourceRenderTarget); - if (error.isError()) - { - SafeRelease(destSurface); - return error; - } - - RenderTarget9 *sourceRenderTarget9 = GetAs<RenderTarget9>(sourceRenderTarget); - error = - mRenderer->copyToRenderTarget(destSurface, sourceRenderTarget9->getSurface(), isManaged()); - if (error.isError()) - { - SafeRelease(destSurface); - return error; - } - - if (destStorage->getTopLevel() != 0) - { - destTexture9->AddDirtyRect(nullptr); - } - - SafeRelease(destSurface); - return gl::NoError(); -} - -TextureStorage9_Cube::TextureStorage9_Cube(Renderer9 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly) - : TextureStorage9(renderer, GetTextureUsage(internalformat, renderTarget)) -{ - mTexture = nullptr; - for (size_t i = 0; i < gl::CUBE_FACE_COUNT; ++i) - { - mRenderTarget[i] = nullptr; - } - - mInternalFormat = internalformat; - - const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(internalformat); - mTextureFormat = d3dFormatInfo.texFormat; - - int height = size; - d3d9::MakeValidSize(false, d3dFormatInfo.texFormat, &size, &height, &mTopLevel); - mTextureWidth = size; - mTextureHeight = size; - mMipLevels = mTopLevel + levels; -} - -TextureStorage9_Cube::~TextureStorage9_Cube() -{ - SafeRelease(mTexture); - - for (size_t i = 0; i < gl::CUBE_FACE_COUNT; ++i) - { - SafeDelete(mRenderTarget[i]); - } -} - -// Increments refcount on surface. -// caller must Release() the returned surface -gl::Error TextureStorage9_Cube::getSurfaceLevel(const gl::Context *context, - GLenum target, - int level, - bool dirty, - IDirect3DSurface9 **outSurface) -{ - IDirect3DBaseTexture9 *baseTexture = nullptr; - gl::Error error = getBaseTexture(context, &baseTexture); - if (error.isError()) - { - return error; - } - - IDirect3DCubeTexture9 *texture = static_cast<IDirect3DCubeTexture9*>(baseTexture); - - D3DCUBEMAP_FACES face = gl_d3d9::ConvertCubeFace(target); - HRESULT result = texture->GetCubeMapSurface(face, level, outSurface); - - ASSERT(SUCCEEDED(result)); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to get the surface from a texture, " - << gl::FmtHR(result); - } - - // With managed textures the driver needs to be informed of updates to the lower mipmap levels - if (level != 0 && isManaged() && dirty) - { - texture->AddDirtyRect(face, nullptr); - } - - return gl::NoError(); -} - -gl::Error TextureStorage9_Cube::getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) -{ - ASSERT(outRT); - ASSERT(index.mipIndex == 0); - ASSERT(index.layerIndex >= 0 && static_cast<size_t>(index.layerIndex) < gl::CUBE_FACE_COUNT); - - if (mRenderTarget[index.layerIndex] == nullptr && isRenderTarget()) - { - IDirect3DBaseTexture9 *baseTexture = nullptr; - gl::Error error = getBaseTexture(context, &baseTexture); - if (error.isError()) - { - return error; - } - - IDirect3DSurface9 *surface = nullptr; - error = getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + index.layerIndex, - mTopLevel + index.mipIndex, false, &surface); - if (error.isError()) - { - return error; - } - - baseTexture->AddRef(); - mRenderTarget[index.layerIndex] = new TextureRenderTarget9( - baseTexture, mTopLevel + index.mipIndex, surface, mInternalFormat, - static_cast<GLsizei>(mTextureWidth), static_cast<GLsizei>(mTextureHeight), 1, 0); - } - - *outRT = mRenderTarget[index.layerIndex]; - return gl::NoError(); -} - -gl::Error TextureStorage9_Cube::generateMipmap(const gl::Context *context, - const gl::ImageIndex &sourceIndex, - const gl::ImageIndex &destIndex) -{ - IDirect3DSurface9 *upper = nullptr; - gl::Error error = - getSurfaceLevel(context, sourceIndex.type, sourceIndex.mipIndex, false, &upper); - if (error.isError()) - { - return error; - } - - IDirect3DSurface9 *lower = nullptr; - error = getSurfaceLevel(context, destIndex.type, destIndex.mipIndex, true, &lower); - if (error.isError()) - { - SafeRelease(upper); - return error; - } - - ASSERT(upper && lower); - error = mRenderer->boxFilter(upper, lower); - - SafeRelease(upper); - SafeRelease(lower); - - return error; -} - -gl::Error TextureStorage9_Cube::getBaseTexture(const gl::Context *context, - IDirect3DBaseTexture9 **outTexture) -{ - // if the size is not positive this should be treated as an incomplete texture - // we handle that here by skipping the d3d texture creation - if (mTexture == nullptr && mTextureWidth > 0 && mTextureHeight > 0) - { - ASSERT(mMipLevels > 0); - ASSERT(mTextureWidth == mTextureHeight); - - IDirect3DDevice9 *device = mRenderer->getDevice(); - HRESULT result = device->CreateCubeTexture( - static_cast<unsigned int>(mTextureWidth), static_cast<unsigned int>(mMipLevels), - getUsage(), mTextureFormat, getPool(), &mTexture, nullptr); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); - return gl::OutOfMemory() - << "Failed to create cube storage texture, " << gl::FmtHR(result); - } - } - - *outTexture = mTexture; - return gl::NoError(); -} - -gl::Error TextureStorage9_Cube::copyToStorage(const gl::Context *context, - TextureStorage *destStorage) -{ - ASSERT(destStorage); - - TextureStorage9_Cube *dest9 = GetAs<TextureStorage9_Cube>(destStorage); - - int levels = getLevelCount(); - for (int f = 0; f < static_cast<int>(gl::CUBE_FACE_COUNT); f++) - { - for (int i = 0; i < levels; i++) - { - IDirect3DSurface9 *srcSurf = nullptr; - gl::Error error = - getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, false, &srcSurf); - if (error.isError()) - { - return error; - } - - IDirect3DSurface9 *dstSurf = nullptr; - error = dest9->getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, true, - &dstSurf); - if (error.isError()) - { - SafeRelease(srcSurf); - return error; - } - - error = mRenderer->copyToRenderTarget(dstSurf, srcSurf, isManaged()); - - SafeRelease(srcSurf); - SafeRelease(dstSurf); - - if (error.isError()) - { - return error; - } - } - } - - return gl::NoError(); -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h deleted file mode 100644 index 2f51901931..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h +++ /dev/null @@ -1,154 +0,0 @@ -// -// Copyright (c) 2012-2013 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. -// - -// TextureStorage9.h: Defines the abstract rx::TextureStorage9 class and its concrete derived -// classes TextureStorage9_2D and TextureStorage9_Cube, which act as the interface to the -// D3D9 texture. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_ - -#include "libANGLE/renderer/d3d/TextureStorage.h" -#include "common/debug.h" - -namespace rx -{ -class EGLImageD3D; -class Renderer9; -class SwapChain9; -class RenderTargetD3D; -class RenderTarget9; - -class TextureStorage9 : public TextureStorage -{ - public: - ~TextureStorage9() override; - - static DWORD GetTextureUsage(GLenum internalformat, bool renderTarget); - - D3DPOOL getPool() const; - DWORD getUsage() const; - - virtual gl::Error getSurfaceLevel(const gl::Context *context, - GLenum target, - int level, - bool dirty, - IDirect3DSurface9 **outSurface) = 0; - virtual gl::Error getBaseTexture(const gl::Context *context, - IDirect3DBaseTexture9 **outTexture) = 0; - - int getTopLevel() const override; - bool isRenderTarget() const override; - bool isManaged() const override; - bool supportsNativeMipmapFunction() const override; - int getLevelCount() const override; - - gl::Error setData(const gl::Context *context, - const gl::ImageIndex &index, - ImageD3D *image, - const gl::Box *destBox, - GLenum type, - const gl::PixelUnpackState &unpack, - const uint8_t *pixelData) override; - - protected: - int mTopLevel; - size_t mMipLevels; - size_t mTextureWidth; - size_t mTextureHeight; - GLenum mInternalFormat; - D3DFORMAT mTextureFormat; - - Renderer9 *mRenderer; - - TextureStorage9(Renderer9 *renderer, DWORD usage); - - private: - const DWORD mD3DUsage; - const D3DPOOL mD3DPool; -}; - -class TextureStorage9_2D : public TextureStorage9 -{ - public: - TextureStorage9_2D(Renderer9 *renderer, SwapChain9 *swapchain); - TextureStorage9_2D(Renderer9 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels); - ~TextureStorage9_2D() override; - - gl::Error getSurfaceLevel(const gl::Context *context, - GLenum target, - int level, - bool dirty, - IDirect3DSurface9 **outSurface) override; - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) override; - gl::Error getBaseTexture(const gl::Context *context, - IDirect3DBaseTexture9 **outTexture) override; - gl::Error generateMipmap(const gl::Context *context, - const gl::ImageIndex &sourceIndex, - const gl::ImageIndex &destIndex) override; - gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; - - private: - IDirect3DTexture9 *mTexture; - std::vector<RenderTarget9 *> mRenderTargets; -}; - -class TextureStorage9_EGLImage final : public TextureStorage9 -{ - public: - TextureStorage9_EGLImage(Renderer9 *renderer, EGLImageD3D *image, RenderTarget9 *renderTarget9); - ~TextureStorage9_EGLImage() override; - - gl::Error getSurfaceLevel(const gl::Context *context, - GLenum target, - int level, - bool dirty, - IDirect3DSurface9 **outSurface) override; - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) override; - gl::Error getBaseTexture(const gl::Context *context, - IDirect3DBaseTexture9 **outTexture) override; - gl::Error generateMipmap(const gl::Context *context, - const gl::ImageIndex &sourceIndex, - const gl::ImageIndex &destIndex) override; - gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; - - private: - EGLImageD3D *mImage; -}; - -class TextureStorage9_Cube : public TextureStorage9 -{ - public: - TextureStorage9_Cube(Renderer9 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly); - ~TextureStorage9_Cube() override; - - gl::Error getSurfaceLevel(const gl::Context *context, - GLenum target, - int level, - bool dirty, - IDirect3DSurface9 **outSurface) override; - gl::Error getRenderTarget(const gl::Context *context, - const gl::ImageIndex &index, - RenderTargetD3D **outRT) override; - gl::Error getBaseTexture(const gl::Context *context, - IDirect3DBaseTexture9 **outTexture) override; - gl::Error generateMipmap(const gl::Context *context, - const gl::ImageIndex &sourceIndex, - const gl::ImageIndex &destIndex) override; - gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; - - private: - IDirect3DCubeTexture9 *mTexture; - RenderTarget9 *mRenderTarget[gl::CUBE_FACE_COUNT]; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h deleted file mode 100644 index 0f4410b8de..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// 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. -// - -// VertexArray9.h: Defines the rx::VertexArray9 class which implements rx::VertexArrayImpl. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_VERTEXARRAY9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_VERTEXARRAY9_H_ - -#include "libANGLE/Context.h" -#include "libANGLE/renderer/VertexArrayImpl.h" -#include "libANGLE/renderer/d3d/d3d9/Context9.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" - -namespace rx -{ -class Renderer9; - -class VertexArray9 : public VertexArrayImpl -{ - public: - VertexArray9(const gl::VertexArrayState &data) : VertexArrayImpl(data) {} - - void syncState(const gl::Context *context, - const gl::VertexArray::DirtyBits &dirtyBits) override; - - ~VertexArray9() override {} - - Serial getCurrentStateSerial() const { return mCurrentStateSerial; } - - private: - Serial mCurrentStateSerial; -}; - -inline void VertexArray9::syncState(const gl::Context *context, - const gl::VertexArray::DirtyBits &dirtyBits) -{ - ASSERT(dirtyBits.any()); - Renderer9 *renderer = GetImplAs<Context9>(context)->getRenderer(); - mCurrentStateSerial = renderer->generateSerial(); -} -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_VERTEXARRAY9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp deleted file mode 100644 index c0b80a847c..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp +++ /dev/null @@ -1,169 +0,0 @@ -// -// Copyright (c) 2002-2012 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. -// - -// VertexBuffer9.cpp: Defines the D3D9 VertexBuffer implementation. - -#include "libANGLE/renderer/d3d/d3d9/VertexBuffer9.h" -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" -#include "libANGLE/renderer/d3d/d3d9/formatutils9.h" -#include "libANGLE/renderer/d3d/d3d9/vertexconversion.h" -#include "libANGLE/renderer/d3d/BufferD3D.h" -#include "libANGLE/VertexAttribute.h" -#include "libANGLE/Buffer.h" - -namespace rx -{ - -VertexBuffer9::VertexBuffer9(Renderer9 *renderer) : mRenderer(renderer) -{ - mVertexBuffer = nullptr; - mBufferSize = 0; - mDynamicUsage = false; -} - -VertexBuffer9::~VertexBuffer9() -{ - SafeRelease(mVertexBuffer); -} - -gl::Error VertexBuffer9::initialize(unsigned int size, bool dynamicUsage) -{ - SafeRelease(mVertexBuffer); - - updateSerial(); - - if (size > 0) - { - DWORD flags = D3DUSAGE_WRITEONLY; - if (dynamicUsage) - { - flags |= D3DUSAGE_DYNAMIC; - } - - HRESULT result = mRenderer->createVertexBuffer(size, flags, &mVertexBuffer); - - if (FAILED(result)) - { - return gl::OutOfMemory() - << "Failed to allocate internal vertex buffer of size " << size; - } - } - - mBufferSize = size; - mDynamicUsage = dynamicUsage; - return gl::NoError(); -} - -gl::Error VertexBuffer9::storeVertexAttributes(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLenum currentValueType, - GLint start, - GLsizei count, - GLsizei instances, - unsigned int offset, - const uint8_t *sourceData) -{ - if (!mVertexBuffer) - { - return gl::OutOfMemory() << "Internal vertex buffer is not initialized."; - } - - int inputStride = static_cast<int>(gl::ComputeVertexAttributeStride(attrib, binding)); - int elementSize = static_cast<int>(gl::ComputeVertexAttributeTypeSize(attrib)); - - DWORD lockFlags = mDynamicUsage ? D3DLOCK_NOOVERWRITE : 0; - - uint8_t *mapPtr = nullptr; - - auto errorOrMapSize = mRenderer->getVertexSpaceRequired(attrib, binding, count, instances); - if (errorOrMapSize.isError()) - { - return errorOrMapSize.getError(); - } - - unsigned int mapSize = errorOrMapSize.getResult(); - - HRESULT result = mVertexBuffer->Lock(offset, mapSize, reinterpret_cast<void**>(&mapPtr), lockFlags); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to lock internal vertex buffer, " << gl::FmtHR(result); - } - - const uint8_t *input = sourceData; - - if (instances == 0 || binding.getDivisor() == 0) - { - input += inputStride * start; - } - - gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, currentValueType); - const d3d9::VertexFormat &d3dVertexInfo = d3d9::GetVertexFormatInfo(mRenderer->getCapsDeclTypes(), vertexFormatType); - bool needsConversion = (d3dVertexInfo.conversionType & VERTEX_CONVERT_CPU) > 0; - - if (!needsConversion && inputStride == elementSize) - { - size_t copySize = static_cast<size_t>(count) * static_cast<size_t>(inputStride); - memcpy(mapPtr, input, copySize); - } - else - { - d3dVertexInfo.copyFunction(input, inputStride, count, mapPtr); - } - - mVertexBuffer->Unlock(); - - return gl::NoError(); -} - -unsigned int VertexBuffer9::getBufferSize() const -{ - return mBufferSize; -} - -gl::Error VertexBuffer9::setBufferSize(unsigned int size) -{ - if (size > mBufferSize) - { - return initialize(size, mDynamicUsage); - } - else - { - return gl::NoError(); - } -} - -gl::Error VertexBuffer9::discard() -{ - if (!mVertexBuffer) - { - return gl::OutOfMemory() << "Internal vertex buffer is not initialized."; - } - - void *dummy; - HRESULT result; - - result = mVertexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to lock internal buffer for discarding, " - << gl::FmtHR(result); - } - - result = mVertexBuffer->Unlock(); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to unlock internal buffer for discarding, " - << gl::FmtHR(result); - } - - return gl::NoError(); -} - -IDirect3DVertexBuffer9 * VertexBuffer9::getBuffer() const -{ - return mVertexBuffer; -} -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h deleted file mode 100644 index 983616f4e4..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// Copyright (c) 2002-2012 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. -// - -// VertexBuffer9.h: Defines the D3D9 VertexBuffer implementation. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_VERTEXBUFFER9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_VERTEXBUFFER9_H_ - -#include "libANGLE/renderer/d3d/VertexBuffer.h" - -namespace rx -{ -class Renderer9; - -class VertexBuffer9 : public VertexBuffer -{ - public: - explicit VertexBuffer9(Renderer9 *renderer); - - gl::Error initialize(unsigned int size, bool dynamicUsage) override; - - // Warning: you should ensure binding really matches attrib.bindingIndex before using this - // function. - gl::Error storeVertexAttributes(const gl::VertexAttribute &attrib, - const gl::VertexBinding &binding, - GLenum currentValueType, - GLint start, - GLsizei count, - GLsizei instances, - unsigned int offset, - const uint8_t *sourceData) override; - - unsigned int getBufferSize() const override; - gl::Error setBufferSize(unsigned int size) override; - gl::Error discard() override; - - IDirect3DVertexBuffer9 *getBuffer() const; - - private: - ~VertexBuffer9() override; - Renderer9 *mRenderer; - - IDirect3DVertexBuffer9 *mVertexBuffer; - unsigned int mBufferSize; - bool mDynamicUsage; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_VERTEXBUFFER9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp deleted file mode 100644 index abadf5c0b5..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp +++ /dev/null @@ -1,257 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// VertexDeclarationCache.cpp: Implements a helper class to construct and cache vertex declarations. - -#include "libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h" - -#include "libANGLE/VertexAttribute.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/d3d/ProgramD3D.h" -#include "libANGLE/renderer/d3d/d3d9/VertexBuffer9.h" -#include "libANGLE/renderer/d3d/d3d9/formatutils9.h" - -namespace rx -{ - -VertexDeclarationCache::VertexDeclarationCache() : mMaxLru(0) -{ - for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++) - { - mVertexDeclCache[i].vertexDeclaration = nullptr; - mVertexDeclCache[i].lruCount = 0; - } - - for (int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++) - { - mAppliedVBs[i].serial = 0; - } - - mLastSetVDecl = nullptr; - mInstancingEnabled = true; -} - -VertexDeclarationCache::~VertexDeclarationCache() -{ - for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++) - { - SafeRelease(mVertexDeclCache[i].vertexDeclaration); - } -} - -gl::Error VertexDeclarationCache::applyDeclaration( - IDirect3DDevice9 *device, - const std::vector<TranslatedAttribute> &attributes, - gl::Program *program, - GLint start, - GLsizei instances, - GLsizei *repeatDraw) -{ - ASSERT(gl::MAX_VERTEX_ATTRIBS >= attributes.size()); - - *repeatDraw = 1; - - const size_t invalidAttribIndex = attributes.size(); - size_t indexedAttribute = invalidAttribIndex; - size_t instancedAttribute = invalidAttribIndex; - - if (instances == 0) - { - for (size_t i = 0; i < attributes.size(); ++i) - { - if (attributes[i].divisor != 0) - { - // If a divisor is set, it still applies even if an instanced draw was not used, so treat - // as a single-instance draw. - instances = 1; - break; - } - } - } - - if (instances > 0) - { - // Find an indexed attribute to be mapped to D3D stream 0 - for (size_t i = 0; i < attributes.size(); i++) - { - if (attributes[i].active) - { - if (indexedAttribute == invalidAttribIndex && attributes[i].divisor == 0) - { - indexedAttribute = i; - } - else if (instancedAttribute == invalidAttribIndex && attributes[i].divisor != 0) - { - instancedAttribute = i; - } - if (indexedAttribute != invalidAttribIndex && instancedAttribute != invalidAttribIndex) - break; // Found both an indexed and instanced attribute - } - } - - // The validation layer checks that there is at least one active attribute with a zero divisor as per - // the GL_ANGLE_instanced_arrays spec. - ASSERT(indexedAttribute != invalidAttribIndex); - } - - D3DCAPS9 caps; - device->GetDeviceCaps(&caps); - - D3DVERTEXELEMENT9 elements[gl::MAX_VERTEX_ATTRIBS + 1]; - D3DVERTEXELEMENT9 *element = &elements[0]; - - ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program); - const auto &semanticIndexes = programD3D->getAttribLocationToD3DSemantics(); - - for (size_t i = 0; i < attributes.size(); i++) - { - if (attributes[i].active) - { - // Directly binding the storage buffer is not supported for d3d9 - ASSERT(attributes[i].storage == nullptr); - - int stream = static_cast<int>(i); - - if (instances > 0) - { - // Due to a bug on ATI cards we can't enable instancing when none of the attributes are instanced. - if (instancedAttribute == invalidAttribIndex) - { - *repeatDraw = instances; - } - else - { - if (i == indexedAttribute) - { - stream = 0; - } - else if (i == 0) - { - stream = static_cast<int>(indexedAttribute); - } - - UINT frequency = 1; - - if (attributes[i].divisor == 0) - { - frequency = D3DSTREAMSOURCE_INDEXEDDATA | instances; - } - else - { - frequency = D3DSTREAMSOURCE_INSTANCEDATA | attributes[i].divisor; - } - - device->SetStreamSourceFreq(stream, frequency); - mInstancingEnabled = true; - } - } - - VertexBuffer9 *vertexBuffer = GetAs<VertexBuffer9>(attributes[i].vertexBuffer.get()); - - unsigned int offset = 0; - ANGLE_TRY_RESULT(attributes[i].computeOffset(start), offset); - - if (mAppliedVBs[stream].serial != attributes[i].serial || - mAppliedVBs[stream].stride != attributes[i].stride || - mAppliedVBs[stream].offset != offset) - { - device->SetStreamSource(stream, vertexBuffer->getBuffer(), offset, - attributes[i].stride); - mAppliedVBs[stream].serial = attributes[i].serial; - mAppliedVBs[stream].stride = attributes[i].stride; - mAppliedVBs[stream].offset = offset; - } - - gl::VertexFormatType vertexformatType = - gl::GetVertexFormatType(*attributes[i].attribute, GL_FLOAT); - const d3d9::VertexFormat &d3d9VertexInfo = d3d9::GetVertexFormatInfo(caps.DeclTypes, vertexformatType); - - element->Stream = static_cast<WORD>(stream); - element->Offset = 0; - element->Type = static_cast<BYTE>(d3d9VertexInfo.nativeFormat); - element->Method = D3DDECLMETHOD_DEFAULT; - element->Usage = D3DDECLUSAGE_TEXCOORD; - element->UsageIndex = static_cast<BYTE>(semanticIndexes[i]); - element++; - } - } - - if (instances == 0 || instancedAttribute == invalidAttribIndex) - { - if (mInstancingEnabled) - { - for (int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++) - { - device->SetStreamSourceFreq(i, 1); - } - - mInstancingEnabled = false; - } - } - - static const D3DVERTEXELEMENT9 end = D3DDECL_END(); - *(element++) = end; - - for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++) - { - VertexDeclCacheEntry *entry = &mVertexDeclCache[i]; - if (memcmp(entry->cachedElements, elements, (element - elements) * sizeof(D3DVERTEXELEMENT9)) == 0 && entry->vertexDeclaration) - { - entry->lruCount = ++mMaxLru; - if(entry->vertexDeclaration != mLastSetVDecl) - { - device->SetVertexDeclaration(entry->vertexDeclaration); - mLastSetVDecl = entry->vertexDeclaration; - } - - return gl::NoError(); - } - } - - VertexDeclCacheEntry *lastCache = mVertexDeclCache; - - for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++) - { - if (mVertexDeclCache[i].lruCount < lastCache->lruCount) - { - lastCache = &mVertexDeclCache[i]; - } - } - - if (lastCache->vertexDeclaration != nullptr) - { - SafeRelease(lastCache->vertexDeclaration); - // mLastSetVDecl is set to the replacement, so we don't have to worry - // about it. - } - - memcpy(lastCache->cachedElements, elements, (element - elements) * sizeof(D3DVERTEXELEMENT9)); - HRESULT result = device->CreateVertexDeclaration(elements, &lastCache->vertexDeclaration); - if (FAILED(result)) - { - return gl::OutOfMemory() << "Failed to create internal vertex declaration, " - << gl::FmtHR(result); - } - - device->SetVertexDeclaration(lastCache->vertexDeclaration); - mLastSetVDecl = lastCache->vertexDeclaration; - lastCache->lruCount = ++mMaxLru; - - return gl::NoError(); -} - -void VertexDeclarationCache::markStateDirty() -{ - for (int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++) - { - mAppliedVBs[i].serial = 0; - } - - mLastSetVDecl = nullptr; - mInstancingEnabled = true; // Forces it to be disabled when not used -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h deleted file mode 100644 index 7bd7cabae4..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h +++ /dev/null @@ -1,65 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -// VertexDeclarationCache.h: Defines a helper class to construct and cache vertex declarations. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_VERTEXDECLARATIONCACHE_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_VERTEXDECLARATIONCACHE_H_ - -#include "libANGLE/Error.h" -#include "libANGLE/renderer/d3d/VertexDataManager.h" - -namespace gl -{ -class VertexDataManager; -class Program; -} - -namespace rx -{ - -class VertexDeclarationCache -{ - public: - VertexDeclarationCache(); - ~VertexDeclarationCache(); - - gl::Error applyDeclaration(IDirect3DDevice9 *device, - const std::vector<TranslatedAttribute> &attributes, - gl::Program *program, - GLint start, - GLsizei instances, - GLsizei *repeatDraw); - - void markStateDirty(); - - private: - UINT mMaxLru; - - enum { NUM_VERTEX_DECL_CACHE_ENTRIES = 32 }; - - struct VBData - { - unsigned int serial; - unsigned int stride; - unsigned int offset; - }; - - VBData mAppliedVBs[gl::MAX_VERTEX_ATTRIBS]; - IDirect3DVertexDeclaration9 *mLastSetVDecl; - bool mInstancingEnabled; - - struct VertexDeclCacheEntry - { - D3DVERTEXELEMENT9 cachedElements[gl::MAX_VERTEX_ATTRIBS + 1]; - UINT lruCount; - IDirect3DVertexDeclaration9 *vertexDeclaration; - } mVertexDeclCache[NUM_VERTEX_DECL_CACHE_ENTRIES]; -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_VERTEXDECLARATIONCACHE_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp deleted file mode 100644 index d10fa1ee87..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp +++ /dev/null @@ -1,652 +0,0 @@ -// -// Copyright (c) 2013-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. -// - -// formatutils9.cpp: Queries for GL image formats and their translations to D3D9 -// formats. - -#include "libANGLE/renderer/d3d/d3d9/formatutils9.h" - -#include "image_util/copyimage.h" -#include "image_util/generatemip.h" -#include "image_util/loadimage.h" - -#include "libANGLE/renderer/d3d/d3d9/Renderer9.h" -#include "libANGLE/renderer/d3d/d3d9/vertexconversion.h" - -using namespace angle; - -namespace rx -{ - -namespace d3d9 -{ - -constexpr D3DFORMAT D3DFMT_INTZ = ((D3DFORMAT)(MAKEFOURCC('I', 'N', 'T', 'Z'))); -constexpr D3DFORMAT D3DFMT_NULL = ((D3DFORMAT)(MAKEFOURCC('N', 'U', 'L', 'L'))); - -// A map to determine the pixel size and mip generation function of a given D3D format -typedef std::map<D3DFORMAT, D3DFormat> D3D9FormatInfoMap; - -D3DFormat::D3DFormat() - : pixelBytes(0), - blockWidth(0), - blockHeight(0), - redBits(0), - greenBits(0), - blueBits(0), - alphaBits(0), - luminanceBits(0), - depthBits(0), - stencilBits(0), - formatID(angle::Format::ID::NONE) -{ -} - -D3DFormat::D3DFormat(GLuint bits, - GLuint blockWidth, - GLuint blockHeight, - GLuint redBits, - GLuint greenBits, - GLuint blueBits, - GLuint alphaBits, - GLuint lumBits, - GLuint depthBits, - GLuint stencilBits, - Format::ID formatID) - : pixelBytes(bits / 8), - blockWidth(blockWidth), - blockHeight(blockHeight), - redBits(redBits), - greenBits(greenBits), - blueBits(blueBits), - alphaBits(alphaBits), - luminanceBits(lumBits), - depthBits(depthBits), - stencilBits(stencilBits), - formatID(formatID) -{ -} - -const D3DFormat &GetD3DFormatInfo(D3DFORMAT format) -{ - if (format == D3DFMT_NULL) - { - static const D3DFormat info(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Format::ID::NONE); - return info; - } - - if (format == D3DFMT_INTZ) - { - static const D3DFormat info(32, 1, 1, 0, 0, 0, 0, 0, 24, 8, Format::ID::D24_UNORM_S8_UINT); - return info; - } - - switch (format) - { - case D3DFMT_UNKNOWN: - { - static const D3DFormat info(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Format::ID::NONE); - return info; - } - - case D3DFMT_L8: - { - static const D3DFormat info(8, 1, 1, 0, 0, 0, 0, 8, 0, 0, Format::ID::L8_UNORM); - return info; - } - case D3DFMT_A8: - { - static const D3DFormat info(8, 1, 1, 0, 0, 0, 8, 0, 0, 0, Format::ID::A8_UNORM); - return info; - } - case D3DFMT_A8L8: - { - static const D3DFormat info(16, 1, 1, 0, 0, 0, 8, 8, 0, 0, Format::ID::L8A8_UNORM); - return info; - } - - case D3DFMT_A4R4G4B4: - { - static const D3DFormat info(16, 1, 1, 4, 4, 4, 4, 0, 0, 0, Format::ID::B4G4R4A4_UNORM); - return info; - } - case D3DFMT_A1R5G5B5: - { - static const D3DFormat info(16, 1, 1, 5, 5, 5, 1, 0, 0, 0, Format::ID::B5G5R5A1_UNORM); - return info; - } - case D3DFMT_R5G6B5: - { - static const D3DFormat info(16, 1, 1, 5, 6, 5, 0, 0, 0, 0, Format::ID::R5G6B5_UNORM); - return info; - } - case D3DFMT_X8R8G8B8: - { - static const D3DFormat info(32, 1, 1, 8, 8, 8, 0, 0, 0, 0, Format::ID::B8G8R8X8_UNORM); - return info; - } - case D3DFMT_A8R8G8B8: - { - static const D3DFormat info(32, 1, 1, 8, 8, 8, 8, 0, 0, 0, Format::ID::B8G8R8A8_UNORM); - return info; - } - - case D3DFMT_R16F: - { - static const D3DFormat info(16, 1, 1, 16, 0, 0, 0, 0, 0, 0, Format::ID::R16_FLOAT); - return info; - } - case D3DFMT_G16R16F: - { - static const D3DFormat info(32, 1, 1, 16, 16, 0, 0, 0, 0, 0, Format::ID::R16G16_FLOAT); - return info; - } - case D3DFMT_A16B16G16R16F: - { - static const D3DFormat info(64, 1, 1, 16, 16, 16, 16, 0, 0, 0, - Format::ID::R16G16B16A16_FLOAT); - return info; - } - case D3DFMT_R32F: - { - static const D3DFormat info(32, 1, 1, 32, 0, 0, 0, 0, 0, 0, Format::ID::R32_FLOAT); - return info; - } - case D3DFMT_G32R32F: - { - static const D3DFormat info(64, 1, 1, 32, 32, 0, 0, 0, 0, 0, Format::ID::R32G32_FLOAT); - return info; - } - case D3DFMT_A32B32G32R32F: - { - static const D3DFormat info(128, 1, 1, 32, 32, 32, 32, 0, 0, 0, - Format::ID::R32G32B32A32_FLOAT); - return info; - } - - case D3DFMT_D16: - { - static const D3DFormat info(16, 1, 1, 0, 0, 0, 0, 0, 16, 0, Format::ID::D16_UNORM); - return info; - } - case D3DFMT_D24S8: - { - static const D3DFormat info(32, 1, 1, 0, 0, 0, 0, 0, 24, 8, - Format::ID::D24_UNORM_S8_UINT); - return info; - } - case D3DFMT_D24X8: - { - static const D3DFormat info(32, 1, 1, 0, 0, 0, 0, 0, 24, 0, Format::ID::D16_UNORM); - return info; - } - case D3DFMT_D32: - { - static const D3DFormat info(32, 1, 1, 0, 0, 0, 0, 0, 32, 0, Format::ID::D32_UNORM); - return info; - } - - case D3DFMT_DXT1: - { - static const D3DFormat info(64, 4, 4, 0, 0, 0, 0, 0, 0, 0, - Format::ID::BC1_RGBA_UNORM_BLOCK); - return info; - } - case D3DFMT_DXT3: - { - static const D3DFormat info(128, 4, 4, 0, 0, 0, 0, 0, 0, 0, - Format::ID::BC2_RGBA_UNORM_BLOCK); - return info; - } - case D3DFMT_DXT5: - { - static const D3DFormat info(128, 4, 4, 0, 0, 0, 0, 0, 0, 0, - Format::ID::BC3_RGBA_UNORM_BLOCK); - return info; - } - - default: - { - static const D3DFormat defaultInfo; - return defaultInfo; - } - } -} - -typedef std::pair<GLint, InitializeTextureDataFunction> InternalFormatInitialzerPair; -typedef std::map<GLint, InitializeTextureDataFunction> InternalFormatInitialzerMap; - -static InternalFormatInitialzerMap BuildInternalFormatInitialzerMap() -{ - using namespace angle; // For image initialization functions - - InternalFormatInitialzerMap map; - - map.insert(InternalFormatInitialzerPair(GL_RGB16F, Initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>)); - map.insert(InternalFormatInitialzerPair(GL_RGB32F, Initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One>)); - - return map; -} - -static void UnreachableLoad(size_t width, size_t height, size_t depth, - const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch, - uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch) -{ - UNREACHABLE(); -} - -typedef std::pair<GLenum, TextureFormat> D3D9FormatPair; -typedef std::map<GLenum, TextureFormat> D3D9FormatMap; - -TextureFormat::TextureFormat() - : texFormat(D3DFMT_UNKNOWN), - renderFormat(D3DFMT_UNKNOWN), - dataInitializerFunction(nullptr), - loadFunction(UnreachableLoad) -{ -} - -static inline void InsertD3D9FormatInfo(D3D9FormatMap *map, GLenum internalFormat, D3DFORMAT texFormat, - D3DFORMAT renderFormat, LoadImageFunction loadFunction) -{ - TextureFormat info; - info.texFormat = texFormat; - info.renderFormat = renderFormat; - - static const InternalFormatInitialzerMap dataInitializationMap = BuildInternalFormatInitialzerMap(); - InternalFormatInitialzerMap::const_iterator dataInitIter = dataInitializationMap.find(internalFormat); - info.dataInitializerFunction = - (dataInitIter != dataInitializationMap.end()) ? dataInitIter->second : nullptr; - - info.loadFunction = loadFunction; - - map->insert(std::make_pair(internalFormat, info)); -} - -static D3D9FormatMap BuildD3D9FormatMap() -{ - using namespace angle; // For image loading functions - - D3D9FormatMap map; - - // clang-format off - // | Internal format | Texture format | Render format | Load function | - InsertD3D9FormatInfo(&map, GL_NONE, D3DFMT_NULL, D3DFMT_NULL, UnreachableLoad ); - - // We choose to downsample the GL_DEPTH_COMPONENT32_OES format to a 24-bit format because D3DFMT_D32 is not widely - // supported. We're allowed to do this because: - // - The ES spec 2.0.25 sec 3.7.1 states that we're allowed to store texture formats with internal format - // resolutions of our own choosing. - // - OES_depth_texture states that downsampling of the depth formats is allowed. - // - ANGLE_depth_texture does not state minimum required resolutions of the depth texture formats it - // introduces. - // In ES3 however, there are minimum resolutions for the texture formats and this would not be allowed. - - InsertD3D9FormatInfo(&map, GL_DEPTH_COMPONENT16, D3DFMT_INTZ, D3DFMT_D24S8, UnreachableLoad ); - InsertD3D9FormatInfo(&map, GL_DEPTH_COMPONENT32_OES, D3DFMT_INTZ, D3DFMT_D24X8, UnreachableLoad ); - InsertD3D9FormatInfo(&map, GL_DEPTH24_STENCIL8_OES, D3DFMT_INTZ, D3DFMT_D24S8, UnreachableLoad ); - InsertD3D9FormatInfo(&map, GL_STENCIL_INDEX8, D3DFMT_UNKNOWN, D3DFMT_D24S8, UnreachableLoad ); // TODO: What's the texture format? - - InsertD3D9FormatInfo(&map, GL_RGBA32F_EXT, D3DFMT_A32B32G32R32F, D3DFMT_A32B32G32R32F, LoadToNative<GLfloat, 4> ); - InsertD3D9FormatInfo(&map, GL_RGB32F_EXT, D3DFMT_A32B32G32R32F, D3DFMT_A32B32G32R32F, LoadToNative3To4<GLfloat, gl::Float32One>); - InsertD3D9FormatInfo(&map, GL_RG32F_EXT, D3DFMT_G32R32F, D3DFMT_G32R32F, LoadToNative<GLfloat, 2> ); - InsertD3D9FormatInfo(&map, GL_R32F_EXT, D3DFMT_R32F, D3DFMT_R32F, LoadToNative<GLfloat, 1> ); - InsertD3D9FormatInfo(&map, GL_ALPHA32F_EXT, D3DFMT_A32B32G32R32F, D3DFMT_UNKNOWN, LoadA32FToRGBA32F ); - InsertD3D9FormatInfo(&map, GL_LUMINANCE32F_EXT, D3DFMT_A32B32G32R32F, D3DFMT_UNKNOWN, LoadL32FToRGBA32F ); - InsertD3D9FormatInfo(&map, GL_LUMINANCE_ALPHA32F_EXT, D3DFMT_A32B32G32R32F, D3DFMT_UNKNOWN, LoadLA32FToRGBA32F ); - - InsertD3D9FormatInfo(&map, GL_RGBA16F_EXT, D3DFMT_A16B16G16R16F, D3DFMT_A16B16G16R16F, LoadToNative<GLhalf, 4> ); - InsertD3D9FormatInfo(&map, GL_RGB16F_EXT, D3DFMT_A16B16G16R16F, D3DFMT_A16B16G16R16F, LoadToNative3To4<GLhalf, gl::Float16One> ); - InsertD3D9FormatInfo(&map, GL_RG16F_EXT, D3DFMT_G16R16F, D3DFMT_G16R16F, LoadToNative<GLhalf, 2> ); - InsertD3D9FormatInfo(&map, GL_R16F_EXT, D3DFMT_R16F, D3DFMT_R16F, LoadToNative<GLhalf, 1> ); - InsertD3D9FormatInfo(&map, GL_ALPHA16F_EXT, D3DFMT_A16B16G16R16F, D3DFMT_UNKNOWN, LoadA16FToRGBA16F ); - InsertD3D9FormatInfo(&map, GL_LUMINANCE16F_EXT, D3DFMT_A16B16G16R16F, D3DFMT_UNKNOWN, LoadL16FToRGBA16F ); - InsertD3D9FormatInfo(&map, GL_LUMINANCE_ALPHA16F_EXT, D3DFMT_A16B16G16R16F, D3DFMT_UNKNOWN, LoadLA16FToRGBA16F ); - - InsertD3D9FormatInfo(&map, GL_ALPHA8_EXT, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadA8ToBGRA8 ); - - InsertD3D9FormatInfo(&map, GL_RGB8_OES, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, LoadRGB8ToBGRX8 ); - InsertD3D9FormatInfo(&map, GL_RGB565, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, LoadR5G6B5ToBGRA8 ); - InsertD3D9FormatInfo(&map, GL_RGBA8_OES, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadRGBA8ToBGRA8 ); - InsertD3D9FormatInfo(&map, GL_RGBA4, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadRGBA4ToBGRA8 ); - InsertD3D9FormatInfo(&map, GL_RGB5_A1, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadRGB5A1ToBGRA8 ); - InsertD3D9FormatInfo(&map, GL_R8_EXT, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, LoadR8ToBGRX8 ); - InsertD3D9FormatInfo(&map, GL_RG8_EXT, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, LoadRG8ToBGRX8 ); - - InsertD3D9FormatInfo(&map, GL_BGRA8_EXT, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadToNative<GLubyte, 4> ); - InsertD3D9FormatInfo(&map, GL_BGRA4_ANGLEX, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadBGRA4ToBGRA8 ); - InsertD3D9FormatInfo(&map, GL_BGR5_A1_ANGLEX, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadBGR5A1ToBGRA8 ); - - InsertD3D9FormatInfo(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, D3DFMT_DXT1, D3DFMT_UNKNOWN, LoadCompressedToNative<4, 4, 8> ); - InsertD3D9FormatInfo(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, D3DFMT_DXT1, D3DFMT_UNKNOWN, LoadCompressedToNative<4, 4, 8> ); - InsertD3D9FormatInfo(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, D3DFMT_DXT3, D3DFMT_UNKNOWN, LoadCompressedToNative<4, 4, 16> ); - InsertD3D9FormatInfo(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, D3DFMT_DXT5, D3DFMT_UNKNOWN, LoadCompressedToNative<4, 4, 16> ); - - // These formats require checking if the renderer supports D3DFMT_L8 or D3DFMT_A8L8 and - // then changing the format and loading function appropriately. - InsertD3D9FormatInfo(&map, GL_LUMINANCE8_EXT, D3DFMT_L8, D3DFMT_UNKNOWN, LoadToNative<GLubyte, 1> ); - InsertD3D9FormatInfo(&map, GL_LUMINANCE8_ALPHA8_EXT, D3DFMT_A8L8, D3DFMT_UNKNOWN, LoadToNative<GLubyte, 2> ); - // clang-format on - - return map; -} - -const TextureFormat &GetTextureFormatInfo(GLenum internalFormat) -{ - static const D3D9FormatMap formatMap = BuildD3D9FormatMap(); - D3D9FormatMap::const_iterator iter = formatMap.find(internalFormat); - if (iter != formatMap.end()) - { - return iter->second; - } - else - { - static const TextureFormat defaultInfo; - return defaultInfo; - } -} - -static GLenum GetDeclTypeComponentType(D3DDECLTYPE declType) -{ - switch (declType) - { - case D3DDECLTYPE_FLOAT1: return GL_FLOAT; - case D3DDECLTYPE_FLOAT2: return GL_FLOAT; - case D3DDECLTYPE_FLOAT3: return GL_FLOAT; - case D3DDECLTYPE_FLOAT4: return GL_FLOAT; - case D3DDECLTYPE_UBYTE4: return GL_UNSIGNED_INT; - case D3DDECLTYPE_SHORT2: return GL_INT; - case D3DDECLTYPE_SHORT4: return GL_INT; - case D3DDECLTYPE_UBYTE4N: return GL_UNSIGNED_NORMALIZED; - case D3DDECLTYPE_SHORT4N: return GL_SIGNED_NORMALIZED; - case D3DDECLTYPE_USHORT4N: return GL_UNSIGNED_NORMALIZED; - case D3DDECLTYPE_SHORT2N: return GL_SIGNED_NORMALIZED; - case D3DDECLTYPE_USHORT2N: return GL_UNSIGNED_NORMALIZED; - default: UNREACHABLE(); return GL_NONE; - } -} - -// Attribute format conversion -enum { NUM_GL_VERTEX_ATTRIB_TYPES = 6 }; - -struct TranslationDescription -{ - DWORD capsFlag; - VertexFormat preferredConversion; - VertexFormat fallbackConversion; -}; - -// Mapping from OpenGL-ES vertex attrib type to D3D decl type: -// -// BYTE SHORT (Cast) -// BYTE-norm FLOAT (Normalize) (can't be exactly represented as SHORT-norm) -// UNSIGNED_BYTE UBYTE4 (Identity) or SHORT (Cast) -// UNSIGNED_BYTE-norm UBYTE4N (Identity) or FLOAT (Normalize) -// SHORT SHORT (Identity) -// SHORT-norm SHORT-norm (Identity) or FLOAT (Normalize) -// UNSIGNED_SHORT FLOAT (Cast) -// UNSIGNED_SHORT-norm USHORT-norm (Identity) or FLOAT (Normalize) -// FIXED (not in WebGL) FLOAT (FixedToFloat) -// FLOAT FLOAT (Identity) - -// GLToCType maps from GL type (as GLenum) to the C typedef. -template <GLenum GLType> struct GLToCType { }; - -template <> struct GLToCType<GL_BYTE> { typedef GLbyte type; }; -template <> struct GLToCType<GL_UNSIGNED_BYTE> { typedef GLubyte type; }; -template <> struct GLToCType<GL_SHORT> { typedef GLshort type; }; -template <> struct GLToCType<GL_UNSIGNED_SHORT> { typedef GLushort type; }; -template <> struct GLToCType<GL_FIXED> { typedef GLuint type; }; -template <> struct GLToCType<GL_FLOAT> { typedef GLfloat type; }; - -// This differs from D3DDECLTYPE in that it is unsized. (Size expansion is applied last.) -enum D3DVertexType -{ - D3DVT_FLOAT, - D3DVT_SHORT, - D3DVT_SHORT_NORM, - D3DVT_UBYTE, - D3DVT_UBYTE_NORM, - D3DVT_USHORT_NORM -}; - -// D3DToCType maps from D3D vertex type (as enum D3DVertexType) to the corresponding C type. -template <unsigned int D3DType> struct D3DToCType { }; - -template <> struct D3DToCType<D3DVT_FLOAT> { typedef float type; }; -template <> struct D3DToCType<D3DVT_SHORT> { typedef short type; }; -template <> struct D3DToCType<D3DVT_SHORT_NORM> { typedef short type; }; -template <> struct D3DToCType<D3DVT_UBYTE> { typedef unsigned char type; }; -template <> struct D3DToCType<D3DVT_UBYTE_NORM> { typedef unsigned char type; }; -template <> struct D3DToCType<D3DVT_USHORT_NORM> { typedef unsigned short type; }; - -// Encode the type/size combinations that D3D permits. For each type/size it expands to a widener that will provide the appropriate final size. -template <unsigned int type, int size> struct WidenRule { }; - -template <int size> struct WidenRule<D3DVT_FLOAT, size> : NoWiden<size> { }; -template <int size> struct WidenRule<D3DVT_SHORT, size> : WidenToEven<size> { }; -template <int size> struct WidenRule<D3DVT_SHORT_NORM, size> : WidenToEven<size> { }; -template <int size> struct WidenRule<D3DVT_UBYTE, size> : WidenToFour<size> { }; -template <int size> struct WidenRule<D3DVT_UBYTE_NORM, size> : WidenToFour<size> { }; -template <int size> struct WidenRule<D3DVT_USHORT_NORM, size> : WidenToEven<size> { }; - -// VertexTypeFlags encodes the D3DCAPS9::DeclType flag and vertex declaration flag for each D3D vertex type & size combination. -template <unsigned int d3dtype, int size> struct VertexTypeFlags { }; - -template <unsigned int _capflag, unsigned int _declflag> -struct VertexTypeFlagsHelper -{ - enum { capflag = _capflag }; - enum { declflag = _declflag }; -}; - -template <> struct VertexTypeFlags<D3DVT_FLOAT, 1> : VertexTypeFlagsHelper<0, D3DDECLTYPE_FLOAT1> { }; -template <> struct VertexTypeFlags<D3DVT_FLOAT, 2> : VertexTypeFlagsHelper<0, D3DDECLTYPE_FLOAT2> { }; -template <> struct VertexTypeFlags<D3DVT_FLOAT, 3> : VertexTypeFlagsHelper<0, D3DDECLTYPE_FLOAT3> { }; -template <> struct VertexTypeFlags<D3DVT_FLOAT, 4> : VertexTypeFlagsHelper<0, D3DDECLTYPE_FLOAT4> { }; -template <> struct VertexTypeFlags<D3DVT_SHORT, 2> : VertexTypeFlagsHelper<0, D3DDECLTYPE_SHORT2> { }; -template <> struct VertexTypeFlags<D3DVT_SHORT, 4> : VertexTypeFlagsHelper<0, D3DDECLTYPE_SHORT4> { }; -template <> struct VertexTypeFlags<D3DVT_SHORT_NORM, 2> : VertexTypeFlagsHelper<D3DDTCAPS_SHORT2N, D3DDECLTYPE_SHORT2N> { }; -template <> struct VertexTypeFlags<D3DVT_SHORT_NORM, 4> : VertexTypeFlagsHelper<D3DDTCAPS_SHORT4N, D3DDECLTYPE_SHORT4N> { }; -template <> struct VertexTypeFlags<D3DVT_UBYTE, 4> : VertexTypeFlagsHelper<D3DDTCAPS_UBYTE4, D3DDECLTYPE_UBYTE4> { }; -template <> struct VertexTypeFlags<D3DVT_UBYTE_NORM, 4> : VertexTypeFlagsHelper<D3DDTCAPS_UBYTE4N, D3DDECLTYPE_UBYTE4N> { }; -template <> struct VertexTypeFlags<D3DVT_USHORT_NORM, 2> : VertexTypeFlagsHelper<D3DDTCAPS_USHORT2N, D3DDECLTYPE_USHORT2N> { }; -template <> struct VertexTypeFlags<D3DVT_USHORT_NORM, 4> : VertexTypeFlagsHelper<D3DDTCAPS_USHORT4N, D3DDECLTYPE_USHORT4N> { }; - - -// VertexTypeMapping maps GL type & normalized flag to preferred and fallback D3D vertex types (as D3DVertexType enums). -template <GLenum GLtype, bool normalized> struct VertexTypeMapping { }; - -template <D3DVertexType Preferred, D3DVertexType Fallback = Preferred> -struct VertexTypeMappingBase -{ - enum { preferred = Preferred }; - enum { fallback = Fallback }; -}; - -template <> struct VertexTypeMapping<GL_BYTE, false> : VertexTypeMappingBase<D3DVT_SHORT> { }; // Cast -template <> struct VertexTypeMapping<GL_BYTE, true> : VertexTypeMappingBase<D3DVT_FLOAT> { }; // Normalize -template <> struct VertexTypeMapping<GL_UNSIGNED_BYTE, false> : VertexTypeMappingBase<D3DVT_UBYTE, D3DVT_FLOAT> { }; // Identity, Cast -template <> struct VertexTypeMapping<GL_UNSIGNED_BYTE, true> : VertexTypeMappingBase<D3DVT_UBYTE_NORM, D3DVT_FLOAT> { }; // Identity, Normalize -template <> struct VertexTypeMapping<GL_SHORT, false> : VertexTypeMappingBase<D3DVT_SHORT> { }; // Identity -template <> struct VertexTypeMapping<GL_SHORT, true> : VertexTypeMappingBase<D3DVT_SHORT_NORM, D3DVT_FLOAT> { }; // Cast, Normalize -template <> struct VertexTypeMapping<GL_UNSIGNED_SHORT, false> : VertexTypeMappingBase<D3DVT_FLOAT> { }; // Cast -template <> struct VertexTypeMapping<GL_UNSIGNED_SHORT, true> : VertexTypeMappingBase<D3DVT_USHORT_NORM, D3DVT_FLOAT> { }; // Cast, Normalize -template <bool normalized> struct VertexTypeMapping<GL_FIXED, normalized> : VertexTypeMappingBase<D3DVT_FLOAT> { }; // FixedToFloat -template <bool normalized> struct VertexTypeMapping<GL_FLOAT, normalized> : VertexTypeMappingBase<D3DVT_FLOAT> { }; // Identity - - -// Given a GL type & norm flag and a D3D type, ConversionRule provides the type conversion rule (Cast, Normalize, Identity, FixedToFloat). -// The conversion rules themselves are defined in vertexconversion.h. - -// Almost all cases are covered by Cast (including those that are actually Identity since Cast<T,T> knows it's an identity mapping). -template <GLenum fromType, bool normalized, unsigned int toType> -struct ConversionRule : Cast<typename GLToCType<fromType>::type, typename D3DToCType<toType>::type> { }; - -// All conversions from normalized types to float use the Normalize operator. -template <GLenum fromType> struct ConversionRule<fromType, true, D3DVT_FLOAT> : Normalize<typename GLToCType<fromType>::type> { }; - -// Use a full specialization for this so that it preferentially matches ahead of the generic normalize-to-float rules. -template <> struct ConversionRule<GL_FIXED, true, D3DVT_FLOAT> : FixedToFloat<GLint, 16> { }; -template <> struct ConversionRule<GL_FIXED, false, D3DVT_FLOAT> : FixedToFloat<GLint, 16> { }; - -// A 2-stage construction is used for DefaultVertexValues because float must use SimpleDefaultValues (i.e. 0/1) -// whether it is normalized or not. -template <class T, bool normalized> struct DefaultVertexValuesStage2 { }; - -template <class T> struct DefaultVertexValuesStage2<T, true> : NormalizedDefaultValues<T> { }; -template <class T> struct DefaultVertexValuesStage2<T, false> : SimpleDefaultValues<T> { }; - -// Work out the default value rule for a D3D type (expressed as the C type) and -template <class T, bool normalized> struct DefaultVertexValues : DefaultVertexValuesStage2<T, normalized> { }; -template <bool normalized> struct DefaultVertexValues<float, normalized> : SimpleDefaultValues<float> { }; - -// Policy rules for use with Converter, to choose whether to use the preferred or fallback conversion. -// The fallback conversion produces an output that all D3D9 devices must support. -template <class T> struct UsePreferred { enum { type = T::preferred }; }; -template <class T> struct UseFallback { enum { type = T::fallback }; }; - -// Converter ties it all together. Given an OpenGL type/norm/size and choice of preferred/fallback conversion, -// it provides all the members of the appropriate VertexDataConverter, the D3DCAPS9::DeclTypes flag in cap flag -// and the D3DDECLTYPE member needed for the vertex declaration in declflag. -template <GLenum fromType, bool normalized, int size, template <class T> class PreferenceRule> -struct Converter - : VertexDataConverter< - typename GLToCType<fromType>::type, - WidenRule<PreferenceRule<VertexTypeMapping<fromType, normalized>>::type, size>, - ConversionRule<fromType, - normalized, - PreferenceRule<VertexTypeMapping<fromType, normalized>>::type>, - DefaultVertexValues<typename D3DToCType<PreferenceRule< - VertexTypeMapping<fromType, normalized>>::type>::type, - normalized>> -{ -private: - enum - { - d3dtype = PreferenceRule<VertexTypeMapping<fromType, normalized>>::type - }; - enum - { - d3dsize = WidenRule<d3dtype, size>::finalWidth - }; - -public: - enum { capflag = VertexTypeFlags<d3dtype, d3dsize>::capflag }; - enum { declflag = VertexTypeFlags<d3dtype, d3dsize>::declflag }; -}; - -VertexFormat::VertexFormat() - : conversionType(VERTEX_CONVERT_NONE), - outputElementSize(0), - copyFunction(nullptr), - nativeFormat(D3DDECLTYPE_UNUSED), - componentType(GL_NONE) -{ -} - -// Initialize a TranslationInfo -VertexFormat CreateVertexFormatInfo(bool identity, size_t elementSize, VertexCopyFunction copyFunc, D3DDECLTYPE nativeFormat) -{ - VertexFormat formatInfo; - formatInfo.conversionType = identity ? VERTEX_CONVERT_NONE : VERTEX_CONVERT_CPU; - formatInfo.outputElementSize = elementSize; - formatInfo.copyFunction = copyFunc; - formatInfo.nativeFormat = nativeFormat; - formatInfo.componentType = GetDeclTypeComponentType(nativeFormat); - return formatInfo; -} - -#define TRANSLATION(type, norm, size, preferred) \ - CreateVertexFormatInfo \ - ( \ - Converter<type, norm, size, preferred>::identity, \ - Converter<type, norm, size, preferred>::finalSize, \ - Converter<type, norm, size, preferred>::convertArray, \ - static_cast<D3DDECLTYPE>(Converter<type, norm, size, preferred>::declflag) \ - ) - -#define TRANSLATION_FOR_TYPE_NORM_SIZE(type, norm, size) \ - { \ - Converter<type, norm, size, UsePreferred>::capflag, \ - TRANSLATION(type, norm, size, UsePreferred), \ - TRANSLATION(type, norm, size, UseFallback) \ - } - -#define TRANSLATIONS_FOR_TYPE(type) \ - { \ - { TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 1), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 2), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 3), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 4) }, \ - { TRANSLATION_FOR_TYPE_NORM_SIZE(type, true, 1), TRANSLATION_FOR_TYPE_NORM_SIZE(type, true, 2), TRANSLATION_FOR_TYPE_NORM_SIZE(type, true, 3), TRANSLATION_FOR_TYPE_NORM_SIZE(type, true, 4) }, \ - } - -#define TRANSLATIONS_FOR_TYPE_NO_NORM(type) \ - { \ - { TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 1), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 2), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 3), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 4) }, \ - { TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 1), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 2), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 3), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 4) }, \ - } - -static inline unsigned int ComputeTypeIndex(GLenum type) -{ - switch (type) - { - case GL_BYTE: return 0; - case GL_UNSIGNED_BYTE: return 1; - case GL_SHORT: return 2; - case GL_UNSIGNED_SHORT: return 3; - case GL_FIXED: return 4; - case GL_FLOAT: return 5; - - default: UNREACHABLE(); return 5; - } -} - -const VertexFormat &GetVertexFormatInfo(DWORD supportedDeclTypes, gl::VertexFormatType vertexFormatType) -{ - static bool initialized = false; - static DWORD initializedDeclTypes = 0; - static VertexFormat formatConverters[NUM_GL_VERTEX_ATTRIB_TYPES][2][4]; - if (initializedDeclTypes != supportedDeclTypes) - { - const TranslationDescription translations[NUM_GL_VERTEX_ATTRIB_TYPES][2][4] = // [GL types as enumerated by typeIndex()][normalized][size-1] - { - TRANSLATIONS_FOR_TYPE(GL_BYTE), - TRANSLATIONS_FOR_TYPE(GL_UNSIGNED_BYTE), - TRANSLATIONS_FOR_TYPE(GL_SHORT), - TRANSLATIONS_FOR_TYPE(GL_UNSIGNED_SHORT), - TRANSLATIONS_FOR_TYPE_NO_NORM(GL_FIXED), - TRANSLATIONS_FOR_TYPE_NO_NORM(GL_FLOAT) - }; - for (unsigned int i = 0; i < NUM_GL_VERTEX_ATTRIB_TYPES; i++) - { - for (unsigned int j = 0; j < 2; j++) - { - for (unsigned int k = 0; k < 4; k++) - { - if (translations[i][j][k].capsFlag == 0 || (supportedDeclTypes & translations[i][j][k].capsFlag) != 0) - { - formatConverters[i][j][k] = translations[i][j][k].preferredConversion; - } - else - { - formatConverters[i][j][k] = translations[i][j][k].fallbackConversion; - } - } - } - } - initialized = true; - initializedDeclTypes = supportedDeclTypes; - } - - const gl::VertexFormat &vertexFormat = gl::GetVertexFormatFromType(vertexFormatType); - - // Pure integer attributes only supported in ES3.0 - ASSERT(!vertexFormat.pureInteger); - return formatConverters[ComputeTypeIndex(vertexFormat.type)][vertexFormat.normalized][vertexFormat.components - 1]; -} - -} - -} diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.h deleted file mode 100644 index 1bef320b53..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.h +++ /dev/null @@ -1,94 +0,0 @@ -// -// Copyright (c) 2013-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. -// - -// formatutils9.h: Queries for GL image formats and their translations to D3D9 -// formats. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_FORMATUTILS9_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_FORMATUTILS9_H_ - -#include <map> - -#include "common/platform.h" -#include "libANGLE/angletypes.h" -#include "libANGLE/formatutils.h" -#include "libANGLE/renderer/Format.h" -#include "libANGLE/renderer/renderer_utils.h" -#include "libANGLE/renderer/d3d/formatutilsD3D.h" - -namespace rx -{ - -class Renderer9; - -namespace d3d9 -{ - -struct D3DFormat -{ - D3DFormat(); - D3DFormat(GLuint pixelBytes, - GLuint blockWidth, - GLuint blockHeight, - GLuint redBits, - GLuint greenBits, - GLuint blueBits, - GLuint alphaBits, - GLuint luminanceBits, - GLuint depthBits, - GLuint stencilBits, - angle::Format::ID formatID); - - const angle::Format &info() const { return angle::Format::Get(formatID); } - - GLuint pixelBytes; - GLuint blockWidth; - GLuint blockHeight; - - GLuint redBits; - GLuint greenBits; - GLuint blueBits; - GLuint alphaBits; - GLuint luminanceBits; - - GLuint depthBits; - GLuint stencilBits; - - angle::Format::ID formatID; -}; - -const D3DFormat &GetD3DFormatInfo(D3DFORMAT format); - -struct VertexFormat -{ - VertexFormat(); - - VertexConversionType conversionType; - size_t outputElementSize; - VertexCopyFunction copyFunction; - D3DDECLTYPE nativeFormat; - GLenum componentType; -}; -const VertexFormat &GetVertexFormatInfo(DWORD supportedDeclTypes, gl::VertexFormatType vertexFormatType); - -struct TextureFormat -{ - TextureFormat(); - - D3DFORMAT texFormat; - D3DFORMAT renderFormat; - - InitializeTextureDataFunction dataInitializerFunction; - - LoadImageFunction loadFunction; -}; -const TextureFormat &GetTextureFormatInfo(GLenum internalFormat); - -} - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_FORMATUTILS9_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp deleted file mode 100644 index fd451a6e51..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp +++ /dev/null @@ -1,671 +0,0 @@ -// -// Copyright (c) 2002-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. -// - -// renderer9_utils.cpp: Conversion functions and other utility routines -// specific to the D3D9 renderer. - -#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" - -#include "common/mathutil.h" -#include "common/debug.h" - -#include "libANGLE/formatutils.h" -#include "libANGLE/Framebuffer.h" -#include "libANGLE/renderer/d3d/d3d9/formatutils9.h" -#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h" -#include "libANGLE/renderer/d3d/FramebufferD3D.h" -#include "libANGLE/renderer/driver_utils.h" -#include "platform/Platform.h" -#include "platform/WorkaroundsD3D.h" - -#include "third_party/systeminfo/SystemInfo.h" - -namespace rx -{ - -namespace gl_d3d9 -{ - -D3DCMPFUNC ConvertComparison(GLenum comparison) -{ - D3DCMPFUNC d3dComp = D3DCMP_ALWAYS; - switch (comparison) - { - case GL_NEVER: d3dComp = D3DCMP_NEVER; break; - case GL_ALWAYS: d3dComp = D3DCMP_ALWAYS; break; - case GL_LESS: d3dComp = D3DCMP_LESS; break; - case GL_LEQUAL: d3dComp = D3DCMP_LESSEQUAL; break; - case GL_EQUAL: d3dComp = D3DCMP_EQUAL; break; - case GL_GREATER: d3dComp = D3DCMP_GREATER; break; - case GL_GEQUAL: d3dComp = D3DCMP_GREATEREQUAL; break; - case GL_NOTEQUAL: d3dComp = D3DCMP_NOTEQUAL; break; - default: UNREACHABLE(); - } - - return d3dComp; -} - -D3DCOLOR ConvertColor(gl::ColorF color) -{ - return D3DCOLOR_RGBA(gl::unorm<8>(color.red), - gl::unorm<8>(color.green), - gl::unorm<8>(color.blue), - gl::unorm<8>(color.alpha)); -} - -D3DBLEND ConvertBlendFunc(GLenum blend) -{ - D3DBLEND d3dBlend = D3DBLEND_ZERO; - - switch (blend) - { - case GL_ZERO: d3dBlend = D3DBLEND_ZERO; break; - case GL_ONE: d3dBlend = D3DBLEND_ONE; break; - case GL_SRC_COLOR: d3dBlend = D3DBLEND_SRCCOLOR; break; - case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3DBLEND_INVSRCCOLOR; break; - case GL_DST_COLOR: d3dBlend = D3DBLEND_DESTCOLOR; break; - case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3DBLEND_INVDESTCOLOR; break; - case GL_SRC_ALPHA: d3dBlend = D3DBLEND_SRCALPHA; break; - case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3DBLEND_INVSRCALPHA; break; - case GL_DST_ALPHA: d3dBlend = D3DBLEND_DESTALPHA; break; - case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3DBLEND_INVDESTALPHA; break; - case GL_CONSTANT_COLOR: d3dBlend = D3DBLEND_BLENDFACTOR; break; - case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3DBLEND_INVBLENDFACTOR; break; - case GL_CONSTANT_ALPHA: d3dBlend = D3DBLEND_BLENDFACTOR; break; - case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3DBLEND_INVBLENDFACTOR; break; - case GL_SRC_ALPHA_SATURATE: d3dBlend = D3DBLEND_SRCALPHASAT; break; - default: UNREACHABLE(); - } - - return d3dBlend; -} - -D3DBLENDOP ConvertBlendOp(GLenum blendOp) -{ - D3DBLENDOP d3dBlendOp = D3DBLENDOP_ADD; - - switch (blendOp) - { - case GL_FUNC_ADD: d3dBlendOp = D3DBLENDOP_ADD; break; - case GL_FUNC_SUBTRACT: d3dBlendOp = D3DBLENDOP_SUBTRACT; break; - case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3DBLENDOP_REVSUBTRACT; break; - case GL_MIN_EXT: d3dBlendOp = D3DBLENDOP_MIN; break; - case GL_MAX_EXT: d3dBlendOp = D3DBLENDOP_MAX; break; - default: UNREACHABLE(); - } - - return d3dBlendOp; -} - -D3DSTENCILOP ConvertStencilOp(GLenum stencilOp) -{ - D3DSTENCILOP d3dStencilOp = D3DSTENCILOP_KEEP; - - switch (stencilOp) - { - case GL_ZERO: d3dStencilOp = D3DSTENCILOP_ZERO; break; - case GL_KEEP: d3dStencilOp = D3DSTENCILOP_KEEP; break; - case GL_REPLACE: d3dStencilOp = D3DSTENCILOP_REPLACE; break; - case GL_INCR: d3dStencilOp = D3DSTENCILOP_INCRSAT; break; - case GL_DECR: d3dStencilOp = D3DSTENCILOP_DECRSAT; break; - case GL_INVERT: d3dStencilOp = D3DSTENCILOP_INVERT; break; - case GL_INCR_WRAP: d3dStencilOp = D3DSTENCILOP_INCR; break; - case GL_DECR_WRAP: d3dStencilOp = D3DSTENCILOP_DECR; break; - default: UNREACHABLE(); - } - - return d3dStencilOp; -} - -D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap) -{ - D3DTEXTUREADDRESS d3dWrap = D3DTADDRESS_WRAP; - - switch (wrap) - { - case GL_REPEAT: d3dWrap = D3DTADDRESS_WRAP; break; - case GL_CLAMP_TO_EDGE: d3dWrap = D3DTADDRESS_CLAMP; break; - case GL_MIRRORED_REPEAT: d3dWrap = D3DTADDRESS_MIRROR; break; - default: UNREACHABLE(); - } - - return d3dWrap; -} - -D3DCULL ConvertCullMode(gl::CullFaceMode cullFace, GLenum frontFace) -{ - D3DCULL cull = D3DCULL_CCW; - switch (cullFace) - { - case gl::CullFaceMode::Front: - cull = (frontFace == GL_CCW ? D3DCULL_CW : D3DCULL_CCW); - break; - case gl::CullFaceMode::Back: - cull = (frontFace == GL_CCW ? D3DCULL_CCW : D3DCULL_CW); - break; - case gl::CullFaceMode::FrontAndBack: - cull = D3DCULL_NONE; // culling will be handled during draw - break; - default: - UNREACHABLE(); - } - - return cull; -} - -D3DCUBEMAP_FACES ConvertCubeFace(GLenum cubeFace) -{ - D3DCUBEMAP_FACES face = D3DCUBEMAP_FACE_POSITIVE_X; - - switch (cubeFace) - { - case GL_TEXTURE_CUBE_MAP_POSITIVE_X: - face = D3DCUBEMAP_FACE_POSITIVE_X; - break; - case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: - face = D3DCUBEMAP_FACE_NEGATIVE_X; - break; - case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: - face = D3DCUBEMAP_FACE_POSITIVE_Y; - break; - case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: - face = D3DCUBEMAP_FACE_NEGATIVE_Y; - break; - case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: - face = D3DCUBEMAP_FACE_POSITIVE_Z; - break; - case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: - face = D3DCUBEMAP_FACE_NEGATIVE_Z; - break; - default: UNREACHABLE(); - } - - return face; -} - -DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha) -{ - return (red ? D3DCOLORWRITEENABLE_RED : 0) | - (green ? D3DCOLORWRITEENABLE_GREEN : 0) | - (blue ? D3DCOLORWRITEENABLE_BLUE : 0) | - (alpha ? D3DCOLORWRITEENABLE_ALPHA : 0); -} - -D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter, float maxAnisotropy) -{ - if (maxAnisotropy > 1.0f) - { - return D3DTEXF_ANISOTROPIC; - } - - D3DTEXTUREFILTERTYPE d3dMagFilter = D3DTEXF_POINT; - switch (magFilter) - { - case GL_NEAREST: d3dMagFilter = D3DTEXF_POINT; break; - case GL_LINEAR: d3dMagFilter = D3DTEXF_LINEAR; break; - default: UNREACHABLE(); - } - - return d3dMagFilter; -} - -void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter, - float *d3dLodBias, float maxAnisotropy, size_t baseLevel) -{ - switch (minFilter) - { - case GL_NEAREST: - *d3dMinFilter = D3DTEXF_POINT; - *d3dMipFilter = D3DTEXF_NONE; - break; - case GL_LINEAR: - *d3dMinFilter = D3DTEXF_LINEAR; - *d3dMipFilter = D3DTEXF_NONE; - break; - case GL_NEAREST_MIPMAP_NEAREST: - *d3dMinFilter = D3DTEXF_POINT; - *d3dMipFilter = D3DTEXF_POINT; - break; - case GL_LINEAR_MIPMAP_NEAREST: - *d3dMinFilter = D3DTEXF_LINEAR; - *d3dMipFilter = D3DTEXF_POINT; - break; - case GL_NEAREST_MIPMAP_LINEAR: - *d3dMinFilter = D3DTEXF_POINT; - *d3dMipFilter = D3DTEXF_LINEAR; - break; - case GL_LINEAR_MIPMAP_LINEAR: - *d3dMinFilter = D3DTEXF_LINEAR; - *d3dMipFilter = D3DTEXF_LINEAR; - break; - default: - *d3dMinFilter = D3DTEXF_POINT; - *d3dMipFilter = D3DTEXF_NONE; - UNREACHABLE(); - } - - // Disabling mipmapping will always sample from level 0 of the texture. It is possible to work - // around this by modifying D3DSAMP_MAXMIPLEVEL to force a specific mip level to become the - // lowest sampled mip level and using a large negative value for D3DSAMP_MIPMAPLODBIAS to - // ensure that only the base mip level is sampled. - if (baseLevel > 0 && *d3dMipFilter == D3DTEXF_NONE) - { - *d3dMipFilter = D3DTEXF_POINT; - *d3dLodBias = -static_cast<float>(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - } - else - { - *d3dLodBias = 0.0f; - } - - if (maxAnisotropy > 1.0f) - { - *d3dMinFilter = D3DTEXF_ANISOTROPIC; - } -} - -D3DQUERYTYPE ConvertQueryType(GLenum queryType) -{ - switch (queryType) - { - case GL_ANY_SAMPLES_PASSED_EXT: - case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: - return D3DQUERYTYPE_OCCLUSION; - case GL_COMMANDS_COMPLETED_CHROMIUM: - return D3DQUERYTYPE_EVENT; - default: - UNREACHABLE(); - return static_cast<D3DQUERYTYPE>(0); - } -} - -D3DMULTISAMPLE_TYPE GetMultisampleType(GLuint samples) -{ - return (samples > 1) ? static_cast<D3DMULTISAMPLE_TYPE>(samples) : D3DMULTISAMPLE_NONE; -} - -} - -namespace d3d9_gl -{ - -unsigned int GetReservedVertexUniformVectors() -{ - return 3; // dx_ViewCoords, dx_ViewAdjust and dx_DepthRange. -} - -unsigned int GetReservedFragmentUniformVectors() -{ - return 3; // dx_ViewCoords, dx_DepthFront and dx_DepthRange. -} - -GLsizei GetSamplesCount(D3DMULTISAMPLE_TYPE type) -{ - return (type != D3DMULTISAMPLE_NONMASKABLE) ? type : 0; -} - -bool IsFormatChannelEquivalent(D3DFORMAT d3dformat, GLenum format) -{ - GLenum internalFormat = d3d9::GetD3DFormatInfo(d3dformat).info().glInternalFormat; - GLenum convertedFormat = gl::GetSizedInternalFormatInfo(internalFormat).format; - return convertedFormat == format; -} - -static gl::TextureCaps GenerateTextureFormatCaps(GLenum internalFormat, IDirect3D9 *d3d9, D3DDEVTYPE deviceType, - UINT adapter, D3DFORMAT adapterFormat) -{ - gl::TextureCaps textureCaps; - - const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(internalFormat); - const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalFormat); - - if (d3dFormatInfo.texFormat != D3DFMT_UNKNOWN) - { - if (formatInfo.depthBits > 0 || formatInfo.stencilBits > 0) - { - textureCaps.texturable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, 0, D3DRTYPE_TEXTURE, d3dFormatInfo.texFormat)); - } - else - { - textureCaps.texturable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, 0, D3DRTYPE_TEXTURE, d3dFormatInfo.texFormat)) && - SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, 0, D3DRTYPE_CUBETEXTURE, d3dFormatInfo.texFormat)); - } - - textureCaps.filterable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_QUERY_FILTER, D3DRTYPE_TEXTURE, d3dFormatInfo.texFormat)); - } - - if (d3dFormatInfo.renderFormat != D3DFMT_UNKNOWN) - { - textureCaps.renderable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_RENDERTARGET, D3DRTYPE_TEXTURE, d3dFormatInfo.renderFormat)); - - if ((formatInfo.depthBits > 0 || formatInfo.stencilBits > 0) && !textureCaps.renderable) - { - textureCaps.renderable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, d3dFormatInfo.renderFormat)); - } - - textureCaps.sampleCounts.insert(1); - for (unsigned int i = D3DMULTISAMPLE_2_SAMPLES; i <= D3DMULTISAMPLE_16_SAMPLES; i++) - { - D3DMULTISAMPLE_TYPE multisampleType = D3DMULTISAMPLE_TYPE(i); - - HRESULT result = d3d9->CheckDeviceMultiSampleType( - adapter, deviceType, d3dFormatInfo.renderFormat, TRUE, multisampleType, nullptr); - if (SUCCEEDED(result)) - { - textureCaps.sampleCounts.insert(i); - } - } - } - - return textureCaps; -} - -void GenerateCaps(IDirect3D9 *d3d9, - IDirect3DDevice9 *device, - D3DDEVTYPE deviceType, - UINT adapter, - gl::Caps *caps, - gl::TextureCapsMap *textureCapsMap, - gl::Extensions *extensions, - gl::Limitations *limitations) -{ - D3DCAPS9 deviceCaps; - if (FAILED(d3d9->GetDeviceCaps(adapter, deviceType, &deviceCaps))) - { - // Can't continue with out device caps - return; - } - - D3DDISPLAYMODE currentDisplayMode; - d3d9->GetAdapterDisplayMode(adapter, ¤tDisplayMode); - - GLuint maxSamples = 0; - for (GLenum internalFormat : gl::GetAllSizedInternalFormats()) - { - gl::TextureCaps textureCaps = GenerateTextureFormatCaps(internalFormat, d3d9, deviceType, - adapter, currentDisplayMode.Format); - textureCapsMap->insert(internalFormat, textureCaps); - - maxSamples = std::max(maxSamples, textureCaps.getMaxSamples()); - - if (gl::GetSizedInternalFormatInfo(internalFormat).compressed) - { - caps->compressedTextureFormats.push_back(internalFormat); - } - } - - // GL core feature limits - caps->maxElementIndex = static_cast<GLint64>(std::numeric_limits<unsigned int>::max()); - - // 3D textures are unimplemented in D3D9 - caps->max3DTextureSize = 1; - - // Only one limit in GL, use the minimum dimension - caps->max2DTextureSize = std::min(deviceCaps.MaxTextureWidth, deviceCaps.MaxTextureHeight); - - // D3D treats cube maps as a special case of 2D textures - caps->maxCubeMapTextureSize = caps->max2DTextureSize; - - // Array textures are not available in D3D9 - caps->maxArrayTextureLayers = 1; - - // ES3-only feature - caps->maxLODBias = 0.0f; - - // No specific limits on render target size, maximum 2D texture size is equivalent - caps->maxRenderbufferSize = caps->max2DTextureSize; - - // Draw buffers are not supported in D3D9 - caps->maxDrawBuffers = 1; - caps->maxColorAttachments = 1; - - // No specific limits on viewport size, maximum 2D texture size is equivalent - caps->maxViewportWidth = caps->max2DTextureSize; - caps->maxViewportHeight = caps->maxViewportWidth; - - // Point size is clamped to 1.0f when the shader model is less than 3 - caps->minAliasedPointSize = 1.0f; - caps->maxAliasedPointSize = ((D3DSHADER_VERSION_MAJOR(deviceCaps.PixelShaderVersion) >= 3) ? deviceCaps.MaxPointSize : 1.0f); - - // Wide lines not supported - caps->minAliasedLineWidth = 1.0f; - caps->maxAliasedLineWidth = 1.0f; - - // Primitive count limits (unused in ES2) - caps->maxElementsIndices = 0; - caps->maxElementsVertices = 0; - - // Program and shader binary formats (no supported shader binary formats) - caps->programBinaryFormats.push_back(GL_PROGRAM_BINARY_ANGLE); - - caps->vertexHighpFloat.setIEEEFloat(); - caps->vertexMediumpFloat.setIEEEFloat(); - caps->vertexLowpFloat.setIEEEFloat(); - caps->fragmentHighpFloat.setIEEEFloat(); - caps->fragmentMediumpFloat.setIEEEFloat(); - caps->fragmentLowpFloat.setIEEEFloat(); - - // Some (most) hardware only supports single-precision floating-point numbers, - // which can accurately represent integers up to +/-16777216 - caps->vertexHighpInt.setSimulatedInt(24); - caps->vertexMediumpInt.setSimulatedInt(24); - caps->vertexLowpInt.setSimulatedInt(24); - caps->fragmentHighpInt.setSimulatedInt(24); - caps->fragmentMediumpInt.setSimulatedInt(24); - caps->fragmentLowpInt.setSimulatedInt(24); - - // WaitSync is ES3-only, set to zero - caps->maxServerWaitTimeout = 0; - - // Vertex shader limits - caps->maxVertexAttributes = 16; - // Vertex Attrib Binding not supported. - caps->maxVertexAttribBindings = caps->maxVertexAttributes; - - const size_t MAX_VERTEX_CONSTANT_VECTORS_D3D9 = 256; - caps->maxVertexUniformVectors = - MAX_VERTEX_CONSTANT_VECTORS_D3D9 - GetReservedVertexUniformVectors(); - caps->maxVertexUniformComponents = caps->maxVertexUniformVectors * 4; - - caps->maxVertexUniformBlocks = 0; - - // SM3 only supports 11 output variables, with a special 12th register for PSIZE. - const size_t MAX_VERTEX_OUTPUT_VECTORS_SM3 = 9; - const size_t MAX_VERTEX_OUTPUT_VECTORS_SM2 = 7; - caps->maxVertexOutputComponents = ((deviceCaps.VertexShaderVersion >= D3DVS_VERSION(3, 0)) ? MAX_VERTEX_OUTPUT_VECTORS_SM3 - : MAX_VERTEX_OUTPUT_VECTORS_SM2) * 4; - - // Only Direct3D 10 ready devices support all the necessary vertex texture formats. - // We test this using D3D9 by checking support for the R16F format. - if (deviceCaps.VertexShaderVersion >= D3DVS_VERSION(3, 0) && - SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, currentDisplayMode.Format, - D3DUSAGE_QUERY_VERTEXTEXTURE, D3DRTYPE_TEXTURE, D3DFMT_R16F))) - { - const size_t MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 = 4; - caps->maxVertexTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS_VTF_SM3; - } - else - { - caps->maxVertexTextureImageUnits = 0; - } - - // Fragment shader limits - const size_t MAX_PIXEL_CONSTANT_VECTORS_SM3 = 224; - const size_t MAX_PIXEL_CONSTANT_VECTORS_SM2 = 32; - caps->maxFragmentUniformVectors = - ((deviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0)) ? MAX_PIXEL_CONSTANT_VECTORS_SM3 - : MAX_PIXEL_CONSTANT_VECTORS_SM2) - - GetReservedFragmentUniformVectors(); - caps->maxFragmentUniformComponents = caps->maxFragmentUniformVectors * 4; - caps->maxFragmentUniformBlocks = 0; - caps->maxFragmentInputComponents = caps->maxVertexOutputComponents; - caps->maxTextureImageUnits = 16; - caps->minProgramTexelOffset = 0; - caps->maxProgramTexelOffset = 0; - - // Aggregate shader limits (unused in ES2) - caps->maxUniformBufferBindings = 0; - caps->maxUniformBlockSize = 0; - caps->uniformBufferOffsetAlignment = 0; - caps->maxCombinedUniformBlocks = 0; - caps->maxCombinedVertexUniformComponents = 0; - caps->maxCombinedFragmentUniformComponents = 0; - caps->maxVaryingComponents = 0; - - // Aggregate shader limits - caps->maxVaryingVectors = caps->maxVertexOutputComponents / 4; - caps->maxCombinedTextureImageUnits = caps->maxVertexTextureImageUnits + caps->maxTextureImageUnits; - - // Transform feedback limits - caps->maxTransformFeedbackInterleavedComponents = 0; - caps->maxTransformFeedbackSeparateAttributes = 0; - caps->maxTransformFeedbackSeparateComponents = 0; - - // Multisample limits - caps->maxSamples = maxSamples; - - // GL extension support - extensions->setTextureExtensionSupport(*textureCapsMap); - extensions->elementIndexUint = deviceCaps.MaxVertexIndex >= (1 << 16); - extensions->getProgramBinary = true; - extensions->rgb8rgba8 = true; - extensions->readFormatBGRA = true; - extensions->pixelBufferObject = false; - extensions->mapBuffer = false; - extensions->mapBufferRange = false; - - // textureRG is emulated and not performant. - extensions->textureRG = false; - - D3DADAPTER_IDENTIFIER9 adapterId = {}; - if (SUCCEEDED(d3d9->GetAdapterIdentifier(adapter, 0, &adapterId))) - { - // ATI cards on XP have problems with non-power-of-two textures. - extensions->textureNPOT = !(deviceCaps.TextureCaps & D3DPTEXTURECAPS_POW2) && - !(deviceCaps.TextureCaps & D3DPTEXTURECAPS_CUBEMAP_POW2) && - !(deviceCaps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) && - !(!isWindowsVistaOrGreater() && IsAMD(adapterId.VendorId)); - - // Disable depth texture support on AMD cards (See ANGLE issue 839) - if (IsAMD(adapterId.VendorId)) - { - extensions->depthTextures = false; - } - } - else - { - extensions->textureNPOT = false; - } - - extensions->drawBuffers = false; - extensions->textureStorage = true; - - // Must support a minimum of 2:1 anisotropy for max anisotropy to be considered supported, per the spec - extensions->textureFilterAnisotropic = (deviceCaps.RasterCaps & D3DPRASTERCAPS_ANISOTROPY) != 0 && deviceCaps.MaxAnisotropy >= 2; - extensions->maxTextureAnisotropy = static_cast<GLfloat>(deviceCaps.MaxAnisotropy); - - // Check occlusion query support by trying to create one - IDirect3DQuery9 *occlusionQuery = nullptr; - extensions->occlusionQueryBoolean = SUCCEEDED(device->CreateQuery(D3DQUERYTYPE_OCCLUSION, &occlusionQuery)) && occlusionQuery; - SafeRelease(occlusionQuery); - - // Check event query support by trying to create one - IDirect3DQuery9 *eventQuery = nullptr; - extensions->fence = SUCCEEDED(device->CreateQuery(D3DQUERYTYPE_EVENT, &eventQuery)) && eventQuery; - SafeRelease(eventQuery); - - extensions->disjointTimerQuery = false; - extensions->robustness = true; - // It seems that only DirectX 10 and higher enforce the well-defined behavior of always - // returning zero values when out-of-bounds reads. See - // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_robustness.txt - extensions->robustBufferAccessBehavior = false; - extensions->blendMinMax = true; - extensions->framebufferBlit = true; - extensions->framebufferMultisample = true; - extensions->instancedArrays = deviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0); - extensions->packReverseRowOrder = true; - extensions->standardDerivatives = (deviceCaps.PS20Caps.Caps & D3DPS20CAPS_GRADIENTINSTRUCTIONS) != 0; - extensions->shaderTextureLOD = true; - extensions->fragDepth = true; - extensions->textureUsage = true; - extensions->translatedShaderSource = true; - extensions->fboRenderMipmap = false; - extensions->discardFramebuffer = false; // It would be valid to set this to true, since glDiscardFramebufferEXT is just a hint - extensions->colorBufferFloat = false; - extensions->debugMarker = true; - extensions->eglImage = true; - extensions->eglImageExternal = true; - extensions->unpackSubimage = true; - extensions->packSubimage = true; - extensions->syncQuery = extensions->fence; - extensions->copyTexture = true; - - // D3D9 has no concept of separate masks and refs for front and back faces in the depth stencil - // state. - limitations->noSeparateStencilRefsAndMasks = true; - - // D3D9 shader models have limited support for looping, so the Appendix A - // index/loop limitations are necessary. Workarounds that are needed to - // support dynamic indexing of vectors on HLSL also don't work on D3D9. - limitations->shadersRequireIndexedLoopValidation = true; - - // D3D9 cannot support constant color and alpha blend funcs together - limitations->noSimultaneousConstantColorAndAlphaBlendFunc = true; -} - -} - -namespace d3d9 -{ - -GLuint ComputeBlockSize(D3DFORMAT format, GLuint width, GLuint height) -{ - const D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(format); - GLuint numBlocksWide = (width + d3dFormatInfo.blockWidth - 1) / d3dFormatInfo.blockWidth; - GLuint numBlocksHight = (height + d3dFormatInfo.blockHeight - 1) / d3dFormatInfo.blockHeight; - return (d3dFormatInfo.pixelBytes * numBlocksWide * numBlocksHight); -} - -void MakeValidSize(bool isImage, D3DFORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset) -{ - const D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(format); - - int upsampleCount = 0; - // Don't expand the size of full textures that are at least (blockWidth x blockHeight) already. - if (isImage || *requestWidth < static_cast<GLsizei>(d3dFormatInfo.blockWidth) || - *requestHeight < static_cast<GLsizei>(d3dFormatInfo.blockHeight)) - { - while (*requestWidth % d3dFormatInfo.blockWidth != 0 || *requestHeight % d3dFormatInfo.blockHeight != 0) - { - *requestWidth <<= 1; - *requestHeight <<= 1; - upsampleCount++; - } - } - *levelOffset = upsampleCount; -} - -angle::WorkaroundsD3D GenerateWorkarounds() -{ - angle::WorkaroundsD3D workarounds; - workarounds.mrtPerfWorkaround = true; - workarounds.setDataFasterThanImageUpload = false; - workarounds.useInstancedPointSpriteEmulation = false; - - // TODO(jmadill): Disable workaround when we have a fixed compiler DLL. - workarounds.expandIntegerPowExpressions = true; - - // Call platform hooks for testing overrides. - auto *platform = ANGLEPlatformCurrent(); - platform->overrideWorkaroundsD3D(platform, &workarounds); - - return workarounds; -} - -} // namespace d3d9 - -} // namespace rx diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h deleted file mode 100644 index 5b65b8910a..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h +++ /dev/null @@ -1,95 +0,0 @@ -// -// Copyright (c) 2002-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. -// - -// renderer9_utils.h: Conversion functions and other utility routines -// specific to the D3D9 renderer - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_RENDERER9UTILS_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_RENDERER9UTILS_H_ - -#include "common/Color.h" -#include "libANGLE/Caps.h" -#include "libANGLE/Error.h" -#include "platform/WorkaroundsD3D.h" - -namespace gl -{ -class FramebufferAttachment; -} - -namespace rx -{ -class RenderTarget9; - -namespace gl_d3d9 -{ - -D3DCMPFUNC ConvertComparison(GLenum comparison); -D3DCOLOR ConvertColor(gl::ColorF color); -D3DBLEND ConvertBlendFunc(GLenum blend); -D3DBLENDOP ConvertBlendOp(GLenum blendOp); -D3DSTENCILOP ConvertStencilOp(GLenum stencilOp); -D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap); -D3DCULL ConvertCullMode(gl::CullFaceMode cullFace, GLenum frontFace); -D3DCUBEMAP_FACES ConvertCubeFace(GLenum cubeFace); -DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha); -D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter, float maxAnisotropy); -void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter, - float *d3dLodBias, float maxAnisotropy, size_t baseLevel); -D3DQUERYTYPE ConvertQueryType(GLenum queryType); - -D3DMULTISAMPLE_TYPE GetMultisampleType(GLuint samples); - -} - -namespace d3d9_gl -{ - -unsigned int GetReservedVertexUniformVectors(); - -unsigned int GetReservedFragmentUniformVectors(); - -GLsizei GetSamplesCount(D3DMULTISAMPLE_TYPE type); - -bool IsFormatChannelEquivalent(D3DFORMAT d3dformat, GLenum format); - -void GenerateCaps(IDirect3D9 *d3d9, - IDirect3DDevice9 *device, - D3DDEVTYPE deviceType, - UINT adapter, - gl::Caps *caps, - gl::TextureCapsMap *textureCapsMap, - gl::Extensions *extensions, - gl::Limitations *limitations); -} - -namespace d3d9 -{ - -GLuint ComputeBlockSize(D3DFORMAT format, GLuint width, GLuint height); - -void MakeValidSize(bool isImage, D3DFORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset); - -inline bool isDeviceLostError(HRESULT errorCode) -{ - switch (errorCode) - { - case D3DERR_DRIVERINTERNALERROR: - case D3DERR_DEVICELOST: - case D3DERR_DEVICEHUNG: - case D3DERR_DEVICEREMOVED: - return true; - default: - return false; - } -} - -angle::WorkaroundsD3D GenerateWorkarounds(); -} - -} // namespace d3d9 - -#endif // LIBANGLE_RENDERER_D3D_D3D9_RENDERER9UTILS_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.ps b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.ps deleted file mode 100644 index ecc593cc78..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.ps +++ /dev/null @@ -1,67 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -sampler2D tex : s0; - -uniform float4 mult : c0; -uniform float4 add : c1; - -// Passthrough Pixel Shader -// Outputs texture 0 sampled at texcoord 0. -float4 passthroughps(float4 texcoord : TEXCOORD0) : COLOR -{ - return tex2D(tex, texcoord.xy); -}; - -// Luminance Conversion Pixel Shader -// Performs a mad operation using the LA data from the texture with mult.xw and add.xw. -// Returns data in the form of llla -float4 luminanceps(float4 texcoord : TEXCOORD0) : COLOR -{ - return (tex2D(tex, texcoord.xy).xw * mult.xw + add.xw).xxxy; -}; - -float4 luminancepremultps(float4 texcoord : TEXCOORD0) : COLOR -{ - float4 luma = tex2D(tex, texcoord.xy).xxxw; - luma.rgb *= luma.a; - return luma * mult + add; -}; - -float4 luminanceunmultps(float4 texcoord : TEXCOORD0) : COLOR -{ - float4 luma = tex2D(tex, texcoord.xy).xxxw; - if (luma.a > 0.0f) - { - luma.rgb /= luma.a; - } - return luma * mult + add; -}; - -// RGB/A Component Mask Pixel Shader -// Performs a mad operation using the texture's RGBA data with mult.xyzw and add.xyzw. -// Returns data in the form of rgba -float4 componentmaskps(float4 texcoord : TEXCOORD0) : COLOR -{ - return tex2D(tex, texcoord.xy) * mult + add; -}; - -float4 componentmaskpremultps(float4 texcoord : TEXCOORD0) : COLOR -{ - float4 color = tex2D(tex, texcoord.xy); - color.rgb *= color.a; - return color * mult + add; -}; - -float4 componentmaskunmultps(float4 texcoord : TEXCOORD0) : COLOR -{ - float4 color = tex2D(tex, texcoord.xy); - if (color.a > 0.0f) - { - color.rgb /= color.a; - } - return color * mult + add; -}; diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.vs b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.vs deleted file mode 100644 index c68395a69c..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.vs +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright (c) 2012 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. -// - -struct VS_OUTPUT -{ - float4 position : POSITION; - float4 texcoord : TEXCOORD0; -}; - -uniform float4 halfPixelSize : c0; -uniform float4 texcoordOffset : c1; - -// Standard Vertex Shader -// Input 0 is the homogenous position. -// Outputs the homogenous position as-is. -// Outputs a tex coord with (0,0) in the upper-left corner of the screen and (1,1) in the bottom right. -// C0.X must be negative half-pixel width, C0.Y must be half-pixel height. C0.ZW must be 0. -VS_OUTPUT standardvs(in float4 position : POSITION) -{ - VS_OUTPUT Out; - - Out.position = position + halfPixelSize; - Out.texcoord = ((position * float4(0.5, -0.5, 1.0, 1.0) + float4(0.5, 0.5, 0, 0)) * float4(texcoordOffset.zw, 1.0, 1.0)) + float4(texcoordOffset.xy, 0, 0); - - return Out; -}; diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h deleted file mode 100644 index aa05934bc8..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h +++ /dev/null @@ -1,200 +0,0 @@ -// -// Copyright (c) 2002-2010 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. -// - -// vertexconversion.h: A library of vertex conversion classes that can be used to build -// the FormatConverter objects used by the buffer conversion system. - -#ifndef LIBANGLE_RENDERER_D3D_D3D9_VERTEXCONVERSION_H_ -#define LIBANGLE_RENDERER_D3D_D3D9_VERTEXCONVERSION_H_ - -#include <limits> -#include <cstdint> -#include <cstddef> - -namespace rx -{ - -// Conversion types: -// static const bool identity: true if this is an identity transform, false otherwise -// static U convert(T): convert a single element from the input type to the output type -// typedef ... OutputType: the type produced by this conversion - -template <class T> -struct Identity -{ - static const bool identity = true; - - typedef T OutputType; - - static T convert(T x) - { - return x; - } -}; - -template <class FromT, class ToT> -struct Cast -{ - static const bool identity = false; - - typedef ToT OutputType; - - static ToT convert(FromT x) - { - return static_cast<ToT>(x); - } -}; - -template <class T> -struct Cast<T, T> -{ - static const bool identity = true; - - typedef T OutputType; - - static T convert(T x) - { - return static_cast<T>(x); - } -}; - -template <class T> -struct Normalize -{ - static const bool identity = false; - - typedef float OutputType; - - static float convert(T x) - { - typedef std::numeric_limits<T> NL; - float f = static_cast<float>(x); - - if (NL::is_signed) - { - // const float => VC2008 computes it at compile time - // static const float => VC2008 computes it the first time we get here, stores it to memory with static guard and all that. - const float divisor = 1.0f/(2*static_cast<float>(NL::max())+1); - return (2*f+1)*divisor; - } - else - { - return f/NL::max(); - } - } -}; - -template <class FromType, std::size_t ScaleBits> -struct FixedToFloat -{ - static const bool identity = false; - - typedef float OutputType; - - static float convert(FromType x) - { - const float divisor = 1.0f / static_cast<float>(static_cast<FromType>(1) << ScaleBits); - return static_cast<float>(x) * divisor; - } -}; - -// Widen types: -// static const unsigned int initialWidth: number of components before conversion -// static const unsigned int finalWidth: number of components after conversion - -// Float is supported at any size. -template <std::size_t N> -struct NoWiden -{ - static const std::size_t initialWidth = N; - static const std::size_t finalWidth = N; -}; - -// SHORT, norm-SHORT, norm-UNSIGNED_SHORT are supported but only with 2 or 4 components -template <std::size_t N> -struct WidenToEven -{ - static const std::size_t initialWidth = N; - static const std::size_t finalWidth = N+(N&1); -}; - -template <std::size_t N> -struct WidenToFour -{ - static const std::size_t initialWidth = N; - static const std::size_t finalWidth = 4; -}; - -// Most types have 0 and 1 that are just that. -template <class T> -struct SimpleDefaultValues -{ - static T zero() { return static_cast<T>(0); } - static T one() { return static_cast<T>(1); } -}; - -// But normalised types only store [0,1] or [-1,1] so 1.0 is represented by the max value. -template <class T> -struct NormalizedDefaultValues -{ - static T zero() { return static_cast<T>(0); } - static T one() { return std::numeric_limits<T>::max(); } -}; - -// Converter: -// static const bool identity: true if this is an identity transform (with no widening) -// static const std::size_t finalSize: number of bytes per output vertex -// static void convertArray(const void *in, std::size_t stride, std::size_t n, void *out): convert an array of vertices. Input may be strided, but output will be unstrided. - -template <class InT, - class WidenRule, - class Converter, - class DefaultValueRule = SimpleDefaultValues<InT>> -struct VertexDataConverter -{ - typedef typename Converter::OutputType OutputType; - typedef InT InputType; - - static const bool identity = (WidenRule::initialWidth == WidenRule::finalWidth) && Converter::identity; - static const std::size_t finalSize = WidenRule::finalWidth * sizeof(OutputType); - - static void convertArray(const uint8_t *input, size_t stride, size_t n, uint8_t *output) - { - OutputType *out = reinterpret_cast<OutputType*>(output); - - for (std::size_t i = 0; i < n; i++) - { - const InputType *ein = reinterpret_cast<const InputType*>(input + i * stride); - - copyComponent(out, ein, 0, static_cast<OutputType>(DefaultValueRule::zero())); - copyComponent(out, ein, 1, static_cast<OutputType>(DefaultValueRule::zero())); - copyComponent(out, ein, 2, static_cast<OutputType>(DefaultValueRule::zero())); - copyComponent(out, ein, 3, static_cast<OutputType>(DefaultValueRule::one())); - - out += WidenRule::finalWidth; - } - } - - private: - static void copyComponent(OutputType *out, const InputType *in, std::size_t elementindex, OutputType defaultvalue) - { - if (WidenRule::finalWidth > elementindex) - { - if (WidenRule::initialWidth > elementindex) - { - out[elementindex] = Converter::convert(in[elementindex]); - } - else - { - out[elementindex] = defaultvalue; - } - } - } -}; - -} - -#endif // LIBANGLE_RENDERER_D3D_D3D9_VERTEXCONVERSION_H_ diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/formatutilsD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/formatutilsD3D.h deleted file mode 100644 index a245a0432f..0000000000 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/formatutilsD3D.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// Copyright (c) 2015 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. -// - -// formatutils9.h: Queries for GL image formats and their translations to D3D -// formats. - -#ifndef LIBANGLE_RENDERER_D3D_FORMATUTILSD3D_H_ -#define LIBANGLE_RENDERER_D3D_FORMATUTILSD3D_H_ - -#include "angle_gl.h" - -#include <cstddef> -#include <stdint.h> - -#include <map> - -namespace gl -{ -struct FormatType; -} - -namespace rx -{ -typedef void (*VertexCopyFunction)(const uint8_t *input, size_t stride, size_t count, uint8_t *output); - -enum VertexConversionType -{ - VERTEX_CONVERT_NONE = 0, - VERTEX_CONVERT_CPU = 1, - VERTEX_CONVERT_GPU = 2, - VERTEX_CONVERT_BOTH = 3 -}; -} // namespace rx - -#endif // LIBANGLE_RENDERER_D3D_FORMATUTILSD3D_H_ |