summaryrefslogtreecommitdiff
path: root/Runtime/GfxDevice/d3d11/GfxDeviceD3D11.h
blob: 8a7595cbbdee7b0ffb45276d91614d9e5316acc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
#pragma once

#include "Runtime/GfxDevice/GfxDevice.h"
#include "Runtime/GfxDevice/TransformState.h"
#include "D3D11Includes.h"
#include "VertexDeclarationsD3D11.h"
#include "TexturesD3D11.h"
#include "FixedFunctionStateD3D11.h"
#include "ConstantBuffersD3D11.h"
#include <map>

class FixedFunctionProgramD3D11;
class DynamicD3D11VBO;


// TODO: optimize this. Right now we just send off whole 8 float3 UVs with each
// immediate mode vertex. We could at least detect the number of them used from
// ImmediateTexCoord calls.
struct ImmediateVertexD3D11 {
	Vector3f	vertex;
	Vector3f	normal;
	ColorRGBA32	color;
	Vector3f	texCoords[8];
};

struct ImmediateModeD3D11 {
	std::vector<ImmediateVertexD3D11>	m_Vertices;
	ImmediateVertexD3D11				m_Current;
	GfxPrimitiveType					m_Mode;
	ID3D11Buffer*						m_VB;
	int									m_VBUsedBytes;
	int									m_VBStartVertex;
	bool								m_HadColor;

	ImmediateModeD3D11();
	~ImmediateModeD3D11();
	void Cleanup();
	void Invalidate();
};

struct TextureUnitState11
{
	Matrix4x4f	matrix;
};



typedef std::map<FixedFunctionStateD3D11, FixedFunctionProgramD3D11*, FixedFuncStateCompareD3D11> FFProgramCacheD3D11;

struct ResolveTexturePool
{
	enum { kResolvePoolSize = 8 };
	struct Entry
	{
		// key
		int width;
		int height;
		RenderTextureFormat format;
		bool sRGB;

		// data
		ID3D11Texture2D* texture;
		ID3D11ShaderResourceView* srv;
		int	lastUse;
	};

	ResolveTexturePool();
	void Clear();

	Entry* GetResolveTexture (int width, int height, RenderTextureFormat fmt, bool sRGB);

	Entry	m_Entries[kResolvePoolSize];
	int		m_UseCounter;
};

class GfxDeviceD3D11 : public GfxThreadableDevice
{
public:
	struct DeviceBlendStateD3D11 : public DeviceBlendState
	{
		ID3D11BlendState* deviceState;
	};

	typedef std::map< GfxBlendState, DeviceBlendStateD3D11,  memcmp_less<GfxBlendState> > CachedBlendStates;
	typedef std::map< GfxDepthState, DeviceDepthState,  memcmp_less<GfxDepthState> > CachedDepthStates;
	typedef std::map< GfxStencilState, DeviceStencilState,  memcmp_less<GfxStencilState> > CachedStencilStates;
	typedef std::map< GfxRasterState, DeviceRasterState,  memcmp_less<GfxRasterState> > CachedRasterStates;

	struct DepthStencilState {
		DeviceDepthState d;
		DeviceStencilState s;
	};
	typedef std::map< DepthStencilState, ID3D11DepthStencilState*, memcmp_less<DepthStencilState> > CachedDepthStencilStates;

	struct FinalRasterState11 {
		DeviceRasterState raster;
		bool	backface;
		bool	wireframe;
		bool	scissor;
	};
	typedef std::map< FinalRasterState11, ID3D11RasterizerState*,  memcmp_less<FinalRasterState11> > CachedFinalRasterStates;

public:
	GfxDeviceD3D11();
	GFX_API ~GfxDeviceD3D11();

	GFX_API void	InvalidateState();
	#if GFX_DEVICE_VERIFY_ENABLE
	GFX_API void	VerifyState();
	#endif

