OROCHI
 
Loading...
Searching...
No Matches
GxRenderContext.inl
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11#pragma once
12
13GX_CORE_NAMESPACE_BEGIN()
14
15//---------------------------------------------------------------------------
16// ビューの設定(画面分割など、別のビューポート)
17//
19//---------------------------------------------------------------------------
20void GxRenderContext::setView(RENDER_VIEW view)
21{
22 _priority._view = view;
23#if GX_DEVELOP
24 _pPerformanceCounter = &_performanceCounter[static_cast<s32>(view)]._subView[static_cast<s32>(_priority._subView)];
25#endif // GX_DEVELOP
26}
27
28//---------------------------------------------------------------------------
29// サブビューの設定(シャドウマップや反射マップなど、表示視点に依存しない描画切り替え)
30//
32//---------------------------------------------------------------------------
34{
35 _priority._subView = subView;
36#if GX_DEVELOP
37 _pPerformanceCounter = &_performanceCounter[static_cast<s32>(_priority._view)]._subView[static_cast<s32>(subView)];
38#endif // GX_DEVELOP
39}
40
41//---------------------------------------------------------------------------
42// パスの設定(Zプリパス、不透明パスなど、同視点でのマルチパス描画切り替え)
43//
45//---------------------------------------------------------------------------
47{
48 _priority._pass = pass;
49}
50
51//---------------------------------------------------------------------------
52// サブプライオリティの設定(パス内での優先度)
53//
55//---------------------------------------------------------------------------
57{
58#if GX_DEVELOP
59 if( RENDER_SUB_PRIORITY_LIMIT < subPriority )
60 {
61 GX_ERROR(false, "最大値を超えるサブプライオリティが指定されました(%d/%d)", subPriority, RENDER_SUB_PRIORITY_LIMIT);
62 subPriority = RENDER_SUB_PRIORITY_LIMIT;
63 }
64#endif // GX_DEVELOP
65
66 _priority._subPriority = subPriority;
67}
68
69//---------------------------------------------------------------------------
70// サブプライオリティの設定(パス内での優先度)
71//
73//---------------------------------------------------------------------------
75{
76 _priority._subPriority = static_cast<u32>(GxMath::getSaturate(subPriority) * (RENDER_SUB_PRIORITY_LIMIT - 1));
77}
78
79//---------------------------------------------------------------------------
80// 頂点ストリームの設定
81//
87//---------------------------------------------------------------------------
88void GxRenderContext::setVertexStream(u32 slot, GxRenderVertexBuffer* pVertexBuffer, u32 offset, u32 stride, RENDER_STREAM_FREQUENCY_TYPE frequencyType)
89{
90 GX_ERROR(slot < RENDER_VERTEX_STREAM_COUNT_MAX, "サポートする頂点ストリームを超えるスロットが指定されました(slot:%d)", slot);
91
92#if GX_DEVELOP
93 slot %= RENDER_VERTEX_STREAM_COUNT_MAX; // 開発中は警告を出して、使用できる値にまるめる
94#endif // GX_DEVELOP
95
96 _vertexStream[slot]._pVertexBuffer = pVertexBuffer;
97 _vertexStream[slot]._offset = static_cast<u16>(offset);
98 _vertexStream[slot]._stride = static_cast<u8>(stride);
99 _vertexStream[slot]._frequencyType = static_cast<u8>(frequencyType);
100}
101
102//---------------------------------------------------------------------------
103// インデックスバッファの設定
104//
106//---------------------------------------------------------------------------
108{
109 _pIndexBuffer = pIndexBuffer;
110}
111
112//---------------------------------------------------------------------------
113// 頂点宣言の設定
114//
116//---------------------------------------------------------------------------
118{
119 _drawCommandCommonInfo._pVertexDeclaration = pVertexDeclaration;
120}
121
122//---------------------------------------------------------------------------
123// シェーダの設定
126//---------------------------------------------------------------------------
128{
129#if GX_ENABLE_COMPUTE_SHADER
130 if (renderShader == RENDER_SHADER::COMPUTE)
131 {
132 _pComputeShader = pShader;
133 }
134 else
135#endif //GX_ENABLE_COMPUTE_SHADER
136 {
137 _drawCommandCommonInfo._registerSet[static_cast<u32>(renderShader)]._pShader = pShader;
138 }
139}
140
141//---------------------------------------------------------------------------
142// パラメータ情報に情報を設定し、バッファを確保する
147//---------------------------------------------------------------------------
148void* GxRenderContext::setParameter(GxParameter& parameter, PARAMETER_TYPE type, u32 size)
149{
150 parameter._type = type;
151 parameter._size = size;
152 parameter._pBuffer = allocParameter(size);
153
154 GX_ASSERT(parameter._pBuffer, "パラメータ用のメモリ確保に失敗");
155
156 return parameter._pBuffer;
157}
158
159//---------------------------------------------------------------------------
160// 描画パケット発行
162//---------------------------------------------------------------------------
163void GxRenderContext::sendPacket(void* pCommand)
164{
165 if( _packetCountBlock == 1 )
166 {
167 // パケットが足りなくなったので、描画デバイスから確保
168 auto* pNewPacketBlock = reinterpret_cast<GxRenderDevice::GxPacket*>(getGxRenderDevice()->allocatePacketBlock());
169 GX_ASSERT(pNewPacketBlock, "メモリの確保に失敗");
170
172
173 // 残り1個は残っているはず
174 auto** ppNext = reinterpret_cast<GxRenderDevice::GxPacket**>(_pPacketBlock);
175
176 *ppNext = pNewPacketBlock;
177 _pPacketBlock = pNewPacketBlock;
178 _packetCount++; // アドレス指定用の物もカウントする
179 }
180
181 auto* pPacket = _pPacketBlock++;
182 _packetCountBlock--;
183
184 _packetCount++;
185
186 pPacket->_priority = _priority;
187 pPacket->_pCommandInfo = reinterpret_cast<GxRenderDevice::GxCommandInformation*>(pCommand) - 1;
188}
189
190//---------------------------------------------------------------------------
191// 描画コマンド用メモリ確保
195//---------------------------------------------------------------------------
196void* GxRenderContext::allocCommand(GxRenderDevice::COMMAND_TYPE type, u32 size)
197{
198 size = sizeof(GxRenderDevice::GxCommandInformation) + size;
200
201 if( _commandSizeBlock < size )
202 {
203 // コマンドバッファが足りなくなったので、描画デバイスから確保
204 _pCommandBlock = getGxRenderDevice()->allocateCommandBlock();
205 GX_ASSERT(_pCommandBlock, "コマンドバッファが不足しています。プロジェクト設定でサイズを増やしてください。");
206 _commandSizeBlock = GxRenderDevice::COMMAND_BLOCK_SIZE;
207 }
208
209 auto* pInfo = reinterpret_cast<GxRenderDevice::GxCommandInformation*>(_pCommandBlock);
210 _pCommandBlock = GX_POINTER_ADD(_pCommandBlock, size);
211 _commandSizeBlock -= size;
212
213 pInfo->_type = type;
214 pInfo->_size = size;
215
216 return reinterpret_cast<void*>(pInfo + 1);
217}
218
219//---------------------------------------------------------------------------
220// パラメータ用メモリ確保
223//---------------------------------------------------------------------------
224void* GxRenderContext::allocParameter(u32 size)
225{
226 void* pBuffer = nullptr;
227 if (size != 0)
228 {
230
231 if (_commandSizeBlock < size)
232 {
233 // コマンドバッファが足りなくなったので、描画デバイスから確保
234 _pCommandBlock = getGxRenderDevice()->allocateCommandBlock();
235 GX_ASSERT(_pCommandBlock, "コマンドバッファが不足しています。プロジェクト設定でサイズを増やしてください。");
236 _commandSizeBlock = GxRenderDevice::COMMAND_BLOCK_SIZE;
237 }
238
239 pBuffer = _pCommandBlock;
240 _pCommandBlock = GX_POINTER_ADD(_pCommandBlock, size);
241 _commandSizeBlock -= size;
242 }
243 return pBuffer;
244}
245
246//---------------------------------------------------------------------------
247// レジスタ情報用メモリ確保
250//---------------------------------------------------------------------------
251GxRenderDevice::GxRegisterInformation* GxRenderContext::allocRegisterInfo(u32 count)
252{
253 void* pBuffer = nullptr;
254 if (count != 0)
255 {
256 auto size = GxMath::getRoundUpFast(count * static_cast<u32>(sizeof(GxRenderDevice::GxRegisterInformation)), GxMath::VALUE_16);
257
258 if (_commandSizeBlock < size)
259 {
260 // コマンドバッファが足りなくなったので、描画デバイスから確保
261 _pCommandBlock = getGxRenderDevice()->allocateCommandBlock();
262 GX_ASSERT(_pCommandBlock, "メモリの確保に失敗");
263 _commandSizeBlock = GxRenderDevice::COMMAND_BLOCK_SIZE;
264 }
265
266 pBuffer = _pCommandBlock;
267 _pCommandBlock = GX_POINTER_ADD(_pCommandBlock, size);
268 _commandSizeBlock -= size;
269 }
270 return reinterpret_cast<GxRenderDevice::GxRegisterInformation*>(pBuffer);
271}
272
273GX_CORE_NAMESPACE_END()
RENDER_VIEW
描画優先度(ビュー)
Definition GxRender.h:442
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
static constexpr u32 VALUE_16
16
Definition GxMath.h:123
static GX_FORCE_INLINE T getRoundUpFast(T value, size_t alignment)
数値切り上げ(高速版 ※2のべき乗指定)
Definition GxMath.h:537
static GX_FORCE_INLINE f32 getSaturate(const f32 value)
0.0f~1.0の範囲にクランプした値を取得(f32)
Definition GxMath.h:374
描画コマンドの並列発行を管理します。
Definition GxRenderContext.h:28
GX_FORCE_INLINE void setIndexBuffer(GxRenderIndexBuffer *pIndexBuffer)
インデックスバッファの設定
Definition GxRenderContext.inl:107
GX_FORCE_INLINE void setSubPriorityF32(f32 subPriority)
サブプライオリティの設定(パス内での優先度)
Definition GxRenderContext.inl:74
GX_FORCE_INLINE void setSubPriority(u32 subPriority)
サブプライオリティの設定(パス内での優先度)
Definition GxRenderContext.inl:56
GX_FORCE_INLINE void setSubView(RENDER_SUB_VIEW subView)
サブビューの設定(シャドウマップや反射マップなど)
Definition GxRenderContext.inl:33
GX_FORCE_INLINE void setPass(RENDER_PASS pass)
パスの設定(Zプリパス、不透明パスなど)
Definition GxRenderContext.inl:46
GX_FORCE_INLINE void setVertexDeclaration(GxRenderVertexDeclaration *pVertexDeclaration)
頂点宣言の設定
Definition GxRenderContext.inl:117
GX_FORCE_INLINE void setShader(RENDER_SHADER renderShader, GxRenderShader *pShader)
頂点シェーダの設定
Definition GxRenderContext.inl:127
GX_FORCE_INLINE void setVertexStream(u32 slot, GxRenderVertexBuffer *pVertexBuffer, u32 offset, u32 stride, RENDER_STREAM_FREQUENCY_TYPE frequencyType=RENDER_STREAM_FREQUENCY_TYPE::INDEXED)
頂点ストリームの設定
Definition GxRenderContext.inl:88
static constexpr u32 COMMAND_BLOCK_SIZE
コマンドブロックサイズ
Definition GxRenderDevice.h:923
static constexpr u32 PACKET_BLOCK_SIZE
パケットブロックサイズ
Definition GxRenderDevice.h:921
COMMAND_TYPE
コマンドタイプ
Definition GxRenderDevice.h:528
インデックスバッファを管理する
Definition GxRenderIndexBuffer.h:20
シェーダ共通の処理を記述
Definition GxRenderShader.h:20
頂点バッファを管理する
Definition GxRenderVertexBuffer.h:20
頂点シェーダに渡す頂点の宣言を管理する
Definition GxRenderVertexDeclaration.h:22
描画コマンド情報
Definition GxRenderDevice.h:2418
GxRegisterSet _registerSet[static_cast< u32 >(RENDER_SHADER::DRAW_MAX)]
レジスタセット情報
Definition GxRenderDevice.h:2461
GxRenderVertexDeclaration * _pVertexDeclaration
頂点定義
Definition GxRenderDevice.h:2460
描画パケット
Definition GxRenderDevice.h:2427
レジスタ情報
Definition GxRenderDevice.h:2436
u16 _offset
オフセット
Definition GxRenderDevice.h:486
GxRenderVertexBuffer * _pVertexBuffer
頂点バッファ
Definition GxRenderDevice.h:485
u8 _stride
ストライド
Definition GxRenderDevice.h:487
u8 _frequencyType
頻度タイプ
Definition GxRenderDevice.h:488
u32 _subPriority
サブプライオリティ
Definition GxRenderDevice.h:519
RENDER_VIEW _view
ビュー
Definition GxRenderDevice.h:516
RENDER_PASS _pass
パス
Definition GxRenderDevice.h:518
RENDER_SUB_VIEW _subView
サブビュー
Definition GxRenderDevice.h:517