1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_gfx_layers_d3d11_DeviceAttachmentsD3D11_h 8 #define mozilla_gfx_layers_d3d11_DeviceAttachmentsD3D11_h 9 10 #include "mozilla/EnumeratedArray.h" 11 #include "mozilla/RefPtr.h" 12 #include "mozilla/gfx/DeviceManagerDx.h" 13 #include "mozilla/layers/CompositorTypes.h" 14 #include "mozilla/layers/SyncObject.h" 15 #include <d3d11.h> 16 #include <dxgi1_2.h> 17 18 namespace mozilla { 19 namespace layers { 20 21 struct ShaderBytes; 22 23 class DeviceAttachmentsD3D11 final { 24 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DeviceAttachmentsD3D11); 25 26 public: 27 static RefPtr<DeviceAttachmentsD3D11> Create(ID3D11Device* aDevice); 28 29 bool InitBlendShaders(); 30 bool EnsureTriangleBuffer(size_t aNumTriangles); 31 IsValid()32 bool IsValid() const { return mInitialized; } GetFailureId()33 const nsCString& GetFailureId() const { 34 MOZ_ASSERT(!IsValid()); 35 return mInitFailureId; 36 } 37 38 typedef EnumeratedArray<MaskType, MaskType::NumMaskTypes, 39 RefPtr<ID3D11VertexShader>> 40 VertexShaderArray; 41 typedef EnumeratedArray<MaskType, MaskType::NumMaskTypes, 42 RefPtr<ID3D11PixelShader>> 43 PixelShaderArray; 44 45 RefPtr<ID3D11InputLayout> mInputLayout; 46 RefPtr<ID3D11InputLayout> mDynamicInputLayout; 47 48 RefPtr<ID3D11Buffer> mVertexBuffer; 49 RefPtr<ID3D11Buffer> mDynamicVertexBuffer; 50 51 VertexShaderArray mVSQuadShader; 52 VertexShaderArray mVSQuadBlendShader; 53 54 VertexShaderArray mVSDynamicShader; 55 VertexShaderArray mVSDynamicBlendShader; 56 57 PixelShaderArray mSolidColorShader; 58 PixelShaderArray mRGBAShader; 59 PixelShaderArray mRGBShader; 60 PixelShaderArray mYCbCrShader; 61 PixelShaderArray mNV12Shader; 62 PixelShaderArray mComponentAlphaShader; 63 PixelShaderArray mBlendShader; 64 RefPtr<ID3D11Buffer> mPSConstantBuffer; 65 RefPtr<ID3D11Buffer> mVSConstantBuffer; 66 RefPtr<ID3D11RasterizerState> mRasterizerState; 67 RefPtr<ID3D11SamplerState> mLinearSamplerState; 68 RefPtr<ID3D11SamplerState> mPointSamplerState; 69 70 RefPtr<ID3D11BlendState> mPremulBlendState; 71 RefPtr<ID3D11BlendState> mPremulCopyState; 72 RefPtr<ID3D11BlendState> mNonPremulBlendState; 73 RefPtr<ID3D11BlendState> mComponentBlendState; 74 RefPtr<ID3D11BlendState> mDisabledBlendState; 75 76 RefPtr<SyncObjectHost> mSyncObject; 77 SetDeviceReset()78 void SetDeviceReset() { mDeviceReset = true; } IsDeviceReset()79 bool IsDeviceReset() const { return mDeviceReset; } 80 81 private: 82 explicit DeviceAttachmentsD3D11(ID3D11Device* device); 83 ~DeviceAttachmentsD3D11(); 84 85 bool Initialize(); 86 bool CreateShaders(); 87 bool InitSyncObject(); 88 InitVertexShader(const ShaderBytes & aShader,VertexShaderArray & aArray,MaskType aMaskType)89 void InitVertexShader(const ShaderBytes& aShader, VertexShaderArray& aArray, 90 MaskType aMaskType) { 91 InitVertexShader(aShader, getter_AddRefs(aArray[aMaskType])); 92 } InitPixelShader(const ShaderBytes & aShader,PixelShaderArray & aArray,MaskType aMaskType)93 void InitPixelShader(const ShaderBytes& aShader, PixelShaderArray& aArray, 94 MaskType aMaskType) { 95 InitPixelShader(aShader, getter_AddRefs(aArray[aMaskType])); 96 } 97 98 void InitVertexShader(const ShaderBytes& aShader, ID3D11VertexShader** aOut); 99 void InitPixelShader(const ShaderBytes& aShader, ID3D11PixelShader** aOut); 100 101 bool Failed(HRESULT hr, const char* aContext); 102 103 private: 104 size_t mMaximumTriangles; 105 106 // Only used during initialization. 107 RefPtr<ID3D11Device> mDevice; 108 bool mContinueInit; 109 bool mInitialized; 110 bool mDeviceReset; 111 nsCString mInitFailureId; 112 }; 113 114 } // namespace layers 115 } // namespace mozilla 116 117 #endif // mozilla_gfx_layers_d3d11_DeviceAttachmentsD3D11_h 118