	GFX_API void	Clear (UInt32 clearFlags, const float color[4], float depth, int stencil);
	GFX_API void	SetUserBackfaceMode( bool enable );
	GFX_API void SetWireframe (bool wire);
	GFX_API bool GetWireframe() const;
	GFX_API void	SetInvertProjectionMatrix( bool enable );
	GFX_API bool	GetInvertProjectionMatrix() const;

	GFX_API DeviceBlendState* CreateBlendState(const GfxBlendState& state);
	GFX_API DeviceDepthState* CreateDepthState(const GfxDepthState& state);
	GFX_API DeviceStencilState* CreateStencilState(const GfxStencilState& state);
	GFX_API DeviceRasterState* CreateRasterState(const GfxRasterState& state);

	GFX_API void	SetBlendState(const DeviceBlendState* state, float alphaRef);
	GFX_API void	SetRasterState(const DeviceRasterState* state);
	GFX_API void	SetDepthState(const DeviceDepthState* state);
	GFX_API void	SetStencilState(const DeviceStencilState* state, int stencilRef);
	GFX_API void	SetSRGBWrite (const bool);
	GFX_API bool	GetSRGBWrite ();

	/* GPU Skinning functions */
	GFX_API GPUSkinningInfo *CreateGPUSkinningInfo();
	GFX_API void	DeleteGPUSkinningInfo(GPUSkinningInfo *info);
	GFX_API void	SkinOnGPU( GPUSkinningInfo * info, bool lastThisFrame );
	GFX_API void	UpdateSkinSourceData(GPUSkinningInfo *info, const void *vertData, const BoneInfluence *skinData, bool dirty);
	GFX_API void	UpdateSkinBonePoses(GPUSkinningInfo *info, const int boneCount, const Matrix4x4f* poses);

	GFX_API void	SetWorldMatrix( const float matrix[16] );
	GFX_API void	SetViewMatrix( const float matrix[16] );
	GFX_API void	SetProjectionMatrix (const Matrix4x4f& matrix);
	GFX_API void	GetMatrix( float outMatrix[16] ) const;

	GFX_API	const float* GetWorldMatrix() const ;
	GFX_API	const float* GetViewMatrix() const ;
	GFX_API	const float* GetProjectionMatrix() const ;
	GFX_API const float* GetDeviceProjectionMatrix() const;

	GFX_API void	SetNormalizationBackface( NormalizationMode mode, bool backface );
	GFX_API void	SetFFLighting( bool on, bool separateSpecular, ColorMaterialMode colorMaterial );
	GFX_API void	SetMaterial( const float ambient[4], const float diffuse[4], const float specular[4], const float emissive[4], const float shininess );
	GFX_API void	SetColor( const float color[4] );
	GFX_API void	SetViewport( int x, int y, int width, int height );
	GFX_API void	GetViewport( int* port ) const;

	GFX_API void	SetScissorRect( int x, int y, int width, int height );
	GFX_API void	DisableScissor();
	GFX_API bool	IsScissorEnabled() const;
	GFX_API void	GetScissorRect( int values[4] ) const;

	GFX_API bool	IsCombineModeSupported( unsigned int combiner );
	GFX_API TextureCombinersHandle CreateTextureCombiners( int count, const ShaderLab::TextureBinding* texEnvs, const ShaderLab::PropertySheet* props, bool hasVertexColorOrLighting, bool usesAddSpecular );
	GFX_API void	DeleteTextureCombiners( TextureCombinersHandle& textureCombiners );
	GFX_API void	SetTextureCombinersThreadable( TextureCombinersHandle textureCombiners, const TexEnvData* texEnvData, const Vector4f* texColors );
	GFX_API void	SetTextureCombiners( TextureCombinersHandle textureCombiners, const ShaderLab::PropertySheet* props );

	GFX_API void	SetTexture (ShaderType shaderType, int unit, int samplerUnit, TextureID texture, TextureDimension dim, float bias);
	GFX_API void	SetTextureParams( TextureID texture, TextureDimension texDim, TextureFilterMode filter, TextureWrapMode wrap, int anisoLevel, bool hasMipMap, TextureColorSpace colorSpace );
	GFX_API void	SetTextureTransform( int unit, TextureDimension dim, TexGenMode texGen, bool identity, const float matrix[16]);
	GFX_API void	SetTextureName ( TextureID texture, const char* name ) { }

