xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2012 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // Renderer9.h: Defines a back-end specific class for the D3D9 renderer.
8 
9 #ifndef LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_
10 #define LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_
11 
12 #include "common/angleutils.h"
13 #include "common/mathutil.h"
14 #include "libANGLE/renderer/d3d/HLSLCompiler.h"
15 #include "libANGLE/renderer/d3d/RenderTargetD3D.h"
16 #include "libANGLE/renderer/d3d/RendererD3D.h"
17 #include "libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h"
18 #include "libANGLE/renderer/d3d/d3d9/ShaderCache.h"
19 #include "libANGLE/renderer/d3d/d3d9/StateManager9.h"
20 #include "libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h"
21 #include "libANGLE/renderer/driver_utils.h"
22 
23 namespace gl
24 {
25 class FramebufferAttachment;
26 }
27 
28 namespace egl
29 {
30 class AttributeMap;
31 }
32 
33 namespace rx
34 {
35 class Blit9;
36 class Context9;
37 class IndexDataManager;
38 class ProgramD3D;
39 class ProgramExecutableD3D;
40 class RenderTarget9;
41 class StreamingIndexBufferInterface;
42 class StaticIndexBufferInterface;
43 class VertexDataManager;
44 struct ClearParameters;
45 struct D3DUniform;
46 struct TranslatedAttribute;
47 
48 class Renderer9 : public RendererD3D
49 {
50   public:
51     explicit Renderer9(egl::Display *display);
52     ~Renderer9() override;
53 
54     egl::Error initialize() override;
55     bool resetDevice() override;
56 
57     egl::ConfigSet generateConfigs() override;
58     void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const override;
59 
60     void startScene();
61     void endScene();
62 
63     angle::Result flush(const gl::Context *context);
64     angle::Result finish(const gl::Context *context);
65 
66     bool isValidNativeWindow(EGLNativeWindowType window) const override;
67     NativeWindowD3D *createNativeWindow(EGLNativeWindowType window,
68                                         const egl::Config *config,
69                                         const egl::AttributeMap &attribs) const override;
70 
71     SwapChainD3D *createSwapChain(NativeWindowD3D *nativeWindow,
72                                   HANDLE shareHandle,
73                                   IUnknown *d3dTexture,
74                                   GLenum backBufferFormat,
75                                   GLenum depthBufferFormat,
76                                   EGLint orientation,
77                                   EGLint samples) override;
78     egl::Error getD3DTextureInfo(const egl::Config *configuration,
79                                  IUnknown *d3dTexture,
80                                  const egl::AttributeMap &attribs,
81                                  EGLint *width,
82                                  EGLint *height,
83                                  GLsizei *samples,
84                                  gl::Format *glFormat,
85                                  const angle::Format **angleFormat,
86                                  UINT *arraySlice) const override;
87     egl::Error validateShareHandle(const egl::Config *config,
88                                    HANDLE shareHandle,
89                                    const egl::AttributeMap &attribs) const override;
90 
91     ContextImpl *createContext(const gl::State &state, gl::ErrorSet *errorSet) override;
92 
93     angle::Result allocateEventQuery(const gl::Context *context, IDirect3DQuery9 **outQuery);
94     void freeEventQuery(IDirect3DQuery9 *query);
95 
96     // resource creation
97     angle::Result createVertexShader(d3d::Context *context,
98                                      const DWORD *function,
99                                      size_t length,
100                                      IDirect3DVertexShader9 **outShader);
101     angle::Result createPixelShader(d3d::Context *context,
102                                     const DWORD *function,
103                                     size_t length,
104                                     IDirect3DPixelShader9 **outShader);
105     HRESULT createVertexBuffer(UINT Length, DWORD Usage, IDirect3DVertexBuffer9 **ppVertexBuffer);
106     HRESULT createIndexBuffer(UINT Length,
107                               DWORD Usage,
108                               D3DFORMAT Format,
109                               IDirect3DIndexBuffer9 **ppIndexBuffer);
110     angle::Result setSamplerState(const gl::Context *context,
111                                   gl::ShaderType type,
112                                   int index,
113                                   gl::Texture *texture,
114                                   const gl::SamplerState &sampler);
115     angle::Result setTexture(const gl::Context *context,
116                              gl::ShaderType type,
117                              int index,
118                              gl::Texture *texture);
119 
120     angle::Result updateState(const gl::Context *context, gl::PrimitiveMode drawMode);
121 
122     void setScissorRectangle(const gl::Rectangle &scissor, bool enabled);
123     void setViewport(const gl::Rectangle &viewport,
124                      float zNear,
125                      float zFar,
126                      gl::PrimitiveMode drawMode,
127                      GLenum frontFace,
128                      bool ignoreViewport);
129 
130     angle::Result applyRenderTarget(const gl::Context *context,
131                                     const RenderTarget9 *colorRenderTarget,
132                                     const RenderTarget9 *depthStencilRenderTarget);
133     void applyUniforms(ProgramExecutableD3D *executableD3D);
134     bool applyPrimitiveType(gl::PrimitiveMode primitiveType,
135                             GLsizei elementCount,
136                             bool usesPointSize);
137     angle::Result applyVertexBuffer(const gl::Context *context,
138                                     gl::PrimitiveMode mode,
139                                     GLint first,
140                                     GLsizei count,
141                                     GLsizei instances,
142                                     TranslatedIndexData *indexInfo);
143     angle::Result applyIndexBuffer(const gl::Context *context,
144                                    const void *indices,
145                                    GLsizei count,
146                                    gl::PrimitiveMode mode,
147                                    gl::DrawElementsType type,
148                                    TranslatedIndexData *indexInfo);
149 
150     void clear(const ClearParameters &clearParams,
151                const RenderTarget9 *colorRenderTarget,
152                const RenderTarget9 *depthStencilRenderTarget);
153 
154     void markAllStateDirty();
155 
156     // lost device
157     bool testDeviceLost() override;
158     bool testDeviceResettable() override;
159 
160     VendorID getVendorId() const;
161     DeviceIdentifier getAdapterIdentifier() const override;
162 
getDevice()163     IDirect3DDevice9 *getDevice() { return mDevice; }
164     void *getD3DDevice() override;
165 
166     unsigned int getReservedVertexUniformVectors() const;
167     unsigned int getReservedFragmentUniformVectors() const;
168 
169     bool getShareHandleSupport() const;
170 
171     int getMajorShaderModel() const override;
172     int getMinorShaderModel() const override;
173     std::string getShaderModelSuffix() const override;
174 
175     DWORD getCapsDeclTypes() const;
176 
177     // Pixel operations
178     angle::Result copyImage2D(const gl::Context *context,
179                               const gl::Framebuffer *framebuffer,
180                               const gl::Rectangle &sourceRect,
181                               GLenum destFormat,
182                               const gl::Offset &destOffset,
183                               TextureStorage *storage,
184                               GLint level) override;
185     angle::Result copyImageCube(const gl::Context *context,
186                                 const gl::Framebuffer *framebuffer,
187                                 const gl::Rectangle &sourceRect,
188                                 GLenum destFormat,
189                                 const gl::Offset &destOffset,
190                                 TextureStorage *storage,
191                                 gl::TextureTarget target,
192                                 GLint level) override;
193     angle::Result copyImage3D(const gl::Context *context,
194                               const gl::Framebuffer *framebuffer,
195                               const gl::Rectangle &sourceRect,
196                               GLenum destFormat,
197                               const gl::Offset &destOffset,
198                               TextureStorage *storage,
199                               GLint level) override;
200     angle::Result copyImage2DArray(const gl::Context *context,
201                                    const gl::Framebuffer *framebuffer,
202                                    const gl::Rectangle &sourceRect,
203                                    GLenum destFormat,
204                                    const gl::Offset &destOffset,
205                                    TextureStorage *storage,
206                                    GLint level) override;
207 
208     angle::Result copyTexture(const gl::Context *context,
209                               const gl::Texture *source,
210                               GLint sourceLevel,
211                               gl::TextureTarget srcTarget,
212                               const gl::Box &sourceBox,
213                               GLenum destFormat,
214                               GLenum destType,
215                               const gl::Offset &destOffset,
216                               TextureStorage *storage,
217                               gl::TextureTarget destTarget,
218                               GLint destLevel,
219                               bool unpackFlipY,
220                               bool unpackPremultiplyAlpha,
221                               bool unpackUnmultiplyAlpha) override;
222     angle::Result copyCompressedTexture(const gl::Context *context,
223                                         const gl::Texture *source,
224                                         GLint sourceLevel,
225                                         TextureStorage *storage,
226                                         GLint destLevel) override;
227 
228     // RenderTarget creation
229     angle::Result createRenderTarget(const gl::Context *context,
230                                      int width,
231                                      int height,
232                                      GLenum format,
233                                      GLsizei samples,
234                                      RenderTargetD3D **outRT) override;
235     angle::Result createRenderTargetCopy(const gl::Context *context,
236                                          RenderTargetD3D *source,
237                                          RenderTargetD3D **outRT) override;
238 
239     // Shader operations
240     angle::Result loadExecutable(d3d::Context *context,
241                                  const uint8_t *function,
242                                  size_t length,
243                                  gl::ShaderType type,
244                                  const std::vector<D3DVarying> &streamOutVaryings,
245                                  bool separatedOutputBuffers,
246                                  ShaderExecutableD3D **outExecutable) override;
247     angle::Result compileToExecutable(d3d::Context *context,
248                                       gl::InfoLog &infoLog,
249                                       const std::string &shaderHLSL,
250                                       gl::ShaderType type,
251                                       const std::vector<D3DVarying> &streamOutVaryings,
252                                       bool separatedOutputBuffers,
253                                       const CompilerWorkaroundsD3D &workarounds,
254                                       ShaderExecutableD3D **outExectuable) override;
255     angle::Result ensureHLSLCompilerInitialized(d3d::Context *context) override;
256 
257     UniformStorageD3D *createUniformStorage(size_t storageSize) override;
258 
259     // Image operations
260     ImageD3D *createImage() override;
261     ExternalImageSiblingImpl *createExternalImageSibling(const gl::Context *context,
262                                                          EGLenum target,
263                                                          EGLClientBuffer buffer,
264                                                          const egl::AttributeMap &attribs) override;
265     angle::Result generateMipmap(const gl::Context *context,
266                                  ImageD3D *dest,
267                                  ImageD3D *source) override;
268     angle::Result generateMipmapUsingD3D(const gl::Context *context,
269                                          TextureStorage *storage,
270                                          const gl::TextureState &textureState) override;
271     angle::Result copyImage(const gl::Context *context,
272                             ImageD3D *dest,
273                             ImageD3D *source,
274                             const gl::Box &sourceBox,
275                             const gl::Offset &destOffset,
276                             bool unpackFlipY,
277                             bool unpackPremultiplyAlpha,
278                             bool unpackUnmultiplyAlpha) override;
279     TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain,
280                                            const std::string &label) override;
281     TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage,
282                                                  RenderTargetD3D *renderTargetD3D,
283                                                  const std::string &label) override;
284 
285     TextureStorage *createTextureStorageBuffer(const gl::OffsetBindingPointer<gl::Buffer> &buffer,
286                                                GLenum internalFormat,
287                                                const std::string &label) override;
288 
289     TextureStorage *createTextureStorageExternal(egl::Stream *stream,
290                                                  const egl::Stream::GLTextureDescription &desc,
291                                                  const std::string &label) override;
292 
293     TextureStorage *createTextureStorage2D(GLenum internalformat,
294                                            BindFlags bindFlags,
295                                            GLsizei width,
296                                            GLsizei height,
297                                            int levels,
298                                            const std::string &label,
299                                            bool hintLevelZeroOnly) override;
300     TextureStorage *createTextureStorageCube(GLenum internalformat,
301                                              BindFlags bindFlags,
302                                              int size,
303                                              int levels,
304                                              bool hintLevelZeroOnly,
305                                              const std::string &label) override;
306     TextureStorage *createTextureStorage3D(GLenum internalformat,
307                                            BindFlags bindFlags,
308                                            GLsizei width,
309                                            GLsizei height,
310                                            GLsizei depth,
311                                            int levels,
312                                            const std::string &label) override;
313     TextureStorage *createTextureStorage2DArray(GLenum internalformat,
314                                                 BindFlags bindFlags,
315                                                 GLsizei width,
316                                                 GLsizei height,
317                                                 GLsizei depth,
318                                                 int levels,
319                                                 const std::string &label) override;
320 
321     TextureStorage *createTextureStorage2DMultisample(GLenum internalformat,
322                                                       GLsizei width,
323                                                       GLsizei height,
324                                                       int levels,
325                                                       int samples,
326                                                       bool fixedSampleLocations,
327                                                       const std::string &label) override;
328     TextureStorage *createTextureStorage2DMultisampleArray(GLenum internalformat,
329                                                            GLsizei width,
330                                                            GLsizei height,
331                                                            GLsizei depth,
332                                                            int levels,
333                                                            int samples,
334                                                            bool fixedSampleLocations,
335                                                            const std::string &label) override;
336 
337     // Buffer creation
338     VertexBuffer *createVertexBuffer() override;
339     IndexBuffer *createIndexBuffer() override;
340 
341     // Stream Creation
342     StreamProducerImpl *createStreamProducerD3DTexture(egl::Stream::ConsumerType consumerType,
343                                                        const egl::AttributeMap &attribs) override;
344 
345     // Buffer-to-texture and Texture-to-buffer copies
346     bool supportsFastCopyBufferToTexture(GLenum internalFormat) const override;
347     angle::Result fastCopyBufferToTexture(const gl::Context *context,
348                                           const gl::PixelUnpackState &unpack,
349                                           gl::Buffer *unpackBuffer,
350                                           unsigned int offset,
351                                           RenderTargetD3D *destRenderTarget,
352                                           GLenum destinationFormat,
353                                           GLenum sourcePixelsType,
354                                           const gl::Box &destArea) override;
355 
356     // D3D9-renderer specific methods
357     angle::Result boxFilter(Context9 *context9, IDirect3DSurface9 *source, IDirect3DSurface9 *dest);
358 
359     D3DPOOL getTexturePool(DWORD usage) const;
360 
361     bool getLUID(LUID *adapterLuid) const override;
362     VertexConversionType getVertexConversionType(angle::FormatID vertexFormatID) const override;
363     GLenum getVertexComponentType(angle::FormatID vertexFormatID) const override;
364 
365     // Warning: you should ensure binding really matches attrib.bindingIndex before using this
366     // function.
367     angle::Result getVertexSpaceRequired(const gl::Context *context,
368                                          const gl::VertexAttribute &attrib,
369                                          const gl::VertexBinding &binding,
370                                          size_t count,
371                                          GLsizei instances,
372                                          GLuint baseInstance,
373                                          unsigned int *bytesRequiredOut) const override;
374 
375     angle::Result copyToRenderTarget(const gl::Context *context,
376                                      IDirect3DSurface9 *dest,
377                                      IDirect3DSurface9 *source,
378                                      bool fromManaged);
379 
380     RendererClass getRendererClass() const override;
381 
getD3D9DeviceType()382     D3DDEVTYPE getD3D9DeviceType() const { return mDeviceType; }
383 
384     DeviceImpl *createEGLDevice() override;
385 
getStateManager()386     StateManager9 *getStateManager() { return &mStateManager; }
387 
388     angle::Result genericDrawArrays(const gl::Context *context,
389                                     gl::PrimitiveMode mode,
390                                     GLint first,
391                                     GLsizei count,
392                                     GLsizei instances);
393 
394     angle::Result genericDrawElements(const gl::Context *context,
395                                       gl::PrimitiveMode mode,
396                                       GLsizei count,
397                                       gl::DrawElementsType type,
398                                       const void *indices,
399                                       GLsizei instances);
400 
401     // Necessary hack for default framebuffers in D3D.
402     FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
403 
getAnnotator()404     DebugAnnotator9 *getAnnotator() { return &mAnnotator; }
405 
406     gl::Version getMaxSupportedESVersion() const override;
407     gl::Version getMaxConformantESVersion() const override;
408 
409     angle::Result clearRenderTarget(const gl::Context *context,
410                                     RenderTargetD3D *renderTarget,
411                                     const gl::ColorF &clearColorValue,
412                                     const float clearDepthValue,
413                                     const unsigned int clearStencilValue) override;
414 
415     bool canSelectViewInVertexShader() const override;
416 
417     angle::Result getIncompleteTexture(const gl::Context *context,
418                                        gl::TextureType type,
419                                        gl::Texture **textureOut) override;
420 
421     angle::Result ensureVertexDataManagerInitialized(const gl::Context *context);
422 
423     void setGlobalDebugAnnotator() override;
424 
425     std::string getRendererDescription() const override;
426     std::string getVendorString() const override;
427     std::string getVersionString(bool includeFullVersion) const override;
428 
429   private:
430     angle::Result drawArraysImpl(const gl::Context *context,
431                                  gl::PrimitiveMode mode,
432                                  GLint startVertex,
433                                  GLsizei count,
434                                  GLsizei instances);
435     angle::Result drawElementsImpl(const gl::Context *context,
436                                    gl::PrimitiveMode mode,
437                                    GLsizei count,
438                                    gl::DrawElementsType type,
439                                    const void *indices,
440                                    GLsizei instances);
441 
442     angle::Result applyShaders(const gl::Context *context, gl::PrimitiveMode drawMode);
443 
444     angle::Result applyTextures(const gl::Context *context);
445     angle::Result applyTextures(const gl::Context *context, gl::ShaderType shaderType);
446 
447     void generateCaps(gl::Caps *outCaps,
448                       gl::TextureCapsMap *outTextureCaps,
449                       gl::Extensions *outExtensions,
450                       gl::Limitations *outLimitations,
451                       ShPixelLocalStorageOptions *outPLSOptions) const override;
452 
453     void initializeFeatures(angle::FeaturesD3D *features) const override;
454 
455     void initializeFrontendFeatures(angle::FrontendFeatures *features) const override;
456 
457     angle::Result setBlendDepthRasterStates(const gl::Context *context, gl::PrimitiveMode drawMode);
458 
459     void release();
460 
461     void applyUniformnfv(const D3DUniform *targetUniform, const GLfloat *v);
462     void applyUniformniv(const D3DUniform *targetUniform, const GLint *v);
463     void applyUniformnbv(const D3DUniform *targetUniform, const GLint *v);
464 
465     angle::Result drawLineLoop(const gl::Context *context,
466                                GLsizei count,
467                                gl::DrawElementsType type,
468                                const void *indices,
469                                int minIndex,
470                                gl::Buffer *elementArrayBuffer);
471     angle::Result drawIndexedPoints(const gl::Context *context,
472                                     GLsizei count,
473                                     gl::DrawElementsType type,
474                                     const void *indices,
475                                     int minIndex,
476                                     gl::Buffer *elementArrayBuffer);
477 
478     angle::Result getCountingIB(const gl::Context *context,
479                                 size_t count,
480                                 StaticIndexBufferInterface **outIB);
481 
482     angle::Result getNullColorRenderTarget(const gl::Context *context,
483                                            const RenderTarget9 *depthRenderTarget,
484                                            const RenderTarget9 **outColorRenderTarget);
485 
486     D3DPOOL getBufferPool(DWORD usage) const;
487 
488     HMODULE mD3d9Module;
489 
490     egl::Error initializeDevice();
491     D3DPRESENT_PARAMETERS getDefaultPresentParameters();
492     void releaseDeviceResources();
493 
494     HRESULT getDeviceStatusCode();
495     bool isRemovedDeviceResettable() const;
496     bool resetRemovedDevice();
497 
498     UINT mAdapter;
499     D3DDEVTYPE mDeviceType;
500     IDirect3D9 *mD3d9;      // Always valid after successful initialization.
501     IDirect3D9Ex *mD3d9Ex;  // Might be null if D3D9Ex is not supported.
502     IDirect3DDevice9 *mDevice;
503     IDirect3DDevice9Ex *mDeviceEx;  // Might be null if D3D9Ex is not supported.
504 
505     HLSLCompiler mCompiler;
506 
507     Blit9 *mBlit;
508 
509     HWND mDeviceWindow;
510 
511     D3DCAPS9 mDeviceCaps;
512     D3DADAPTER_IDENTIFIER9 mAdapterIdentifier;
513 
514     D3DPRIMITIVETYPE mPrimitiveType;
515     int mPrimitiveCount;
516     GLsizei mRepeatDraw;
517 
518     bool mSceneStarted;
519 
520     bool mVertexTextureSupport;
521 
522     // current render target states
523     unsigned int mAppliedRenderTargetSerial;
524     unsigned int mAppliedDepthStencilSerial;
525     bool mDepthStencilInitialized;
526     bool mRenderTargetDescInitialized;
527 
528     IDirect3DStateBlock9 *mMaskedClearSavedState;
529 
530     StateManager9 mStateManager;
531 
532     // Currently applied sampler states
533     struct CurSamplerState
534     {
535         CurSamplerState();
536 
537         bool forceSet;
538         size_t baseLevel;
539         gl::SamplerState samplerState;
540     };
541     std::vector<CurSamplerState> mCurVertexSamplerStates;
542     std::vector<CurSamplerState> mCurPixelSamplerStates;
543 
544     // Currently applied textures
545     std::vector<uintptr_t> mCurVertexTextures;
546     std::vector<uintptr_t> mCurPixelTextures;
547 
548     unsigned int mAppliedIBSerial;
549     IDirect3DVertexShader9 *mAppliedVertexShader;
550     IDirect3DPixelShader9 *mAppliedPixelShader;
551     unsigned int mAppliedProgramSerial;
552 
553     // A pool of event queries that are currently unused.
554     std::vector<IDirect3DQuery9 *> mEventQueryPool;
555     VertexShaderCache mVertexShaderCache;
556     PixelShaderCache mPixelShaderCache;
557 
558     VertexDataManager *mVertexDataManager;
559     VertexDeclarationCache mVertexDeclarationCache;
560 
561     IndexDataManager *mIndexDataManager;
562     StreamingIndexBufferInterface *mLineLoopIB;
563     StaticIndexBufferInterface *mCountingIB;
564 
565     enum
566     {
567         NUM_NULL_COLORBUFFER_CACHE_ENTRIES = 12
568     };
569     struct NullRenderTargetCacheEntry
570     {
571         UINT lruCount;
572         int width;
573         int height;
574         RenderTarget9 *renderTarget;
575     };
576 
577     std::array<NullRenderTargetCacheEntry, NUM_NULL_COLORBUFFER_CACHE_ENTRIES>
578         mNullRenderTargetCache;
579     UINT mMaxNullColorbufferLRU;
580 
581     std::vector<TranslatedAttribute> mTranslatedAttribCache;
582 
583     DebugAnnotator9 mAnnotator;
584 };
585 
586 }  // namespace rx
587 
588 #endif  // LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_
589