xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/RendererD3D.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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