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