OROCHI
 
Loading...
Searching...
No Matches
GxRenderContext.h
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11#pragma once
12
13GX_CORE_NAMESPACE_BEGIN()
14
20class GxRenderTexture;
22
23//===========================================================================
26//===========================================================================
28{
29 //-------------------------------------------------------------
31 //-------------------------------------------------------------
33public:
34 GX_RTTI_CLASS(GxRenderContext, GxClassBase)
35 // GxClassBase継承クラス用禁止宣言
37 // new, delete定義
38 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::RENDER)
39
40 friend class GxSysRenderBase;
41 friend class GxRenderDevice;
42
43private:
45 enum class PARAMETER_TYPE
46 {
47 TEXTURE,
48 VECTOR,
49 VECTOR_ARRAY,
50 MATRIX,
51 MATRIX_ARRAY,
52 BOOLEAN,
53 INT4,
54 MAX,
55 };
56
58 struct GxParameter
59 {
60 PARAMETER_TYPE _type;
61 u32 _size;
62 void* _pBuffer;
63 };
64
66 //-------------------------------------------------------------
68 //-------------------------------------------------------------
70public:
72 GxRenderContext(void);
73
74protected:
76 b32 initialize(void);
77
79 void terminate(void);
80
82 b32 initializeThreadLocalStorage(void);
83
85 //-----------------------------------------------------------
87 //-----------------------------------------------------------
89public:
91#if defined(GX_THREAD_LOCAL_STORAGE)
92 GX_FORCE_INLINE static GxRenderContext* getContext(void) { return _pContext; }
93#else //GX_THREAD_LOCAL_STORAGE
94 GX_FORCE_INLINE static GxRenderContext* getContext(void) { return _pContext[GxThread::getCurrentThread()->getIndex()]; }
95#endif // !GX_THREAD_LOCAL_STORAGE
97 constexpr u32 getPacketCount(void) const { return _packetCount; }
98
100 GX_FORCE_INLINE void setView(RENDER_VIEW view);
102 constexpr RENDER_VIEW getView(void) const { return static_cast<RENDER_VIEW>(_priority._view); }
103
105 GX_FORCE_INLINE void setSubView(RENDER_SUB_VIEW subView);
107 constexpr RENDER_SUB_VIEW getSubView(void) const { return static_cast<RENDER_SUB_VIEW>(_priority._subView); }
108
110 GX_FORCE_INLINE void setPass(RENDER_PASS pass);
112 constexpr RENDER_PASS getPass(void) const { return static_cast<RENDER_PASS>(_priority._pass); }
113
115 GX_FORCE_INLINE void setSubPriority(u32 subPriority);
117 GX_FORCE_INLINE void setSubPriorityF32(f32 subPriority);
119 constexpr u32 getSubPriority(void) const { return _priority._subPriority; }
120
122 void setRenderState(RENDER_STATE renderState, u32 value);
124 void setDepthTestState(GxRenderDepthTestState state);
126 void setStencilTestState(GxRenderStencilTestState state, u32 stencilRef, b32 stencilTwoSideEnable);
128 void setAlphaTestState(GxRenderAlphaTestState state);
130 void setBlendState(GxRenderBlendState state);
132 void setViewport(const GxRect& rect, f32 nearZ, f32 farZ);
134 void setScissorRect(const GxRect& rect);
136 void setTexture(GX_HANDLE handle, GxRenderTexture* pTexture);
138 void setSamplerState(GX_HANDLE handle, GxRenderSamplerState state);
140 void setVector(GX_HANDLE handle, const GxVector4& vector);
142 GxVector4* setVectorArray(GX_HANDLE handle, u32 count);
144 void setMatrix44(GX_HANDLE handle, const GxMatrix44Gpu& matrix);
146 void setMatrixAffine(GX_HANDLE handle, const GxMatrixAffineGpu& matrix);
148 GxMatrix44Gpu* setMatrix44Array(GX_HANDLE handle, u32 count);
150 GxMatrixAffineGpu* setMatrixAffineArray(GX_HANDLE handle, u32 count);
152 void setBoolean(GX_HANDLE handle, b32 boolean);
154 void setInt4(GX_HANDLE handle, const s32 int4[4]);
156 GX_FORCE_INLINE void setVertexStream(u32 slot, GxRenderVertexBuffer* pVertexBuffer, u32 offset, u32 stride, RENDER_STREAM_FREQUENCY_TYPE frequencyType = RENDER_STREAM_FREQUENCY_TYPE::INDEXED);
158 GX_FORCE_INLINE void setIndexBuffer(GxRenderIndexBuffer* pIndexBuffer);
160 GX_FORCE_INLINE void setVertexDeclaration(GxRenderVertexDeclaration* pVertexDeclaration);
161
163 GX_FORCE_INLINE void setShader(RENDER_SHADER renderShader, GxRenderShader* pShader);
164
166 void setRenderTarget(u32 index, GxRenderTexture* pRenderTarget, b32 forceRenderToTexture = false);
168 void setDepthStencil(GxRenderTexture* pDepthStencil, b32 readOnly = false);
169
171 void forceDrawState(void);
172
174 void setCallback(GxCallback::GxHandlerBase handle, void* pSource, void* pArgument);
176 void setCallback(GxCallback::GxHandlerBase handle, void* pSource, u32 srcSize, void* pArgument, u32 argumentSize);
178 void setCallbackAsync(GxCallback::GxHandlerBase handle, void* pSource, void* pArgument);
179
181 void setPredication(void* pFlag, u32 size, b32 value);
182
184 //-------------------------------------------------------------
186 //-------------------------------------------------------------
188public:
190 void draw(RENDER_PRIMITIVE_TYPE type, u32 startVertex, u32 vertexCount);
192 void drawIndexed(RENDER_PRIMITIVE_TYPE type, s32 baseVertexIndex, u32 minIndex, u32 vertexCount, u32 startIndex, u32 indexCount, u32 instanceCount = 0, s32* pQueryIndex = nullptr);
194 void drawMemory(RENDER_PRIMITIVE_TYPE type, u32 vertexCount, const void* pVertex, u32 vertexStride);
196 void drawIndexedMemory(RENDER_PRIMITIVE_TYPE type, u32 minIndex, u32 vertexCount, u32 indexCount, const void* pVertex, const void* pIndex, u32 vertexStride, RENDER_INDEX_TYPE indexType);
197#if GX_ENABLE_COMPUTE_SHADER
199 void dispatch(u32 threadGroupCountX, u32 threadGroupCountY, u32 threadGroupCountZ);
200#endif //GX_ENABLE_COMPUTE_SHADER
201#if GX_ENABLE_OCCLUSION_CULLING
203 void resolveOcclusionQuery(void);
204#endif //GX_ENABLE_OCCLUSION_CULLING
205
207 void clear(u32 clearFlags, const GxColor clearColor, f32 clearZ, u32 clearStencil);
209 void clearHDR(u32 clearFlags, const GxColorHDR& clearColor, f32 clearZ, u32 clearStencil);
210
211#if GX_ENABLE_HTILE_STENCIL_MASK
213 void maskHtileStencilRegion(GxRenderComputeShader* pComputeShader, GxRenderTexture* pDepthStencil, f32 outTan, f32 inTan, f32 topTan, f32 bottomTan, f32 cutOff, f32 cutOut);
214#endif // GX_ENABLE_HTILE_STENCIL_MASK
215
217 void copyRenderTargetToTexture(u32 index = 0, GxRenderTexture* pTexture = nullptr, u32 dstMipLevel = 0, const GxRect* pSrcRect = nullptr, const GxPoint2* pDstPoint = nullptr);
219 void copyDepthStencilToTexture(GxRenderTexture* pTexture = nullptr, u32 dstMipLevel = 0, const GxRect* pSrcRect = nullptr, const GxPoint2* pDstPoint = nullptr);
221 void copyRenderTargetToTextureStretch(u32 index = 0, GxRenderTexture* pTexture = nullptr, u32 dstMipLevel = 0, const GxRect* pSrcRect = nullptr, const GxRect* pDstRect = nullptr);
223 void copyDepthStencilToTextureStretch(GxRenderTexture* pTexture = nullptr, u32 dstMipLevel=0, const GxRect* pSrcRect = nullptr, const GxRect* pDstRect = nullptr);
225 void copyRenderTargetToTextureWithMipmap(u32 index = 0, GxRenderTexture* pTexture = nullptr);
226
228 void assembleFinalVrImage(void* pPacket, u32 packetSize);
229
231 GX_FORCE_INLINE void doNotSkipThisFrame(void) { _doNotSkipThisFrame = true; }
233 GX_FORCE_INLINE b32 canNotSkipThisFrame(void) const { return _doNotSkipThisFrame; }
234
235#if defined(_NX64)
237 void setTiledCacheAction(GxNativeTiledCacheAction action);
239 void setTiledCacheTileSize(s32 width, s32 height);
240
242 void saveZCullData(void);
244 void restoreZCullData(void);
245#endif //_NX64
246
247#if GX_DEVELOP
249 void beginMarker(GX_CSTR name);
251 void endMarker(GX_CSTR name);
252#else //GX_DEVELOP
254 constexpr void beginMarker(GX_CSTR /*name*/) {}
256 constexpr void endMarker(GX_CSTR /*name*/) {}
257#endif // !GX_DEVELOP
258
260 void flushGpuCommandBuffer(void);
261
262private:
264 void reset(void);
265
267 GX_FORCE_INLINE void* setParameter(GxParameter& parameter, PARAMETER_TYPE type, u32 size);
269 GX_FORCE_INLINE void sendPacket(void* pCommand);
271 void* sendDrawCommandCommonInfo(void* pData);
273 void sendRegister(RENDER_SHADER renderShader, GxRenderDevice::GxRegisterSet* pRegisterSet);
275 void sendRegisterSetBool(GxRenderShader* pShader, GxRenderDevice::GxRegisterInformation* pInformation);
277 void sendRegisterSetInt4(GxRenderShader* pShader, GxRenderDevice::GxRegisterInformation* pInformation);
279 void sendRegisterSetGxFloat4(GxRenderShader* pShader, GxRenderDevice::GxRegisterInformation* pInformation);
281 void sendRegisterSetSampler(GxRenderShader* pShader, GxRenderDevice::GxRegisterInformation* pInformation);
282
284 GX_FORCE_INLINE void* allocCommand(GxRenderDevice::COMMAND_TYPE type, u32 size);
286 GX_FORCE_INLINE void* allocParameter(u32 size);
288 GX_FORCE_INLINE GxRenderDevice::GxRegisterInformation* allocRegisterInfo(u32 count);
289
291 void buildPacket(void* pPacketBuffer);
293 void mergeSort(GxRenderDevice::GxPacket* pDst, GxRenderDevice::GxPacket* pSrc, s32 left, s32 right);
294
296 //-------------------------------------------------------------
298 //-------------------------------------------------------------
300private:
301 u32 _packetCount;
302
303 GxRenderDevice::GxPacket* _pPacketTop;
304 GxRenderDevice::GxPacket* _pPacketBlock;
305 u32 _packetCountBlock;
306
307 void* _pCommandBlock;
308 u32 _commandSizeBlock;
309
312 GxRenderIndexBuffer* _pIndexBuffer;
313#if GX_ENABLE_COMPUTE_SHADER
314 GxRenderShader* _pComputeShader;
315#endif //GX_ENABLE_COMPUTE_SHADER
316 GxParameter* _pParameter;
317
319
320 b32 _doNotSkipThisFrame;
321
322#if defined(GX_THREAD_LOCAL_STORAGE)
323 static GX_THREAD_LOCAL_STORAGE GxRenderContext* _pContext;
324#else //GX_THREAD_LOCAL_STORAGE
325 static GxRenderContext* _pContext[GxThread::THREAD_MAX];
326#endif // !GX_THREAD_LOCAL_STORAGE
327#if GX_DEVELOP
328 GxRenderDevice::GxPerformanceCounterView _performanceCounter[static_cast<s32>(RENDER_VIEW::MAX)];
329 GxRenderDevice::GxPerformanceCounter* _pPerformanceCounter;
330#endif // GX_DEVELOP
331
333};
334
335// アクセスインターフェース
336GX_FORCE_INLINE GxRenderContext* getGxRenderContext(void) { return GxRenderContext::getContext(); }
337
338GX_CORE_NAMESPACE_END()
339
340#include "GxRenderContext.inl"
#define GX_PROHIBIT_CLASS_BASE(__CLASS__)
GxClassBase継承の禁止宣言
Definition GxBase.h:240
@ MAX
定義数
u32 GX_HANDLE
ハンドル
Definition GxDefine.h:214
RENDER_VIEW
描画優先度(ビュー)
Definition GxRender.h:442
@ MAX
定義数
RENDER_INDEX_TYPE
インデックスバッファ形式
Definition GxRender.h:147
RENDER_STATE
描画ステート
Definition GxRender.h:550
RENDER_PRIMITIVE_TYPE
プリミティブ形式
Definition GxRender.h:131
RENDER_SHADER
Definition GxRender.h:75
RENDER_PASS
描画優先度(パス)
Definition GxRender.h:515
@ RENDER_VERTEX_STREAM_COUNT_MAX
サポートする頂点ストリーム数
Definition GxRender.h:26
RENDER_SUB_VIEW
描画優先度(サブビュー)
Definition GxRender.h:485
RENDER_STREAM_FREQUENCY_TYPE
頂点頻度タイプ
Definition GxRender.h:225
@ RENDER
レンダリング
ハンドラ基本クラス
Definition GxCallback.h:27
オブジェクト基底クラス
Definition GxBase.h:88
コンピュートシェーダを管理する
Definition GxRenderComputeShader.h:21
描画コマンドの並列発行を管理します。
Definition GxRenderContext.h:28
constexpr void endMarker(GX_CSTR)
マーカー終了
Definition GxRenderContext.h:256
constexpr RENDER_SUB_VIEW getSubView(void) const
サブビューの取得(シャドウマップや反射マップなど)
Definition GxRenderContext.h:107
GX_FORCE_INLINE b32 canNotSkipThisFrame(void) const
このフレームのスキップが禁止されているか
Definition GxRenderContext.h:233
constexpr RENDER_VIEW getView(void) const
ビューの取得(画面分割など、別のビューポート)
Definition GxRenderContext.h:102
void setCallbackAsync(GxCallback::GxHandlerBase handle, void *pSource, void *pArgument)
コールバックの設定(非同期用)
constexpr u32 getSubPriority(void) const
サブプライオリティの取得(パス内での優先度)
Definition GxRenderContext.h:119
GX_FORCE_INLINE void doNotSkipThisFrame(void)
このフレームのスキップを禁止
Definition GxRenderContext.h:231
constexpr RENDER_PASS getPass(void) const
パスの取得(Zプリパス、不透明パスなど)
Definition GxRenderContext.h:112
static GX_FORCE_INLINE GxRenderContext * getContext(void)
カレントスレッドのコンテキストを取得
Definition GxRenderContext.h:94
void assembleFinalVrImage(void *pPacket, u32 packetSize)
VR用の最終的な両目の画像を作成
描画関連の依存をこのクラスで吸収します
Definition GxRenderDevice.h:450
COMMAND_TYPE
コマンドタイプ
Definition GxRenderDevice.h:528
インデックスバッファを管理する
Definition GxRenderIndexBuffer.h:20
ピクセルシェーダを管理する
Definition GxRenderPixelShader.h:20
シェーダ共通の処理を記述
Definition GxRenderShader.h:20
テクスチャクラス
Definition GxRenderTexture.h:19
頂点バッファを管理する
Definition GxRenderVertexBuffer.h:20
頂点シェーダに渡す頂点の宣言を管理する
Definition GxRenderVertexDeclaration.h:22
頂点シェーダを管理する
Definition GxRenderVertexShader.h:22
描画システムクラス
Definition GxSysRenderBase.h:115
static GxThread * getCurrentThread(void)
カレントスレッドを取得
Definition GxThread.cpp:505
constexpr u32 getIndex(void) const
インデックスを取得
Definition GxThread.h:251
static constexpr u32 THREAD_MAX
スレッドの最大数
Definition GxThread.h:188
色(HDR)
Definition GxColor.h:241
Definition GxColor.h:21
4×4行列(GPU用)
Definition GxMatrix.h:915
アフィン変換行列(GPU用)
Definition GxMatrix.h:874
座標
Definition GxStruct.h:867
矩形
Definition GxStruct.h:951
アルファテストステート
Definition GxRender.h:731
ブレンドステート
Definition GxRender.h:847
深度テストステート
Definition GxRender.h:601
描画コマンド共通情報
Definition GxRenderDevice.h:2459
描画パケット
Definition GxRenderDevice.h:2427
レジスタ情報
Definition GxRenderDevice.h:2436
レジスタセット情報
Definition GxRenderDevice.h:2449
頂点ストリーム情報
Definition GxRenderDevice.h:480
サンプラステート
Definition GxRender.h:1046
ステンシルテストステート
Definition GxRender.h:654
頂点宣言に使用する、頂点要素を定義するための構造体
Definition GxRenderVertexDeclaration.h:125
4次元ベクトル
Definition GxVector.h:582
32bitブーリアン
Definition GxDefine.h:173
描画優先度
Definition GxRenderDevice.h:505