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