	GFX_API void	SetShadersThreadable (GpuProgram* programs[kShaderTypeCount], const GpuProgramParameters* params[kShaderTypeCount], UInt8 const * const paramsBuffer[kShaderTypeCount]);
	GFX_API bool	IsShaderActive( ShaderType type ) const;
	GFX_API void	DestroySubProgram( ShaderLab::SubProgram* subprogram );
	GFX_API void	SetConstantBufferInfo (int id, int size);

	GFX_API void	DisableLights( int startLight );
	GFX_API void	SetLight( int light, const GfxVertexLight& data);
	GFX_API void	SetAmbient( const float ambient[4] );

	GFX_API void	EnableFog (const GfxFogParams& fog);
	GFX_API void	DisableFog();

	GFX_API VBO*	CreateVBO();
	GFX_API void	DeleteVBO( VBO* vbo );
	GFX_API DynamicVBO&	GetDynamicVBO();

	GFX_API void DiscardContents (RenderSurfaceHandle& rs);

	GFX_API RenderSurfaceHandle CreateRenderColorSurface (TextureID textureID, int width, int height, int samples, int depth, TextureDimension dim, RenderTextureFormat format, UInt32 createFlags);
	GFX_API RenderSurfaceHandle CreateRenderDepthSurface (TextureID textureID, int width, int height, int samples, TextureDimension dim, DepthBufferFormat depthFormat, UInt32 createFlags);
	GFX_API void DestroyRenderSurface (RenderSurfaceHandle& rs);
	GFX_API void SetRenderTargets (int count, RenderSurfaceHandle* colorHandles, RenderSurfaceHandle depthHandle, int mipLevel, CubemapFace face = kCubeFaceUnknown);
	GFX_API void ResolveColorSurface (RenderSurfaceHandle srcHandle, RenderSurfaceHandle dstHandle);
	GFX_API void ResolveDepthIntoTexture (RenderSurfaceHandle colorHandle, RenderSurfaceHandle depthHandle);
	GFX_API RenderSurfaceHandle GetActiveRenderColorSurface (int index);
	GFX_API RenderSurfaceHandle GetActiveRenderDepthSurface ();
	GFX_API void SetSurfaceFlags(RenderSurfaceHandle surf, UInt32 flags, UInt32 keepFlags);


	GFX_API void UploadTexture2D( TextureID texture, TextureDimension dimension, UInt8* srcData, int srcSize, int width, int height, TextureFormat format, int mipCount, UInt32 uploadFlags, int skipMipLevels, TextureUsageMode usageMode, TextureColorSpace colorSpace );
	GFX_API void UploadTextureSubData2D( TextureID texture, UInt8* srcData, int srcSize, int mipLevel, int x, int y, int width, int height, TextureFormat format, TextureColorSpace colorSpace );
	GFX_API void UploadTextureCube( TextureID texture, UInt8* srcData, int srcSize, int faceDataSize, int size, TextureFormat format, int mipCount, UInt32 uploadFlags, TextureColorSpace colorSpace );
	GFX_API void UploadTexture3D( TextureID texture, UInt8* srcData, int srcSize, int width, int height, int depth, TextureFormat format, int mipCount, UInt32 uploadFlags );
	GFX_API void DeleteTexture( TextureID texture );

	GFX_API PresentMode	GetPresentMode();

	GFX_API void	BeginFrame();
	GFX_API void	EndFrame();
	GFX_API void	PresentFrame();
	GFX_API bool	IsValidState();

	GFX_API void	FinishRendering();

	// Immediate mode rendering
	GFX_API void	ImmediateVertex( float x, float y, float z );
	GFX_API void	ImmediateNormal( float x, float y, float z );
	GFX_API void	ImmediateColor( float r, float g, float b, float a );
	GFX_API void	ImmediateTexCoordAll( float x, float y, float z );
	GFX_API void	ImmediateTexCoord( int unit, float x, float y, float z );
	GFX_API void	ImmediateBegin( GfxPrimitiveType type );
	GFX_API	void	ImmediateEnd();

