1*8975f5c5SAndroid Build Coastguard Worker 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker // RendererD3D.h: Defines a back-end specific class for the DirectX renderer. 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_D3D_RENDERERD3D_H_ 10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_D3D_RENDERERD3D_H_ 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker #include <array> 13*8975f5c5SAndroid Build Coastguard Worker 14*8975f5c5SAndroid Build Coastguard Worker #include "common/Color.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "common/MemoryBuffer.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Device.h" 18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/State.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Version.h" 20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h" 21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/formatutils.h" 22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/ShaderD3D.h" 23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/VertexDataManager.h" 24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/formatutilsD3D.h" 25*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/renderer_utils.h" 26*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/serial_utils.h" 27*8975f5c5SAndroid Build Coastguard Worker #include "platform/autogen/FeaturesD3D_autogen.h" 28*8975f5c5SAndroid Build Coastguard Worker 29*8975f5c5SAndroid Build Coastguard Worker namespace egl 30*8975f5c5SAndroid Build Coastguard Worker { 31*8975f5c5SAndroid Build Coastguard Worker class ConfigSet; 32*8975f5c5SAndroid Build Coastguard Worker } 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker namespace gl 35*8975f5c5SAndroid Build Coastguard Worker { 36*8975f5c5SAndroid Build Coastguard Worker class ErrorSet; 37*8975f5c5SAndroid Build Coastguard Worker class FramebufferState; 38*8975f5c5SAndroid Build Coastguard Worker class InfoLog; 39*8975f5c5SAndroid Build Coastguard Worker class Texture; 40*8975f5c5SAndroid Build Coastguard Worker struct LinkedVarying; 41*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard Worker namespace rx 44*8975f5c5SAndroid Build Coastguard Worker { 45*8975f5c5SAndroid Build Coastguard Worker class ContextImpl; 46*8975f5c5SAndroid Build Coastguard Worker struct D3DUniform; 47*8975f5c5SAndroid Build Coastguard Worker struct D3DVarying; 48*8975f5c5SAndroid Build Coastguard Worker class EGLImageD3D; 49*8975f5c5SAndroid Build Coastguard Worker class FramebufferImpl; 50*8975f5c5SAndroid Build Coastguard Worker class ImageD3D; 51*8975f5c5SAndroid Build Coastguard Worker class IndexBuffer; 52*8975f5c5SAndroid Build Coastguard Worker class NativeWindowD3D; 53*8975f5c5SAndroid Build Coastguard Worker class ProgramD3D; 54*8975f5c5SAndroid Build Coastguard Worker class ProgramExecutableD3D; 55*8975f5c5SAndroid Build Coastguard Worker class RenderTargetD3D; 56*8975f5c5SAndroid Build Coastguard Worker class ShaderExecutableD3D; 57*8975f5c5SAndroid Build Coastguard Worker class SwapChainD3D; 58*8975f5c5SAndroid Build Coastguard Worker class TextureStorage; 59*8975f5c5SAndroid Build Coastguard Worker struct TranslatedIndexData; 60*8975f5c5SAndroid Build Coastguard Worker class UniformStorageD3D; 61*8975f5c5SAndroid Build Coastguard Worker class VertexBuffer; 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker struct DeviceIdentifier 64*8975f5c5SAndroid Build Coastguard Worker { 65*8975f5c5SAndroid Build Coastguard Worker UINT VendorId; 66*8975f5c5SAndroid Build Coastguard Worker UINT DeviceId; 67*8975f5c5SAndroid Build Coastguard Worker UINT SubSysId; 68*8975f5c5SAndroid Build Coastguard Worker UINT Revision; 69*8975f5c5SAndroid Build Coastguard Worker UINT FeatureLevel; 70*8975f5c5SAndroid Build Coastguard Worker }; 71*8975f5c5SAndroid Build Coastguard Worker 72*8975f5c5SAndroid Build Coastguard Worker enum RendererClass 73*8975f5c5SAndroid Build Coastguard Worker { 74*8975f5c5SAndroid Build Coastguard Worker RENDERER_D3D11, 75*8975f5c5SAndroid Build Coastguard Worker RENDERER_D3D9 76*8975f5c5SAndroid Build Coastguard Worker }; 77*8975f5c5SAndroid Build Coastguard Worker 78*8975f5c5SAndroid Build Coastguard Worker struct BindFlags 79*8975f5c5SAndroid Build Coastguard Worker { 80*8975f5c5SAndroid Build Coastguard Worker bool renderTarget = false; 81*8975f5c5SAndroid Build Coastguard Worker bool unorderedAccess = false; RenderTargetBindFlags82*8975f5c5SAndroid Build Coastguard Worker static BindFlags RenderTarget() 83*8975f5c5SAndroid Build Coastguard Worker { 84*8975f5c5SAndroid Build Coastguard Worker BindFlags flags; 85*8975f5c5SAndroid Build Coastguard Worker flags.renderTarget = true; 86*8975f5c5SAndroid Build Coastguard Worker return flags; 87*8975f5c5SAndroid Build Coastguard Worker } UnorderedAccessBindFlags88*8975f5c5SAndroid Build Coastguard Worker static BindFlags UnorderedAccess() 89*8975f5c5SAndroid Build Coastguard Worker { 90*8975f5c5SAndroid Build Coastguard Worker BindFlags flags; 91*8975f5c5SAndroid Build Coastguard Worker flags.unorderedAccess = true; 92*8975f5c5SAndroid Build Coastguard Worker return flags; 93*8975f5c5SAndroid Build Coastguard Worker } 94*8975f5c5SAndroid Build Coastguard Worker }; 95*8975f5c5SAndroid Build Coastguard Worker 96*8975f5c5SAndroid Build Coastguard Worker // A d3d::Context wraps error handling. 97*8975f5c5SAndroid Build Coastguard Worker namespace d3d 98*8975f5c5SAndroid Build Coastguard Worker { 99*8975f5c5SAndroid Build Coastguard Worker class Context : angle::NonCopyable 100*8975f5c5SAndroid Build Coastguard Worker { 101*8975f5c5SAndroid Build Coastguard Worker public: Context()102*8975f5c5SAndroid Build Coastguard Worker Context() {} ~Context()103*8975f5c5SAndroid Build Coastguard Worker virtual ~Context() {} 104*8975f5c5SAndroid Build Coastguard Worker 105*8975f5c5SAndroid Build Coastguard Worker virtual void handleResult(HRESULT hr, 106*8975f5c5SAndroid Build Coastguard Worker const char *message, 107*8975f5c5SAndroid Build Coastguard Worker const char *file, 108*8975f5c5SAndroid Build Coastguard Worker const char *function, 109*8975f5c5SAndroid Build Coastguard Worker unsigned int line) = 0; 110*8975f5c5SAndroid Build Coastguard Worker }; 111*8975f5c5SAndroid Build Coastguard Worker } // namespace d3d 112*8975f5c5SAndroid Build Coastguard Worker 113*8975f5c5SAndroid Build Coastguard Worker // ANGLE_TRY for HRESULT errors. 114*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_TRY_HR(CONTEXT, EXPR, MESSAGE) \ 115*8975f5c5SAndroid Build Coastguard Worker do \ 116*8975f5c5SAndroid Build Coastguard Worker { \ 117*8975f5c5SAndroid Build Coastguard Worker auto ANGLE_LOCAL_VAR = (EXPR); \ 118*8975f5c5SAndroid Build Coastguard Worker if (ANGLE_UNLIKELY(FAILED(ANGLE_LOCAL_VAR))) \ 119*8975f5c5SAndroid Build Coastguard Worker { \ 120*8975f5c5SAndroid Build Coastguard Worker CONTEXT->handleResult(ANGLE_LOCAL_VAR, MESSAGE, __FILE__, ANGLE_FUNCTION, __LINE__); \ 121*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Stop; \ 122*8975f5c5SAndroid Build Coastguard Worker } \ 123*8975f5c5SAndroid Build Coastguard Worker } while (0) 124*8975f5c5SAndroid Build Coastguard Worker 125*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_CHECK_HR(CONTEXT, EXPR, MESSAGE, ERROR) \ 126*8975f5c5SAndroid Build Coastguard Worker do \ 127*8975f5c5SAndroid Build Coastguard Worker { \ 128*8975f5c5SAndroid Build Coastguard Worker if (ANGLE_UNLIKELY(!(EXPR))) \ 129*8975f5c5SAndroid Build Coastguard Worker { \ 130*8975f5c5SAndroid Build Coastguard Worker CONTEXT->handleResult(ERROR, MESSAGE, __FILE__, ANGLE_FUNCTION, __LINE__); \ 131*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Stop; \ 132*8975f5c5SAndroid Build Coastguard Worker } \ 133*8975f5c5SAndroid Build Coastguard Worker } while (0) 134*8975f5c5SAndroid Build Coastguard Worker 135*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HR_UNREACHABLE(context) \ 136*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE(); \ 137*8975f5c5SAndroid Build Coastguard Worker ANGLE_CHECK_HR(context, false, "Unreachble code reached.", E_FAIL) 138*8975f5c5SAndroid Build Coastguard Worker 139*8975f5c5SAndroid Build Coastguard Worker // Check if the device is lost every 10 failures to get the query data 140*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kPollingD3DDeviceLostCheckFrequency = 10; 141*8975f5c5SAndroid Build Coastguard Worker 142*8975f5c5SAndroid Build Coastguard Worker // Useful for unit testing 143*8975f5c5SAndroid Build Coastguard Worker class BufferFactoryD3D : angle::NonCopyable 144*8975f5c5SAndroid Build Coastguard Worker { 145*8975f5c5SAndroid Build Coastguard Worker public: BufferFactoryD3D()146*8975f5c5SAndroid Build Coastguard Worker BufferFactoryD3D() {} ~BufferFactoryD3D()147*8975f5c5SAndroid Build Coastguard Worker virtual ~BufferFactoryD3D() {} 148*8975f5c5SAndroid Build Coastguard Worker 149*8975f5c5SAndroid Build Coastguard Worker virtual VertexBuffer *createVertexBuffer() = 0; 150*8975f5c5SAndroid Build Coastguard Worker virtual IndexBuffer *createIndexBuffer() = 0; 151*8975f5c5SAndroid Build Coastguard Worker 152*8975f5c5SAndroid Build Coastguard Worker // TODO(jmadill): add VertexFormatCaps 153*8975f5c5SAndroid Build Coastguard Worker virtual VertexConversionType getVertexConversionType(angle::FormatID vertexFormatID) const = 0; 154*8975f5c5SAndroid Build Coastguard Worker virtual GLenum getVertexComponentType(angle::FormatID vertexFormatID) const = 0; 155*8975f5c5SAndroid Build Coastguard Worker 156*8975f5c5SAndroid Build Coastguard Worker // Warning: you should ensure binding really matches attrib.bindingIndex before using this 157*8975f5c5SAndroid Build Coastguard Worker // function. 158*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result getVertexSpaceRequired(const gl::Context *context, 159*8975f5c5SAndroid Build Coastguard Worker const gl::VertexAttribute &attrib, 160*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding, 161*8975f5c5SAndroid Build Coastguard Worker size_t count, 162*8975f5c5SAndroid Build Coastguard Worker GLsizei instances, 163*8975f5c5SAndroid Build Coastguard Worker GLuint baseInstance, 164*8975f5c5SAndroid Build Coastguard Worker unsigned int *bytesRequiredOut) const = 0; 165*8975f5c5SAndroid Build Coastguard Worker }; 166*8975f5c5SAndroid Build Coastguard Worker 167*8975f5c5SAndroid Build Coastguard Worker using AttribIndexArray = gl::AttribArray<int>; 168*8975f5c5SAndroid Build Coastguard Worker 169*8975f5c5SAndroid Build Coastguard Worker class RendererD3D : public BufferFactoryD3D 170*8975f5c5SAndroid Build Coastguard Worker { 171*8975f5c5SAndroid Build Coastguard Worker public: 172*8975f5c5SAndroid Build Coastguard Worker explicit RendererD3D(egl::Display *display); 173*8975f5c5SAndroid Build Coastguard Worker ~RendererD3D() override; 174*8975f5c5SAndroid Build Coastguard Worker 175*8975f5c5SAndroid Build Coastguard Worker virtual egl::Error initialize() = 0; 176*8975f5c5SAndroid Build Coastguard Worker 177*8975f5c5SAndroid Build Coastguard Worker virtual egl::ConfigSet generateConfigs() = 0; 178*8975f5c5SAndroid Build Coastguard Worker virtual void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const = 0; 179*8975f5c5SAndroid Build Coastguard Worker 180*8975f5c5SAndroid Build Coastguard Worker virtual ContextImpl *createContext(const gl::State &state, gl::ErrorSet *errorSet) = 0; 181*8975f5c5SAndroid Build Coastguard Worker 182*8975f5c5SAndroid Build Coastguard Worker virtual std::string getRendererDescription() const = 0; 183*8975f5c5SAndroid Build Coastguard Worker virtual std::string getVendorString() const = 0; 184*8975f5c5SAndroid Build Coastguard Worker virtual std::string getVersionString(bool includeFullVersion) const = 0; 185*8975f5c5SAndroid Build Coastguard Worker 186*8975f5c5SAndroid Build Coastguard Worker virtual int getMinorShaderModel() const = 0; 187*8975f5c5SAndroid Build Coastguard Worker virtual std::string getShaderModelSuffix() const = 0; 188*8975f5c5SAndroid Build Coastguard Worker 189*8975f5c5SAndroid Build Coastguard Worker // Direct3D Specific methods 190*8975f5c5SAndroid Build Coastguard Worker virtual DeviceIdentifier getAdapterIdentifier() const = 0; 191*8975f5c5SAndroid Build Coastguard Worker 192*8975f5c5SAndroid Build Coastguard Worker virtual bool isValidNativeWindow(EGLNativeWindowType window) const = 0; 193*8975f5c5SAndroid Build Coastguard Worker virtual NativeWindowD3D *createNativeWindow(EGLNativeWindowType window, 194*8975f5c5SAndroid Build Coastguard Worker const egl::Config *config, 195*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) const = 0; 196*8975f5c5SAndroid Build Coastguard Worker 197*8975f5c5SAndroid Build Coastguard Worker virtual SwapChainD3D *createSwapChain(NativeWindowD3D *nativeWindow, 198*8975f5c5SAndroid Build Coastguard Worker HANDLE shareHandle, 199*8975f5c5SAndroid Build Coastguard Worker IUnknown *d3dTexture, 200*8975f5c5SAndroid Build Coastguard Worker GLenum backBufferFormat, 201*8975f5c5SAndroid Build Coastguard Worker GLenum depthBufferFormat, 202*8975f5c5SAndroid Build Coastguard Worker EGLint orientation, 203*8975f5c5SAndroid Build Coastguard Worker EGLint samples) = 0; 204*8975f5c5SAndroid Build Coastguard Worker virtual egl::Error getD3DTextureInfo(const egl::Config *configuration, 205*8975f5c5SAndroid Build Coastguard Worker IUnknown *d3dTexture, 206*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs, 207*8975f5c5SAndroid Build Coastguard Worker EGLint *width, 208*8975f5c5SAndroid Build Coastguard Worker EGLint *height, 209*8975f5c5SAndroid Build Coastguard Worker GLsizei *samples, 210*8975f5c5SAndroid Build Coastguard Worker gl::Format *glFormat, 211*8975f5c5SAndroid Build Coastguard Worker const angle::Format **angleFormat, 212*8975f5c5SAndroid Build Coastguard Worker UINT *arraySlice) const = 0; 213*8975f5c5SAndroid Build Coastguard Worker virtual egl::Error validateShareHandle(const egl::Config *config, 214*8975f5c5SAndroid Build Coastguard Worker HANDLE shareHandle, 215*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) const = 0; 216*8975f5c5SAndroid Build Coastguard Worker 217*8975f5c5SAndroid Build Coastguard Worker virtual int getMajorShaderModel() const = 0; 218*8975f5c5SAndroid Build Coastguard Worker 219*8975f5c5SAndroid Build Coastguard Worker virtual void setGlobalDebugAnnotator() = 0; 220*8975f5c5SAndroid Build Coastguard Worker 221*8975f5c5SAndroid Build Coastguard Worker const angle::FeaturesD3D &getFeatures() const; 222*8975f5c5SAndroid Build Coastguard Worker 223*8975f5c5SAndroid Build Coastguard Worker // Pixel operations 224*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyImage2D(const gl::Context *context, 225*8975f5c5SAndroid Build Coastguard Worker const gl::Framebuffer *framebuffer, 226*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceRect, 227*8975f5c5SAndroid Build Coastguard Worker GLenum destFormat, 228*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 229*8975f5c5SAndroid Build Coastguard Worker TextureStorage *storage, 230*8975f5c5SAndroid Build Coastguard Worker GLint level) = 0; 231*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyImageCube(const gl::Context *context, 232*8975f5c5SAndroid Build Coastguard Worker const gl::Framebuffer *framebuffer, 233*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceRect, 234*8975f5c5SAndroid Build Coastguard Worker GLenum destFormat, 235*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 236*8975f5c5SAndroid Build Coastguard Worker TextureStorage *storage, 237*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget target, 238*8975f5c5SAndroid Build Coastguard Worker GLint level) = 0; 239*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyImage3D(const gl::Context *context, 240*8975f5c5SAndroid Build Coastguard Worker const gl::Framebuffer *framebuffer, 241*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceRect, 242*8975f5c5SAndroid Build Coastguard Worker GLenum destFormat, 243*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 244*8975f5c5SAndroid Build Coastguard Worker TextureStorage *storage, 245*8975f5c5SAndroid Build Coastguard Worker GLint level) = 0; 246*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyImage2DArray(const gl::Context *context, 247*8975f5c5SAndroid Build Coastguard Worker const gl::Framebuffer *framebuffer, 248*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceRect, 249*8975f5c5SAndroid Build Coastguard Worker GLenum destFormat, 250*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 251*8975f5c5SAndroid Build Coastguard Worker TextureStorage *storage, 252*8975f5c5SAndroid Build Coastguard Worker GLint level) = 0; 253*8975f5c5SAndroid Build Coastguard Worker 254*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyTexture(const gl::Context *context, 255*8975f5c5SAndroid Build Coastguard Worker const gl::Texture *source, 256*8975f5c5SAndroid Build Coastguard Worker GLint sourceLevel, 257*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget srcTarget, 258*8975f5c5SAndroid Build Coastguard Worker const gl::Box &sourceBox, 259*8975f5c5SAndroid Build Coastguard Worker GLenum destFormat, 260*8975f5c5SAndroid Build Coastguard Worker GLenum destType, 261*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 262*8975f5c5SAndroid Build Coastguard Worker TextureStorage *storage, 263*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget destTarget, 264*8975f5c5SAndroid Build Coastguard Worker GLint destLevel, 265*8975f5c5SAndroid Build Coastguard Worker bool unpackFlipY, 266*8975f5c5SAndroid Build Coastguard Worker bool unpackPremultiplyAlpha, 267*8975f5c5SAndroid Build Coastguard Worker bool unpackUnmultiplyAlpha) = 0; 268*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyCompressedTexture(const gl::Context *context, 269*8975f5c5SAndroid Build Coastguard Worker const gl::Texture *source, 270*8975f5c5SAndroid Build Coastguard Worker GLint sourceLevel, 271*8975f5c5SAndroid Build Coastguard Worker TextureStorage *storage, 272*8975f5c5SAndroid Build Coastguard Worker GLint destLevel) = 0; 273*8975f5c5SAndroid Build Coastguard Worker 274*8975f5c5SAndroid Build Coastguard Worker // RenderTarget creation 275*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result createRenderTarget(const gl::Context *context, 276*8975f5c5SAndroid Build Coastguard Worker int width, 277*8975f5c5SAndroid Build Coastguard Worker int height, 278*8975f5c5SAndroid Build Coastguard Worker GLenum format, 279*8975f5c5SAndroid Build Coastguard Worker GLsizei samples, 280*8975f5c5SAndroid Build Coastguard Worker RenderTargetD3D **outRT) = 0; 281*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result createRenderTargetCopy(const gl::Context *context, 282*8975f5c5SAndroid Build Coastguard Worker RenderTargetD3D *source, 283*8975f5c5SAndroid Build Coastguard Worker RenderTargetD3D **outRT) = 0; 284*8975f5c5SAndroid Build Coastguard Worker 285*8975f5c5SAndroid Build Coastguard Worker // Shader operations 286*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result loadExecutable(d3d::Context *context, 287*8975f5c5SAndroid Build Coastguard Worker const uint8_t *function, 288*8975f5c5SAndroid Build Coastguard Worker size_t length, 289*8975f5c5SAndroid Build Coastguard Worker gl::ShaderType type, 290*8975f5c5SAndroid Build Coastguard Worker const std::vector<D3DVarying> &streamOutVaryings, 291*8975f5c5SAndroid Build Coastguard Worker bool separatedOutputBuffers, 292*8975f5c5SAndroid Build Coastguard Worker ShaderExecutableD3D **outExecutable) = 0; 293*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result compileToExecutable(d3d::Context *context, 294*8975f5c5SAndroid Build Coastguard Worker gl::InfoLog &infoLog, 295*8975f5c5SAndroid Build Coastguard Worker const std::string &shaderHLSL, 296*8975f5c5SAndroid Build Coastguard Worker gl::ShaderType type, 297*8975f5c5SAndroid Build Coastguard Worker const std::vector<D3DVarying> &streamOutVaryings, 298*8975f5c5SAndroid Build Coastguard Worker bool separatedOutputBuffers, 299*8975f5c5SAndroid Build Coastguard Worker const CompilerWorkaroundsD3D &workarounds, 300*8975f5c5SAndroid Build Coastguard Worker ShaderExecutableD3D **outExectuable) = 0; 301*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result ensureHLSLCompilerInitialized(d3d::Context *context) = 0; 302*8975f5c5SAndroid Build Coastguard Worker 303*8975f5c5SAndroid Build Coastguard Worker virtual UniformStorageD3D *createUniformStorage(size_t storageSize) = 0; 304*8975f5c5SAndroid Build Coastguard Worker 305*8975f5c5SAndroid Build Coastguard Worker // Image operations 306*8975f5c5SAndroid Build Coastguard Worker virtual ImageD3D *createImage() = 0; 307*8975f5c5SAndroid Build Coastguard Worker virtual ExternalImageSiblingImpl *createExternalImageSibling( 308*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context, 309*8975f5c5SAndroid Build Coastguard Worker EGLenum target, 310*8975f5c5SAndroid Build Coastguard Worker EGLClientBuffer buffer, 311*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) = 0; 312*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result generateMipmap(const gl::Context *context, 313*8975f5c5SAndroid Build Coastguard Worker ImageD3D *dest, 314*8975f5c5SAndroid Build Coastguard Worker ImageD3D *source) = 0; 315*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result generateMipmapUsingD3D(const gl::Context *context, 316*8975f5c5SAndroid Build Coastguard Worker TextureStorage *storage, 317*8975f5c5SAndroid Build Coastguard Worker const gl::TextureState &textureState) = 0; 318*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyImage(const gl::Context *context, 319*8975f5c5SAndroid Build Coastguard Worker ImageD3D *dest, 320*8975f5c5SAndroid Build Coastguard Worker ImageD3D *source, 321*8975f5c5SAndroid Build Coastguard Worker const gl::Box &sourceBox, 322*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 323*8975f5c5SAndroid Build Coastguard Worker bool unpackFlipY, 324*8975f5c5SAndroid Build Coastguard Worker bool unpackPremultiplyAlpha, 325*8975f5c5SAndroid Build Coastguard Worker bool unpackUnmultiplyAlpha) = 0; 326*8975f5c5SAndroid Build Coastguard Worker virtual TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain, 327*8975f5c5SAndroid Build Coastguard Worker const std::string &label) = 0; 328*8975f5c5SAndroid Build Coastguard Worker virtual TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage, 329*8975f5c5SAndroid Build Coastguard Worker RenderTargetD3D *renderTargetD3D, 330*8975f5c5SAndroid Build Coastguard Worker const std::string &label) = 0; 331*8975f5c5SAndroid Build Coastguard Worker virtual TextureStorage *createTextureStorageBuffer( 332*8975f5c5SAndroid Build Coastguard Worker const gl::OffsetBindingPointer<gl::Buffer> &buffer, 333*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat, 334*8975f5c5SAndroid Build Coastguard Worker const std::string &label) = 0; 335*8975f5c5SAndroid Build Coastguard Worker virtual TextureStorage *createTextureStorageExternal( 336*8975f5c5SAndroid Build Coastguard Worker egl::Stream *stream, 337*8975f5c5SAndroid Build Coastguard Worker const egl::Stream::GLTextureDescription &desc, 338*8975f5c5SAndroid Build Coastguard Worker const std::string &label) = 0; 339*8975f5c5SAndroid Build Coastguard Worker virtual TextureStorage *createTextureStorage2D(GLenum internalformat, 340*8975f5c5SAndroid Build Coastguard Worker BindFlags bindFlags, 341*8975f5c5SAndroid Build Coastguard Worker GLsizei width, 342*8975f5c5SAndroid Build Coastguard Worker GLsizei height, 343*8975f5c5SAndroid Build Coastguard Worker int levels, 344*8975f5c5SAndroid Build Coastguard Worker const std::string &label, 345*8975f5c5SAndroid Build Coastguard Worker bool hintLevelZeroOnly) = 0; 346*8975f5c5SAndroid Build Coastguard Worker virtual TextureStorage *createTextureStorageCube(GLenum internalformat, 347*8975f5c5SAndroid Build Coastguard Worker BindFlags bindFlags, 348*8975f5c5SAndroid Build Coastguard Worker int size, 349*8975f5c5SAndroid Build Coastguard Worker int levels, 350*8975f5c5SAndroid Build Coastguard Worker bool hintLevelZeroOnly, 351*8975f5c5SAndroid Build Coastguard Worker const std::string &label) = 0; 352*8975f5c5SAndroid Build Coastguard Worker virtual TextureStorage *createTextureStorage3D(GLenum internalformat, 353*8975f5c5SAndroid Build Coastguard Worker BindFlags bindFlags, 354*8975f5c5SAndroid Build Coastguard Worker GLsizei width, 355*8975f5c5SAndroid Build Coastguard Worker GLsizei height, 356*8975f5c5SAndroid Build Coastguard Worker GLsizei depth, 357*8975f5c5SAndroid Build Coastguard Worker int levels, 358*8975f5c5SAndroid Build Coastguard Worker const std::string &label) = 0; 359*8975f5c5SAndroid Build Coastguard Worker virtual TextureStorage *createTextureStorage2DArray(GLenum internalformat, 360*8975f5c5SAndroid Build Coastguard Worker BindFlags bindFlags, 361*8975f5c5SAndroid Build Coastguard Worker GLsizei width, 362*8975f5c5SAndroid Build Coastguard Worker GLsizei height, 363*8975f5c5SAndroid Build Coastguard Worker GLsizei depth, 364*8975f5c5SAndroid Build Coastguard Worker int levels, 365*8975f5c5SAndroid Build Coastguard Worker const std::string &label) = 0; 366*8975f5c5SAndroid Build Coastguard Worker virtual TextureStorage *createTextureStorage2DMultisample(GLenum internalformat, 367*8975f5c5SAndroid Build Coastguard Worker GLsizei width, 368*8975f5c5SAndroid Build Coastguard Worker GLsizei height, 369*8975f5c5SAndroid Build Coastguard Worker int levels, 370*8975f5c5SAndroid Build Coastguard Worker int samples, 371*8975f5c5SAndroid Build Coastguard Worker bool fixedSampleLocations, 372*8975f5c5SAndroid Build Coastguard Worker const std::string &label) = 0; 373*8975f5c5SAndroid Build Coastguard Worker virtual TextureStorage *createTextureStorage2DMultisampleArray(GLenum internalformat, 374*8975f5c5SAndroid Build Coastguard Worker GLsizei width, 375*8975f5c5SAndroid Build Coastguard Worker GLsizei height, 376*8975f5c5SAndroid Build Coastguard Worker GLsizei depth, 377*8975f5c5SAndroid Build Coastguard Worker int levels, 378*8975f5c5SAndroid Build Coastguard Worker int samples, 379*8975f5c5SAndroid Build Coastguard Worker bool fixedSampleLocations, 380*8975f5c5SAndroid Build Coastguard Worker const std::string &label) = 0; 381*8975f5c5SAndroid Build Coastguard Worker 382*8975f5c5SAndroid Build Coastguard Worker // Buffer-to-texture and Texture-to-buffer copies 383*8975f5c5SAndroid Build Coastguard Worker virtual bool supportsFastCopyBufferToTexture(GLenum internalFormat) const = 0; 384*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result fastCopyBufferToTexture(const gl::Context *context, 385*8975f5c5SAndroid Build Coastguard Worker const gl::PixelUnpackState &unpack, 386*8975f5c5SAndroid Build Coastguard Worker gl::Buffer *unpackBuffer, 387*8975f5c5SAndroid Build Coastguard Worker unsigned int offset, 388*8975f5c5SAndroid Build Coastguard Worker RenderTargetD3D *destRenderTarget, 389*8975f5c5SAndroid Build Coastguard Worker GLenum destinationFormat, 390*8975f5c5SAndroid Build Coastguard Worker GLenum sourcePixelsType, 391*8975f5c5SAndroid Build Coastguard Worker const gl::Box &destArea) = 0; 392*8975f5c5SAndroid Build Coastguard Worker 393*8975f5c5SAndroid Build Coastguard Worker // Device lost 394*8975f5c5SAndroid Build Coastguard Worker gl::GraphicsResetStatus getResetStatus(); 395*8975f5c5SAndroid Build Coastguard Worker void notifyDeviceLost(); 396*8975f5c5SAndroid Build Coastguard Worker virtual bool resetDevice() = 0; 397*8975f5c5SAndroid Build Coastguard Worker virtual bool testDeviceLost() = 0; 398*8975f5c5SAndroid Build Coastguard Worker virtual bool testDeviceResettable() = 0; 399*8975f5c5SAndroid Build Coastguard Worker 400*8975f5c5SAndroid Build Coastguard Worker virtual RendererClass getRendererClass() const = 0; 401*8975f5c5SAndroid Build Coastguard Worker virtual void *getD3DDevice() = 0; 402*8975f5c5SAndroid Build Coastguard Worker 403*8975f5c5SAndroid Build Coastguard Worker GLint64 getTimestamp(); 404*8975f5c5SAndroid Build Coastguard Worker 405*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result clearRenderTarget(const gl::Context *context, 406*8975f5c5SAndroid Build Coastguard Worker RenderTargetD3D *renderTarget, 407*8975f5c5SAndroid Build Coastguard Worker const gl::ColorF &clearColorValue, 408*8975f5c5SAndroid Build Coastguard Worker const float clearDepthValue, 409*8975f5c5SAndroid Build Coastguard Worker const unsigned int clearStencilValue) = 0; 410*8975f5c5SAndroid Build Coastguard Worker 411*8975f5c5SAndroid Build Coastguard Worker virtual DeviceImpl *createEGLDevice() = 0; 412*8975f5c5SAndroid Build Coastguard Worker presentPathFastEnabled()413*8975f5c5SAndroid Build Coastguard Worker bool presentPathFastEnabled() const { return mPresentPathFastEnabled; } 414*8975f5c5SAndroid Build Coastguard Worker 415*8975f5c5SAndroid Build Coastguard Worker // Stream creation 416*8975f5c5SAndroid Build Coastguard Worker virtual StreamProducerImpl *createStreamProducerD3DTexture( 417*8975f5c5SAndroid Build Coastguard Worker egl::Stream::ConsumerType consumerType, 418*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) = 0; 419*8975f5c5SAndroid Build Coastguard Worker 420*8975f5c5SAndroid Build Coastguard Worker const gl::Caps &getNativeCaps() const; 421*8975f5c5SAndroid Build Coastguard Worker const gl::TextureCapsMap &getNativeTextureCaps() const; 422*8975f5c5SAndroid Build Coastguard Worker const gl::Extensions &getNativeExtensions() const; 423*8975f5c5SAndroid Build Coastguard Worker const gl::Limitations &getNativeLimitations() const; 424*8975f5c5SAndroid Build Coastguard Worker const ShPixelLocalStorageOptions &getNativePixelLocalStorageOptions() const; 425*8975f5c5SAndroid Build Coastguard Worker virtual void initializeFrontendFeatures(angle::FrontendFeatures *features) const = 0; 426*8975f5c5SAndroid Build Coastguard Worker 427*8975f5c5SAndroid Build Coastguard Worker // Necessary hack for default framebuffers in D3D. 428*8975f5c5SAndroid Build Coastguard Worker virtual FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) = 0; 429*8975f5c5SAndroid Build Coastguard Worker 430*8975f5c5SAndroid Build Coastguard Worker virtual gl::Version getMaxSupportedESVersion() const = 0; 431*8975f5c5SAndroid Build Coastguard Worker virtual gl::Version getMaxConformantESVersion() const = 0; 432*8975f5c5SAndroid Build Coastguard Worker 433*8975f5c5SAndroid Build Coastguard Worker angle::Result initRenderTarget(const gl::Context *context, RenderTargetD3D *renderTarget); 434*8975f5c5SAndroid Build Coastguard Worker 435*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result getIncompleteTexture(const gl::Context *context, 436*8975f5c5SAndroid Build Coastguard Worker gl::TextureType type, 437*8975f5c5SAndroid Build Coastguard Worker gl::Texture **textureOut) = 0; 438*8975f5c5SAndroid Build Coastguard Worker 439*8975f5c5SAndroid Build Coastguard Worker UniqueSerial generateSerial(); 440*8975f5c5SAndroid Build Coastguard Worker 441*8975f5c5SAndroid Build Coastguard Worker virtual bool canSelectViewInVertexShader() const = 0; 442*8975f5c5SAndroid Build Coastguard Worker getDisplay()443*8975f5c5SAndroid Build Coastguard Worker egl::Display *getDisplay() const { return mDisplay; } 444*8975f5c5SAndroid Build Coastguard Worker 445*8975f5c5SAndroid Build Coastguard Worker protected: 446*8975f5c5SAndroid Build Coastguard Worker virtual bool getLUID(LUID *adapterLuid) const = 0; 447*8975f5c5SAndroid Build Coastguard Worker virtual void generateCaps(gl::Caps *outCaps, 448*8975f5c5SAndroid Build Coastguard Worker gl::TextureCapsMap *outTextureCaps, 449*8975f5c5SAndroid Build Coastguard Worker gl::Extensions *outExtensions, 450*8975f5c5SAndroid Build Coastguard Worker gl::Limitations *outLimitations, 451*8975f5c5SAndroid Build Coastguard Worker ShPixelLocalStorageOptions *outPLSOptions) const = 0; 452*8975f5c5SAndroid Build Coastguard Worker 453*8975f5c5SAndroid Build Coastguard Worker bool skipDraw(const gl::State &glState, gl::PrimitiveMode drawMode); 454*8975f5c5SAndroid Build Coastguard Worker 455*8975f5c5SAndroid Build Coastguard Worker egl::Display *mDisplay; 456*8975f5c5SAndroid Build Coastguard Worker 457*8975f5c5SAndroid Build Coastguard Worker bool mPresentPathFastEnabled; 458*8975f5c5SAndroid Build Coastguard Worker 459*8975f5c5SAndroid Build Coastguard Worker private: 460*8975f5c5SAndroid Build Coastguard Worker void ensureCapsInitialized() const; 461*8975f5c5SAndroid Build Coastguard Worker 462*8975f5c5SAndroid Build Coastguard Worker virtual void initializeFeatures(angle::FeaturesD3D *features) const = 0; 463*8975f5c5SAndroid Build Coastguard Worker 464*8975f5c5SAndroid Build Coastguard Worker mutable bool mCapsInitialized; 465*8975f5c5SAndroid Build Coastguard Worker mutable gl::Caps mNativeCaps; 466*8975f5c5SAndroid Build Coastguard Worker mutable gl::TextureCapsMap mNativeTextureCaps; 467*8975f5c5SAndroid Build Coastguard Worker mutable gl::Extensions mNativeExtensions; 468*8975f5c5SAndroid Build Coastguard Worker mutable gl::Limitations mNativeLimitations; 469*8975f5c5SAndroid Build Coastguard Worker mutable ShPixelLocalStorageOptions mNativePLSOptions; 470*8975f5c5SAndroid Build Coastguard Worker 471*8975f5c5SAndroid Build Coastguard Worker mutable bool mFeaturesInitialized; 472*8975f5c5SAndroid Build Coastguard Worker mutable angle::FeaturesD3D mFeatures; 473*8975f5c5SAndroid Build Coastguard Worker 474*8975f5c5SAndroid Build Coastguard Worker bool mDeviceLost; 475*8975f5c5SAndroid Build Coastguard Worker 476*8975f5c5SAndroid Build Coastguard Worker UniqueSerialFactory mSerialFactory; 477*8975f5c5SAndroid Build Coastguard Worker }; 478*8975f5c5SAndroid Build Coastguard Worker 479*8975f5c5SAndroid Build Coastguard Worker unsigned int GetBlendSampleMask(const gl::State &glState, int samples); 480*8975f5c5SAndroid Build Coastguard Worker GLenum DefaultGLErrorCode(HRESULT hr); 481*8975f5c5SAndroid Build Coastguard Worker 482*8975f5c5SAndroid Build Coastguard Worker // Define stubs so we don't need to include D3D9/D3D11 headers directly. 483*8975f5c5SAndroid Build Coastguard Worker RendererD3D *CreateRenderer11(egl::Display *display); 484*8975f5c5SAndroid Build Coastguard Worker RendererD3D *CreateRenderer9(egl::Display *display); 485*8975f5c5SAndroid Build Coastguard Worker 486*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 487*8975f5c5SAndroid Build Coastguard Worker 488*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_D3D_RENDERERD3D_H_ 489