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