	GFX_API bool	CaptureScreenshot( int left, int bottom, int width, int height, UInt8* rgba32 );
	GFX_API bool	ReadbackImage( ImageReference& image, int left, int bottom, int width, int height, int destX, int destY );
	GFX_API void	GrabIntoRenderTexture( RenderSurfaceHandle rs, RenderSurfaceHandle rd, int x, int y, int width, int height );

	GFX_API void	BeforeDrawCall( bool immediateMode );

	GFX_API bool	IsPositionRequiredForTexGen (int texStageIndex) const { return false; }
	GFX_API bool	IsNormalRequiredForTexGen (int texStageIndex) const { return false; }
	GFX_API bool	IsPositionRequiredForTexGen() const { return false; }
	GFX_API bool	IsNormalRequiredForTexGen() const { return false; }

	#if ENABLE_PROFILER
	GFX_API void	BeginProfileEvent (const char* name);
	GFX_API void	EndProfileEvent ();

	GFX_API GfxTimerQuery*		CreateTimerQuery();
	GFX_API void				DeleteTimerQuery(GfxTimerQuery* query);
	GFX_API void				BeginTimerQueries();
	GFX_API void				EndTimerQueries();
	#endif // ENABLE_PROFILER

	#if UNITY_EDITOR
	GFX_API void				SetAntiAliasFlag (bool aa);
	GFX_API void				DrawUserPrimitives (GfxPrimitiveType type, int vertexCount, UInt32 vertexChannels, const void* data, int stride);
	GFX_API int					GetCurrentTargetAA() const;
	GFX_API GfxDeviceWindow*	CreateGfxWindow (HWND window, int width, int height, DepthBufferFormat depthFormat, int antiAlias);
	#endif

	GFX_API int	GetCurrentTargetWidth() const;
	GFX_API int	GetCurrentTargetHeight() const;
	GFX_API void SetCurrentTargetSize(int width, int height);
	GFX_API void SetCurrentWindowSize(int width, int height);

	GFX_API void* GetNativeGfxDevice();
	GFX_API void* GetNativeTexturePointer(TextureID id);
	GFX_API intptr_t CreateExternalTextureFromNative(intptr_t nativeTex);
	GFX_API void UpdateExternalTextureFromNative(TextureID tex, intptr_t nativeTex);

	GFX_API void SetComputeBufferData (ComputeBufferID bufferHandle, const void* data, size_t size);
	GFX_API void GetComputeBufferData (ComputeBufferID bufferHandle, void* dest, size_t destSize);
	GFX_API void CopyComputeBufferCount (ComputeBufferID srcBuffer, ComputeBufferID dstBuffer, UInt32 dstOffset);

	GFX_API void SetRandomWriteTargetTexture (int index, TextureID tid);
	GFX_API void SetRandomWriteTargetBuffer (int index, ComputeBufferID bufferHandle);
	GFX_API void ClearRandomWriteTargets ();

	GFX_API ComputeProgramHandle CreateComputeProgram (const UInt8* code, size_t codeSize);
	GFX_API void DestroyComputeProgram (ComputeProgramHandle& cpHandle);
	GFX_API void CreateComputeConstantBuffers (unsigned count, const UInt32* sizes, ConstantBufferHandle* outCBs);
	GFX_API void DestroyComputeConstantBuffers (unsigned count, ConstantBufferHandle* cbs);
	GFX_API void CreateComputeBuffer (ComputeBufferID id, size_t count, size_t stride, UInt32 flags);
	GFX_API void DestroyComputeBuffer (ComputeBufferID handle);
	GFX_API void UpdateComputeConstantBuffers (unsigned count, ConstantBufferHandle* cbs,  UInt32 cbDirty, size_t dataSize, const UInt8* data, const UInt32* cbSizes, const UInt32* cbOffsets, const int* bindPoints);
	GFX_API void UpdateComputeResources (
		unsigned texCount, const TextureID* textures, const int* texBindPoints,
		unsigned samplerCount, const unsigned* samplers,
		unsigned inBufferCount, const ComputeBufferID* inBuffers, const int* inBufferBindPoints,
		unsigned outBufferCount, const ComputeBufferID* outBuffers, const TextureID* outTextures, const UInt32* outBufferBindPoints);
	GFX_API void DispatchComputeProgram (ComputeProgramHandle cpHandle, unsigned threadsX, unsigned threadsY, unsigned threadsZ);

	GFX_API void DrawNullGeometry (GfxPrimitiveType topology, int vertexCount, int instanceCount);
	GFX_API void DrawNullGeometryIndirect (GfxPrimitiveType topology, ComputeBufferID bufferHandle, UInt32 bufferOffset);

	ID3D11Buffer* GetAllWhiteVertexStream();
	VertexDeclarationsD3D11& GetVertexDecls() { return m_VertexDecls; }
	ConstantBuffersD3D11& GetConstantBuffers() { return m_CBs; }
	TexturesD3D11& GetTextures() { return m_Textures; }
	void SetComputeBuffer11 (ShaderType shaderType, int unit, ComputeBufferID bufferHandle);

private:
	void SetupDeferredDepthStencilState();
	void SetupDeferredRasterState();
	void SetupDeferredSRGBWrite();

	void DrawQuad (float u0, float v0, float u1, float v1, float z, ID3D11ShaderResourceView* texture);
	bool ImmediateEndSetup();
	void ImmediateEndDraw();

public:
	ImmediateModeD3D11		m_Imm;
	TransformState			m_TransformState;

	ConstantBuffersD3D11	m_CBs;
	VertexDeclarationsD3D11	m_VertexDecls;
	TexturesD3D11			m_Textures;
	DynamicD3D11VBO*		m_DynamicVBO;

	FFProgramCacheD3D11		m_FFPrograms;
	FixedFunctionStateD3D11	m_FFState;

	CachedBlendStates		m_CachedBlendStates;
	CachedDepthStates		m_CachedDepthStates;
	CachedStencilStates		m_CachedStencilStates;
	CachedRasterStates			m_CachedRasterStates;
	CachedFinalRasterStates		m_CachedFinalRasterStates;
	CachedDepthStencilStates	m_CachedDepthStencilStates;

	TextureUnitState11	m_TextureUnits[kMaxSupportedTextureUnits];
	TextureID			m_ActiveTextures[kShaderTypeCount][kMaxSupportedTextureUnits];
	TextureID			m_ActiveSamplers[kShaderTypeCount][kMaxSupportedTextureUnits];

	GpuProgram* m_ActiveGpuProgram[kShaderTypeCount];
	const GpuProgramParameters* m_ActiveGpuProgramParams[kShaderTypeCount];

	void*	m_ActiveShaders[kShaderTypeCount];

	const DeviceBlendState*		m_CurrBlendState;
	const DeviceRasterState*	m_CurrRasterState;
	const DeviceDepthState*		m_CurrDepthState;
	const DeviceStencilState*	m_CurrStencilState;
	ID3D11RasterizerState*		m_CurrRSState;
	ID3D11DepthStencilState*	m_CurrDSState;
	int		m_StencilRef;
	int		m_CurrStencilRef;

	bool	m_InvertProjMatrix;
	bool	m_AppBackfaceMode;
	bool	m_UserBackfaceMode;
	bool	m_Wireframe;
	bool	m_Scissor;
	bool	m_SRGBWrite;
	bool	m_ActualSRGBWrite;

	int		m_Viewport[4];
	int		m_ScissorRect[4];
	int		m_CurrTargetWidth;
	int		m_CurrTargetHeight;
	int		m_CurrWindowWidth;
	int		m_CurrWindowHeight;

	ResolveTexturePool	m_Resolves;
};

GfxDeviceD3D11& GetD3D11GfxDevice();