OROCHI
 
Loading...
Searching...
No Matches
GxRenderDevice.inl
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11#pragma once
12
14#include "GxRenderIndexBuffer.h"
17#include "GxRenderPixelShader.h"
18#include "GxRenderHullShader.h"
21#include "GxRenderTexture.h"
22
23GX_CORE_NAMESPACE_BEGIN()
24
25//===========================================================================
28//===========================================================================
30{
31 //-------------------------------------------------------------
33 //-------------------------------------------------------------
35public:
36 GX_RTTI_ABSTRACT_CLASS(GxVramAllocator, GxClassBase)
37 // ClassBase継承クラス用禁止宣言
39 // new, delete定義
40 GX_OPERATOR_NEW_DELETE(GxAllocatorList::ALLOCATOR_TYPE::RENDER)
41
42 friend class GxRenderDevice;
44 static const u32 BLOCK_COUNT_MAX = 102400;
45
47 struct GxBlock
48 {
49 void* _pAddress;
50 size_t _size;
53#if defined(_WINDOWS) || defined(_XBOX_XS)
54 void* _pObject;
55#endif //_WINDOWS || _XBOX_XS
56 };
57
59 //-------------------------------------------------------------
61 //-------------------------------------------------------------
63public:
65 GxVramAllocator(void);
66
67protected:
69 virtual b32 initialize(void* pLocalMemory, size_t localMemorySize, void* pMainMemory, size_t mainMemorySize, u32 maxBlockCount = BLOCK_COUNT_MAX);
70
72 virtual void terminate(void);
73
75 //-------------------------------------------------------------
77 //-------------------------------------------------------------
79#if GX_DEVELOP
80public:
82 void mapMemoryBlockInfo(void** ppTopLocal, void** ppTopMain, GxBlock** ppAllocatedBlockTop, GxBlock** ppFreeBlockTopLocal, GxBlock** ppFreeBlockTopMain);
83
85 void unmapMemoryBlockInfo(void);
86
88 b32 isMainMemory(const void* pAddress);
89
90protected:
92 static GxGuiBase* createGui(GxProperty& property, GxTypedObject* pOwner, const GxRtti& rtti, u32 index);
93#endif //GX_DEVELOP
94
95public:
97 void* allocateLocal(u32 size, GxMemory::ALIGNMENT alignment = GxMemory::ALIGNMENT::_16);
99 void* allocateMain(u32 size, GxMemory::ALIGNMENT alignment = GxMemory::ALIGNMENT::_16);
100
102 void free(void* pAddress);
103
104private:
106 void* allocateMemory(u32 size, GxMemory::ALIGNMENT alignment, GxBlock*& pFreeBlockTop);
108 void freeMemory(GxBlock* pBlock, GxBlock*& pFreeBlockTop);
110 void pushUnusedBlock(GxBlock* pBlock);
112 GxBlock* popUnusedBlock(void);
114 void connectUsedBlock(GxBlock* pBlock);
116 void disconnectUsedBlock(GxBlock* pBlock);
118 void connectBlock(GxBlock* pBlock, GxBlock* pPrevious);
120 void mergePreviousBlock(GxBlock* pBlock, GxBlock*& pTop);
122 void mergeNextBlock(GxBlock* pBlock);
123
125 //-----------------------------------------------------------
127 //-----------------------------------------------------------
129public:
131 GX_FORCE_INLINE void getPropertyFreeBlockCount(void* const pValue) { *static_cast<u32*>(pValue) = getFreeMemoryBlockCount(); }
132
134 GX_FORCE_INLINE void getPropertyLocalMemorySize(void* const pValue) { *static_cast<f64*>(pValue) = static_cast<f64>(getLocalMemorySize()) / GxMath::VALUE_1M; }
136 GX_FORCE_INLINE void getPropertyMainMemorySize(void* const pValue) { *static_cast<f64*>(pValue) = static_cast<f64>(getMainMemorySize()) / GxMath::VALUE_1M; }
137
139 GX_FORCE_INLINE void getPropertyUsedLocalMemorySize(void* const pValue) { *static_cast<f64*>(pValue) = static_cast<f64>(getLocalMemorySize() - getFreeLocalMemorySize()) / GxMath::VALUE_1M; }
141 GX_FORCE_INLINE void getPropertyUsedMainMemorySize(void* const pValue) { *static_cast<f64*>(pValue) = static_cast<f64>(getMainMemorySize() - getFreeMainMemorySize()) / GxMath::VALUE_1M; }
142
144 GX_FORCE_INLINE void getPropertyHighLocalMemorySize(void* const pValue) { *static_cast<f64*>(pValue) = static_cast<f64>(getTotalAllocatedHighLocalMemorySize()) / GxMath::VALUE_1M; }
146 GX_FORCE_INLINE void getPropertyHighMainMemorySize(void* const pValue) { *static_cast<f64*>(pValue) = static_cast<f64>(getTotalAllocatedHighMainMemorySize()) / GxMath::VALUE_1M; }
147
149 GX_FORCE_INLINE void getPropertyAllocMaxLocalMemorySize(void* const pValue) { *static_cast<f64*>(pValue) = static_cast<f64>(_localMemoryAllocMaxSize) / GxMath::VALUE_1M; }
151 GX_FORCE_INLINE void getPropertyAllocMaxMainMemorySize(void* const pValue) { *static_cast<f64*>(pValue) = static_cast<f64>(_mainMemoryAllocMaxSize) / GxMath::VALUE_1M; }
152
154 GX_FORCE_INLINE void resetMainDevelopInfo(void) { _pMainMemoryLast = _pMainMemoryTop; _mainMemoryAllocMaxSize = 0; }
156 GX_FORCE_INLINE void resetLocalDevelopInfo(void) { _pLocalMemoryLast = _pLocalMemoryTop; _localMemoryAllocMaxSize = 0; }
157
159 GX_FORCE_INLINE size_t getLocalMemorySize(void) const { return _localMemorySize; }
161 GX_FORCE_INLINE size_t getMainMemorySize(void) const { return _mainMemorySize; }
162
164 size_t getFreeLocalMemorySize(void);
166 size_t getFreeMainMemorySize(void);
167
169 size_t getTotalAllocatedHighLocalMemorySize(void);
171 size_t getTotalAllocatedHighMainMemorySize(void);
172
174 u32 getFreeMemoryBlockCount(void);
175
177 //-------------------------------------------------------------
179 //-------------------------------------------------------------
181private:
182 u32 _maxBlockCount;
183 void* _pLocalMemoryTop;
184 size_t _localMemorySize;
185 void* _pMainMemoryTop;
186 size_t _mainMemorySize;
187 GxBlock* _block;
188 GxBlock* _pAllocatedBlockTop;
189 GxBlock* _pFreeBlockTopLocal;
190 GxBlock* _pFreeBlockTopMain;
191 GxBlock* _pUnusedBlockTop;
192 GxCriticalSection _criticalSection;
193 void* _pLocalMemoryLast;
194 void* _pMainMemoryLast;
195 size_t _localMemoryAllocMaxSize;
196 size_t _mainMemoryAllocMaxSize;
197
199};
200
201//===========================================================================
204//===========================================================================
206{
207 //-------------------------------------------------------------
209 //-------------------------------------------------------------
211public:
212 GX_RTTI_CLASS(GxRawAllocator, GxClassBase)
213 // ClassBase継承クラス用禁止宣言
215 // new, delete定義
216 GX_OPERATOR_NEW_DELETE(GxAllocatorList::ALLOCATOR_TYPE::RENDER)
217
218 friend class GxRenderDevice;
220 static const u32 BLOCK_COUNT_MAX = 102400;
221
230
232 //-------------------------------------------------------------
234 //-------------------------------------------------------------
236public:
238 GxRawAllocator(void);
239
240protected:
242 b32 initialize(void* pMemory, size_t memorySize, u32 maxBlockCount, void* pUserData = nullptr);
243
245 void terminate(void);
246
248 //-------------------------------------------------------------
250 //-------------------------------------------------------------
252#if GX_DEVELOP
253public:
255 void mapMemoryBlockInfo(void** ppTopLocal, GxBlock** ppAllocatedBlockTop, GxBlock** ppFreeBlockTopLocal);
256
258 void unmapMemoryBlockInfo(void);
259#endif //GX_DEVELOP
260
262 void* allocate(u32 size, GxMemory::ALIGNMENT alignment = GxMemory::ALIGNMENT::_16);
264 void free(void* pAddress);
265
266private:
268 void* allocateMemory(u32 size, GxMemory::ALIGNMENT alignment, GxBlock*& pFreeBlockTop);
270 void freeMemory(GxBlock* pBlock, GxBlock*& pFreeBlockTop);
272 void pushUnusedBlock(GxBlock* pBlock);
274 GxBlock* popUnusedBlock(void);
276 void connectUsedBlock(GxBlock* pBlock);
278 void disconnectUsedBlock(GxBlock* pBlock);
280 void connectBlock(GxBlock* pBlock, GxBlock* pPrevious);
282 void mergePreviousBlock(GxBlock* pBlock, GxBlock*& pTop);
284 void mergeNextBlock(GxBlock* pBlock);
285
287 //-----------------------------------------------------------
289 //-----------------------------------------------------------
291public:
293 GX_FORCE_INLINE void getPropertyMemorySize(void* const pValue) { *static_cast<u64*>(pValue) = static_cast<u64>(getMemorySize()); }
295 GX_FORCE_INLINE void getPropertyUsedMemorySize(void* const pValue) { *static_cast<u64*>(pValue) = static_cast<u64>(getMemorySize() - getFreeMemorySize()); }
297 GX_FORCE_INLINE void getPropertyFreeBlockCount(void* const pValue) { *static_cast<u32*>(pValue) = getFreeMemoryBlockCount(); }
299 GX_FORCE_INLINE void getPropertyHighMemorySize(void* const pValue) { *static_cast<u64*>(pValue) = static_cast<u64>(getTotalAllocatedHighMemorySize()); }
301 GX_FORCE_INLINE void getPropertyAllocMaxMemorySize(void* const pValue) { *static_cast<u64*>(pValue) = static_cast<u64>(_memoryAllocMaxSize); }
303 GX_FORCE_INLINE void resetDevelopInfo(void) { _pMemoryLast = _pMemoryTop; _memoryAllocMaxSize = 0; }
304
306 GX_FORCE_INLINE size_t getMemorySize(void) const { return _memorySize; }
308 GX_FORCE_INLINE void* getUserData(void) const { return _pUserData; }
310 size_t getFreeMemorySize(void);
314 u32 getFreeMemoryBlockCount(void);
315
317 //-------------------------------------------------------------
319 //-------------------------------------------------------------
321private:
322 u32 _maxBlockCount;
323 void* _pMemoryTop;
324 void* _pUserData;
325 size_t _memorySize;
326 GxBlock* _pBlock;
327 GxBlock* _pAllocatedBlockTop;
328 GxBlock* _pFreeBlockTop;
329 GxBlock* _pUnusedBlockTop;
330 GxCriticalSection _criticalSection;
331 void* _pMemoryLast;
332 size_t _memoryAllocMaxSize;
333
335};
336
337//---------------------------------------------------------------------------
338// ハンドルからテクスチャを取得
341//---------------------------------------------------------------------------
343{
344 if (handle == GX_INVALID_HANDLE)
345 {
346 return nullptr;
347 }
348 else
349 {
350 if (RENDER_TEXTURE_COUNT_MAX <= handle)
351 {
352 GX_ERROR(false, "無効なテクスチャハンドルが指定されました");
353 return nullptr;
354 }
355 return _pTextureList[handle];
356 }
357}
358
359//---------------------------------------------------------------------------
360// 1メッシュに使用する最大のジョイント数
362//---------------------------------------------------------------------------
364{
365 return _maxSkinningJointCount;
366}
367
368//---------------------------------------------------------------------------
369// 描画リソース登録
372//---------------------------------------------------------------------------
373b32 GxRenderDevice::registerRenderResource(GxRenderResource* pRenderResource)
374{
375 if (_pRenderResourceRegister)
376 {
377 return _pRenderResourceRegister->registerRenderResource(pRenderResource);
378 }
379 return false;
380}
381
382//---------------------------------------------------------------------------
383// 描画リソース解除
386//---------------------------------------------------------------------------
387b32 GxRenderDevice::unregisterRenderResource(GxRenderResource* pRenderResource)
388{
389 if (_pRenderResourceRegister)
390 {
391 return _pRenderResourceRegister->unregisterRenderResource(pRenderResource);
392 }
393 return false;
394}
395
396//---------------------------------------------------------------------------
397// パケットバッファブロックを確保
399//---------------------------------------------------------------------------
400void* GxRenderDevice::allocatePacketBlock(void)
401{
402 return GX_ALLOCATE_MEMORY_TYPE(_pAllocatorContext, static_cast<s32>(GxAllocatorFrame::ALLOCATE_TYPE::HEAD), PACKET_BLOCK_SIZE);
403}
404
405//---------------------------------------------------------------------------
406// コマンドバッファブロックを確保
408//---------------------------------------------------------------------------
409void* GxRenderDevice::allocateCommandBlock(void)
410{
411 return GX_ALLOCATE_MEMORY_TYPE(_pAllocatorContext, static_cast<s32>(GxAllocatorFrame::ALLOCATE_TYPE::TAIL), COMMAND_BLOCK_SIZE);
412}
413
414//---------------------------------------------------------------------------
415// コマンドバッファメモリから確保
417//---------------------------------------------------------------------------
419{
420 return GX_ALLOCATE_MEMORY_TYPE(_pAllocatorContext, static_cast<s32>(GxAllocatorFrame::ALLOCATE_TYPE::TAIL), size);
421}
422
423//---------------------------------------------------------------------------
424// ビューポートの設定
426//---------------------------------------------------------------------------
427void GxRenderDevice::setViewportNoCache(const GxViewportData& viewportData)
428{
429 setViewportNoCache(viewportData._rect, viewportData._nearZ, viewportData._farZ);
430}
431
432//---------------------------------------------------------------------------
433// 描画ステートの設定
436//---------------------------------------------------------------------------
437void GxRenderDevice::setRenderState(RENDER_STATE renderState, u32 value)
438{
439 GX_ASSERT((0 <= static_cast<s32>(renderState)) && (static_cast<s32>(renderState) < static_cast<s32>(RENDER_STATE::MAX)), "無効な描画ステートを設定しようとしました(renderState:%d value:%d)", renderState, value);
440
441 if( _renderStateValueNow[static_cast<s32>(renderState)] != value)
442 {
443 setRenderStateNoCache(renderState, value);
444 }
445}
446
447//---------------------------------------------------------------------------
448// Zテストステートの設定
450//---------------------------------------------------------------------------
451void GxRenderDevice::setDepthTestState(GxRenderDepthTestState state)
452{
453 if( _depthTestStateNow._access32 != state._access32 )
454 {
455 setDepthTestStateNoCache(state);
456 }
457}
458
459//---------------------------------------------------------------------------
460// ステンシルテストステートの設定
464//---------------------------------------------------------------------------
465void GxRenderDevice::setStencilTestState(GxRenderStencilTestState state, u32 stencilRef, b32 stencilTwoSideEnable)
466{
467 if (_stencilTestStateNow._access64 != state._access64 || _stencilRefNow != stencilRef || _stencilTwoSideEnableNow != stencilTwoSideEnable )
468 {
469 setStencilTestStateNoCache(state, stencilRef, stencilTwoSideEnable);
470 }
471}
472
473//---------------------------------------------------------------------------
474// アルファテストステートの設定
476//---------------------------------------------------------------------------
477void GxRenderDevice::setAlphaTestState(GxRenderAlphaTestState state)
478{
479 if( _alphaTestStateNow._access32 != state._access32 )
480 {
481 setAlphaTestStateNoCache(state);
482 }
483}
484
485//---------------------------------------------------------------------------
486// ブレンドステートの設定
488//---------------------------------------------------------------------------
489void GxRenderDevice::setBlendState(GxRenderBlendState state)
490{
491 if( _blendStateNow._access32 != state._access32 )
492 {
493 setBlendStateNoCache(state);
494 }
495}
496
497//---------------------------------------------------------------------------
498// ビューポートの設定
500//---------------------------------------------------------------------------
501void GxRenderDevice::setViewport(const GxViewportData& viewportData)
502{
503 if( (_viewportDataNow._nearZ != viewportData._nearZ) || (_viewportDataNow._farZ != viewportData._farZ) || (_viewportDataNow._rect != viewportData._rect) )
504 {
505 setViewportNoCache(viewportData);
506 }
507}
508
509//---------------------------------------------------------------------------
510// シザリング矩形の設定
512//---------------------------------------------------------------------------
513void GxRenderDevice::setScissorRect(const GxRect& rect)
514{
515 if( _scissorRectNow != rect )
516 {
517 setScissorRectNoCache(rect);
518 }
519}
520
521//---------------------------------------------------------------------------
522// 頂点ストリームの設定
525//---------------------------------------------------------------------------
526void GxRenderDevice::setVertexStream(u32 slot, const GxVertexStream* pVertexStream)
527{
529 {
530 GX_ERROR(false, "最大ストリーム数を超えるスロットに頂点バッファをセットしようとしました(slot:%d, max:%d)", slot, RENDER_VERTEX_STREAM_COUNT_MAX);
531 }
532 else
533 {
534#if defined(_WINDOWS) || defined(_XBOX_XS)
535 if ((_vertexStreamNow[slot]._access64 != pVertexStream->_access64) || (_instanceCountNow[slot] != 0))
536#else //_WINDOWS || _XBOX_XS
537 if ((_vertexStreamNow[slot]._access64 != pVertexStream->_access64))
538#endif // !(_WINDOWS || _XBOX_XS)
539 {
540 setVertexStreamNoCache(slot, pVertexStream);
541 }
542 }
543}
544
545#if defined(_WINDOWS) || defined(_XBOX_XS)
546//---------------------------------------------------------------------------
547// 頂点ストリームの設定
551//---------------------------------------------------------------------------
552void GxRenderDevice::setVertexStream(u32 slot, const GxVertexStream* pVertexStream, u32 instanceCount)
553{
555 {
556 GX_ERROR(false, "最大ストリーム数を超えるスロットに頂点バッファをセットしようとしました(slot:%d, max:%d)", slot, RENDER_VERTEX_STREAM_COUNT_MAX);
557 }
558 else if( (_vertexStreamNow[slot]._access64 != pVertexStream->_access64) || (_instanceCountNow[slot] != instanceCount) )
559 {
560 setVertexStreamNoCache(slot, pVertexStream, instanceCount);
561 }
562}
563#endif // _WINDOWS || _XBOX_XS
564
565//---------------------------------------------------------------------------
566// インデックスバッファの設定
568//---------------------------------------------------------------------------
569void GxRenderDevice::setIndexBuffer(GxRenderIndexBuffer* pIndexBuffer)
570{
571 if( _pIndexBufferNow != pIndexBuffer )
572 {
573 setIndexBufferNoCache(pIndexBuffer);
574 }
575}
576
577//---------------------------------------------------------------------------
578// 頂点宣言の設定
580//---------------------------------------------------------------------------
581void GxRenderDevice::setVertexDeclaration(GxRenderVertexDeclaration* pVertexDeclaration)
582{
583 if( _pVertexDeclarationNow != pVertexDeclaration )
584 {
585 setVertexDeclarationNoCache(pVertexDeclaration);
586 }
587}
588
589//---------------------------------------------------------------------------
590// シェーダの設定
593//---------------------------------------------------------------------------
594void GxRenderDevice::setShader(RENDER_SHADER renderShader, GxRenderShader* pShader)
595{
596 if( _pShaderNow[static_cast<u32>(renderShader)] != pShader)
597 {
598 setShaderNoCache(renderShader, pShader);
599 }
600}
601
602//---------------------------------------------------------------------------
603// シェーダ定数の設定
609//---------------------------------------------------------------------------
610#if defined(_NX64)
611void GxRenderDevice::setShaderConstantB(RENDER_SHADER renderShader, u32 startRegister, const b32* pBooleanArray, u32 count, u32 bindLocationIndex)
612#else //_NX64
613void GxRenderDevice::setShaderConstantB(RENDER_SHADER /*renderShader*/, u32 /*startRegister*/, const b32* pBooleanArray, u32 count)
614#endif // !_NX64
615{
616 if (pBooleanArray && (count != 0))
617 {
618#if defined(_WINDOWS) || defined(_PS4) || defined(_XBOX_XS)
619#if GX_USE_DX11 || GX_USE_DX12
620 // TODO: DX11
621#else //GX_USE_DX11 || GX_USE_DX12
622 _pDirect3DDevice9->SetVertexShaderConstantB(startRegister, reinterpret_cast<const BOOL*>(pBooleanArray), count);
623#endif // !(GX_USE_DX11 || GX_USE_DX12)
624#elif defined(_NX64)
625 const u32 size = sizeof(b32) * count;
626 GX_ASSERT(bindLocationIndex * sizeof(GxVector4) + size <= RENDER_UNIFORM_BLOCK_CONST_MAX, "シェーダの定数ブロック内レジスタ領域が足りません");
627 auto* pBuffer = static_cast<GxVector4*>(_registerBlockInformation[static_cast<u32>(renderShader)][startRegister]._pBuffer);
628 GX_MEMCPY(pBuffer + bindLocationIndex, pBooleanArray, size);
629 _registerBlockInformation[static_cast<u32>(renderShader)][startRegister]._blockSize = GxMath::getMax(_registerBlockInformation[static_cast<u32>(renderShader)][startRegister]._blockSize, bindLocationIndex * static_cast<u32>(sizeof(GxVector4)) + size);
630 _registerBlockInformationCount[static_cast<u32>(renderShader)] = GxMath::getMax(_registerBlockInformationCount[static_cast<u32>(renderShader)], startRegister + 1);
631#endif //_NX64
632 }
633}
634
635//---------------------------------------------------------------------------
636// シェーダ定数の設定
642//---------------------------------------------------------------------------
643#if defined(_NX64)
644void GxRenderDevice::setShaderConstantI(RENDER_SHADER renderShader, u32 startRegister, const s32* pIntArray, u32 count, u32 bindLocationIndex)
645#else //_NX64
646void GxRenderDevice::setShaderConstantI(RENDER_SHADER /*renderShader*/, u32 /*startRegister*/, const s32* pIntArray, u32 count)
647#endif // !_NX64
648{
649 if (pIntArray && (count != 0))
650 {
651#if defined(_WINDOWS) || defined(_PS4) || defined(_XBOX_XS)
652#if GX_USE_DX11 || GX_USE_DX12
653 // TODO: DX11
654#else //GX_USE_DX11 || GX_USE_DX12
655 _pDirect3DDevice9->SetVertexShaderConstantI(startRegister, reinterpret_cast<const s32*>(pIntArray), count);
656#endif // !(GX_USE_DX11 || GX_USE_DX12)
657#elif defined(_NX64)
658 const u32 size = sizeof(s32) * count;
659 GX_ASSERT(bindLocationIndex * sizeof(GxVector4) + size <= RENDER_UNIFORM_BLOCK_CONST_MAX, "シェーダの定数ブロック内レジスタ領域が足りません");
660 auto* pBuffer = static_cast<GxVector4*>(_registerBlockInformation[static_cast<u32>(renderShader)][startRegister]._pBuffer);
661 GX_MEMCPY(pBuffer + bindLocationIndex, pIntArray, size);
662 _registerBlockInformation[static_cast<u32>(renderShader)][startRegister]._blockSize = GxMath::getMax(_registerBlockInformation[static_cast<u32>(renderShader)][startRegister]._blockSize, bindLocationIndex * static_cast<u32>(sizeof(GxVector4)) + size);
663 _registerBlockInformationCount[static_cast<u32>(renderShader)] = GxMath::getMax(_registerBlockInformationCount[static_cast<u32>(renderShader)], startRegister + 1);
664#endif //_NX64
665 }
666}
667
668//---------------------------------------------------------------------------
669// シェーダ定数の設定
675//---------------------------------------------------------------------------
676#if defined(_NX64)
677void GxRenderDevice::setShaderConstantF(RENDER_SHADER renderShader, u32 startRegister, const f32* pFloatArray, u32 count, u32 bindLocationIndex)
678#else //_NX64
679void GxRenderDevice::setShaderConstantF(RENDER_SHADER renderShader, u32 startRegister, const f32* pFloatArray, u32 count)
680#endif // !_NX64
681{
682 if( pFloatArray && (count != 0) )
683 {
684 if( RENDER_SHADER_CONST_MAX < startRegister + count )
685 {
686 GX_ERROR(false, "サポートするシェーダレジスタ数をオーバーしています。(start:%d count:%d)", startRegister, count);
687 }
688 else
689 {
690#if GX_USE_DX11
691 if (_pShaderNow[static_cast<u32>(renderShader)])
692 {
693 _pShaderNow[static_cast<u32>(renderShader)]->writeConstantBuffer(startRegister, pFloatArray, count);
694 }
695#elif defined(_PS5) || GX_USE_DX12
696 GX_MEMCPY(&_shaderConstSet[static_cast<u32>(renderShader)][startRegister], pFloatArray, sizeof(GxVector4) * count);
697#elif defined(_NX64)
698 const u32 size = sizeof(GxVector4) * count;
699 GX_ASSERT(bindLocationIndex * sizeof(GxVector4) + size <= RENDER_UNIFORM_BLOCK_CONST_MAX, "シェーダの定数ブロック内レジスタ領域が足りません");
700 auto* pBuffer = static_cast<GxVector4*>(_registerBlockInformation[static_cast<u32>(renderShader)][startRegister]._pBuffer);
701 GX_MEMCPY(pBuffer + bindLocationIndex, pFloatArray, size);
702 _registerBlockInformation[static_cast<u32>(renderShader)][startRegister]._blockSize = GxMath::getMax(_registerBlockInformation[static_cast<u32>(renderShader)][startRegister]._blockSize, bindLocationIndex * static_cast<u32>(sizeof(GxVector4)) + size);
703 _registerBlockInformationCount[static_cast<u32>(renderShader)] = GxMath::getMax(_registerBlockInformationCount[static_cast<u32>(renderShader)], startRegister + 1);
704#endif //_NX64
705 }
706 }
707}
708
709//---------------------------------------------------------------------------
710// テクスチャの設定
715//---------------------------------------------------------------------------
716void GxRenderDevice::setTexture(RENDER_SHADER renderShader, u32 samplerIndex, GxRenderTexture* pTexture, b32 isUav)
717{
718 if( RENDER_TEXTURE_SAMPLER_COUNT_MAX <= samplerIndex)
719 {
720 GX_ERROR(false, "最大サンプラ数を超えるサンプラにテクスチャをセットしようとしました(samplerIndex:%d, max:%d)", samplerIndex, RENDER_TEXTURE_SAMPLER_COUNT_MAX);
721 }
722 else
723 {
724 if (isUav)
725 {
726 if (_pSamplerUavNow[static_cast<u32>(renderShader)][samplerIndex] != pTexture)
727 {
728 setTextureNoCache(renderShader, samplerIndex, pTexture, true);
729 }
730 }
731 else
732 {
733 if (_pSamplerNow[static_cast<u32>(renderShader)][samplerIndex] != pTexture)
734 {
735 setTextureNoCache(renderShader, samplerIndex, pTexture, false);
736 }
737 }
738 }
739}
740
741//---------------------------------------------------------------------------
742// テクスチャサンプラの設定
746//---------------------------------------------------------------------------
747void GxRenderDevice::setSamplerState(RENDER_SHADER renderShader, u32 samplerIndex, GxRenderSamplerState state)
748{
749 if( RENDER_TEXTURE_SAMPLER_COUNT_MAX <= samplerIndex)
750 {
751 GX_ERROR(false, "最大サンプラ数を超えるサンプラにテクスチャをセットしようとしました(samplerIndex:%d, max:%d)", samplerIndex, RENDER_TEXTURE_SAMPLER_COUNT_MAX);
752 }
753 else
754 {
755 if (_samplerStateNow[static_cast<u32>(renderShader)][samplerIndex]._access32 != state._access32)
756 {
757 setSamplerStateNoCache(renderShader, samplerIndex, state);
758 }
759 }
760}
761
762//---------------------------------------------------------------------------
763// レンダーターゲットの設定
766//---------------------------------------------------------------------------
767void GxRenderDevice::setRenderTarget(u32 index, GxRenderTexture* pRenderTarget)
768{
769 GX_ASSERT(index<RENDER_TARGET_COUNT_MAX || !pRenderTarget, "サポート外のレンダーターゲットが指定されました(index:%d)", index);
770
771 if( _pRenderTargetNow[index] != pRenderTarget )
772 {
773 setRenderTargetNoCache(index, pRenderTarget);
774 }
775}
776
777//---------------------------------------------------------------------------
778// 深度ステンシルの設定
781//---------------------------------------------------------------------------
782void GxRenderDevice::setDepthStencil(GxRenderTexture* pDepthStencil, b32 readOnly)
783{
784 if( _pDepthStencilNow != pDepthStencil || _isReadOnlyDepthStencilNow != readOnly)
785 {
786 setDepthStencilNoCache(pDepthStencil,readOnly);
787 }
788}
789
790//---------------------------------------------------------------------------
791// プレディケーションの設定
793//---------------------------------------------------------------------------
794void GxRenderDevice::setPredication(const GxCommandSetPredication* pCommand)
795{
796 if( pCommand->_pFlag == nullptr )
797 {
798 _isInFailedPredication = false;
799 }
800 else
801 {
802 b32 value = false;
803 {
804 for(u32 i = 0; i < pCommand->_size; i++)
805 {
806 if( static_cast<const u8*>(pCommand->_pFlag)[i] )
807 {
808 value = true;
809 break;
810 }
811 }
812 }
813 _isInFailedPredication = (value != pCommand->_value);
814 }
815}
816
817//---------------------------------------------------------------------------
818// メインメモリサイズ取得
820//---------------------------------------------------------------------------
822{
823 GX_ASSERT(_pVramAllocator, "VRAMアロケータが初期化されていません");
824 return _pVramAllocator->getMainMemorySize();
825}
826
827//---------------------------------------------------------------------------
828// 空きメインメモリサイズ取得
830//---------------------------------------------------------------------------
832{
833 GX_ASSERT(_pVramAllocator, "VRAMアロケータが初期化されていません");
834 return _pVramAllocator->getFreeMainMemorySize();
835}
836
837//---------------------------------------------------------------------------
838// ローカルメモリサイズ取得
840//---------------------------------------------------------------------------
842{
843 GX_ASSERT(_pVramAllocator, "VRAMアロケータが初期化されていません");
844 return _pVramAllocator->getLocalMemorySize();
845}
846
847//---------------------------------------------------------------------------
848// 空きローカルメモリサイズ取得
850//---------------------------------------------------------------------------
852{
853 GX_ASSERT(_pVramAllocator, "VRAMアロケータが初期化されていません");
854 return _pVramAllocator->getFreeLocalMemorySize();
855}
856
857//---------------------------------------------------------------------------
858// 最大到達ローカルメモリサイズ取得
860//---------------------------------------------------------------------------
862{
863 GX_ASSERT(_pVramAllocator, "VRAMアロケータが初期化されていません");
864 return _pVramAllocator->getTotalAllocatedHighLocalMemorySize();
865}
866
867//---------------------------------------------------------------------------
868// 最大到達メインメモリサイズ取得
870//---------------------------------------------------------------------------
872{
873 GX_ASSERT(_pVramAllocator, "VRAMアロケータが初期化されていません");
874 return _pVramAllocator->getTotalAllocatedHighMainMemorySize();
875}
876
877#if defined(_PS4) || defined(_PS5) || defined(_NX64)
878//---------------------------------------------------------------------------
879// ローカルメモリ確保
883//---------------------------------------------------------------------------
884void* GxRenderDevice::allocateLocal(u32 size, u32 alignment)
885{
886 GX_ASSERT(_pVramAllocator, "VRAMアロケータが初期化されていません");
887
888 return _pVramAllocator->allocateLocal(size, static_cast<GxMemory::ALIGNMENT>(alignment));
889}
890
891//---------------------------------------------------------------------------
892// メインメモリ確保
896//---------------------------------------------------------------------------
897void* GxRenderDevice::allocateMain(u32 size, u32 alignment)
898{
899 GX_ASSERT(_pVramAllocator, "VRAMアロケータが初期化されていません");
900
901 return _pVramAllocator->allocateMain(size, static_cast<GxMemory::ALIGNMENT>(alignment));
902}
903
904//---------------------------------------------------------------------------
905// メモリ解放
907//---------------------------------------------------------------------------
908void GxRenderDevice::free(void* pAddress)
909{
910 GX_ASSERT(_pVramAllocator, "VRAMアロケータが初期化されていません");
911
912 _pVramAllocator->free(pAddress);
913}
914#endif //_PS4 || _PS5 || _NX64
915
916#if defined(_NX64)
917//---------------------------------------------------------------------------
918// TexturePoolに登録
922//---------------------------------------------------------------------------
923u32 GxRenderDevice::registerTexturePool(GxNativeTexture* pTexture, GxNativeTextureView* pView)
924{
925 return _pTexturePoolManager->registerTexture(pTexture, pView);
926}
927
928//---------------------------------------------------------------------------
929// TexturePoolに登録解除
931//---------------------------------------------------------------------------
932void GxRenderDevice::unregisterTexturePool(u32 id)
933{
934 _pTexturePoolManager->unregisterTexture(id);
935}
936
937//---------------------------------------------------------------------------
938// SamplerPoolに登録
941//---------------------------------------------------------------------------
942u32 GxRenderDevice::registerSamplerPool(GxNativeSampler* pSampler)
943{
944 return _pTexturePoolManager->registerSampler(pSampler);
945}
946
947//---------------------------------------------------------------------------
948// SamplerPoolに登録
951//---------------------------------------------------------------------------
952u32 GxRenderDevice::registerSamplerPool(GxNativeSamplerBuilder* pBuilder)
953{
954 return _pTexturePoolManager->registerSampler(pBuilder);
955}
956
957//---------------------------------------------------------------------------
958// サンプラを作成
961//---------------------------------------------------------------------------
962u32 GxRenderDevice::createSampler(GxRenderSamplerState sampler)
963{
964 return _pTexturePoolManager->createSampler(sampler);
965}
966
967//---------------------------------------------------------------------------
968// SamplerPoolから登録を解除
970//---------------------------------------------------------------------------
971void GxRenderDevice::unregisterSamplerPool(u32 id)
972{
973 _pTexturePoolManager->unregisterSampler(id);
974}
975
976#endif // _NX64
977
978GX_CORE_NAMESPACE_END()
#define GX_ALLOCATE_MEMORY_TYPE(allocator, type, size)
Definition GxAllocator.h:566
#define GX_PROHIBIT_CLASS_BASE(__CLASS__)
GxClassBase継承の禁止宣言
Definition GxBase.h:240
void GxTypedObject
その他
Definition GxDefine.h:213
u32 GX_HANDLE
ハンドル
Definition GxDefine.h:214
RENDER_STATE
描画ステート
Definition GxRender.h:550
@ MAX
定義数
RENDER_SHADER
Definition GxRender.h:75
@ RENDER_TEXTURE_COUNT_MAX
同時読み込み可能なテクスチャ数(0は無効を表すので、実際は4095枚)
Definition GxRender.h:40
@ RENDER_TEXTURE_SAMPLER_COUNT_MAX
サポートするテクスチャサンプラ数
Definition GxRender.h:37
@ RENDER_SHADER_CONST_MAX
サポートするシェーダレジスタ数
Definition GxRender.h:29
@ RENDER_TARGET_COUNT_MAX
サポートするレンダーターゲット数
Definition GxRender.h:24
@ RENDER_VERTEX_STREAM_COUNT_MAX
サポートする頂点ストリーム数
Definition GxRender.h:26
コンピュートシェーダクラス
ドメインシェーダクラス
ハルシェーダクラス
インデックスバッファクラス
ピクセルシェーダクラス
テクスチャクラス
頂点バッファクラス
頂点宣言クラス
頂点シェーダクラス
@ TAIL
終端側から確保
@ HEAD
先頭側から確保
@ RENDER
レンダリング
オブジェクト基底クラス
Definition GxBase.h:88
クリティカルセクションクラス
Definition GxThread.h:20
static constexpr u32 VALUE_1M
1M
Definition GxMath.h:139
static GX_FORCE_INLINE T getMax(const T value0, const T value1)
大きいほうを取得
Definition GxMath.h:174
ALIGNMENT
メモリアライメント定義
Definition GxMemory.h:51
@ _16
16byteアライメント
Definition GxMemory.h:54
プロパティクラス
Definition GxProperty.h:48
管理ブロックを外部に置くことで特殊メモリなど無駄なく使いたい場合
Definition GxRenderDevice.inl:206
void free(void *pAddress)
メモリ解放
Definition GxRenderDevice.cpp:12602
size_t getTotalAllocatedHighMemorySize(void)
メモリ最大到達サイズ取得
Definition GxRenderDevice.cpp:12649
b32 initialize(void *pMemory, size_t memorySize, u32 maxBlockCount, void *pUserData=nullptr)
初期化関数
Definition GxRenderDevice.cpp:12507
GX_FORCE_INLINE void * getUserData(void) const
ユーザーデータを取得
Definition GxRenderDevice.inl:308
void terminate(void)
終了関数
Definition GxRenderDevice.cpp:12540
size_t getFreeMemorySize(void)
メモリ空きサイズ取得
Definition GxRenderDevice.cpp:12632
GX_FORCE_INLINE void resetDevelopInfo(void)
メモリ統計情報リセット
Definition GxRenderDevice.inl:303
u32 getFreeMemoryBlockCount(void)
管理ブロックの空き個数を取得
Definition GxRenderDevice.cpp:12659
GX_FORCE_INLINE void getPropertyUsedMemorySize(void *const pValue)
メモリ使用サイズ
Definition GxRenderDevice.inl:295
GX_FORCE_INLINE void getPropertyFreeBlockCount(void *const pValue)
空きブロック数
Definition GxRenderDevice.inl:297
GX_FORCE_INLINE void getPropertyAllocMaxMemorySize(void *const pValue)
メモリ最大確保サイズ
Definition GxRenderDevice.inl:301
GX_FORCE_INLINE size_t getMemorySize(void) const
メモリサイズ取得
Definition GxRenderDevice.inl:306
void * allocate(u32 size, GxMemory::ALIGNMENT alignment=GxMemory::ALIGNMENT::_16)
メモリ確保
Definition GxRenderDevice.cpp:12575
GX_FORCE_INLINE void getPropertyMemorySize(void *const pValue)
メモリサイズ
Definition GxRenderDevice.inl:293
GxRawAllocator(void)
デフォルトコンストラクタ
Definition GxRenderDevice.cpp:12486
static const u32 BLOCK_COUNT_MAX
メモリブロック数
Definition GxRenderDevice.inl:220
GX_FORCE_INLINE void getPropertyHighMemorySize(void *const pValue)
メモリ最大到達サイズ
Definition GxRenderDevice.inl:299
VRAM を管理します
Definition GxRenderDevice.inl:30
size_t getFreeLocalMemorySize(void)
ローカルメモリ空きサイズ取得
Definition GxRenderDevice.cpp:12046
GX_FORCE_INLINE void getPropertyAllocMaxMainMemorySize(void *const pValue)
メインメモリ最大確保サイズ
Definition GxRenderDevice.inl:151
GX_FORCE_INLINE void getPropertyHighLocalMemorySize(void *const pValue)
ローカルメモリ最大到達サイズ
Definition GxRenderDevice.inl:144
GX_FORCE_INLINE void resetLocalDevelopInfo(void)
ローカルメモリ統計情報リセット
Definition GxRenderDevice.inl:156
void * allocateLocal(u32 size, GxMemory::ALIGNMENT alignment=GxMemory::ALIGNMENT::_16)
ローカルメモリ(VRAM)確保
Definition GxRenderDevice.cpp:11946
GX_FORCE_INLINE void getPropertyLocalMemorySize(void *const pValue)
ローカルメモリサイズ
Definition GxRenderDevice.inl:134
GX_FORCE_INLINE size_t getMainMemorySize(void) const
メインメモリサイズ取得
Definition GxRenderDevice.inl:161
size_t getFreeMainMemorySize(void)
メインメモリ空きサイズ取得
Definition GxRenderDevice.cpp:12067
size_t getTotalAllocatedHighLocalMemorySize(void)
ローカルメモリ最大到達サイズ取得
Definition GxRenderDevice.cpp:12088
GX_FORCE_INLINE void getPropertyUsedLocalMemorySize(void *const pValue)
ローカルメモリ消費サイズ
Definition GxRenderDevice.inl:139
GX_FORCE_INLINE void getPropertyFreeBlockCount(void *const pValue)
空きブロック数
Definition GxRenderDevice.inl:131
GX_FORCE_INLINE void getPropertyAllocMaxLocalMemorySize(void *const pValue)
ローカルメモリ最大確保サイズ
Definition GxRenderDevice.inl:149
size_t getTotalAllocatedHighMainMemorySize(void)
メインメモリ最大到達サイズ取得
Definition GxRenderDevice.cpp:12098
GX_FORCE_INLINE void getPropertyUsedMainMemorySize(void *const pValue)
メインメモリ消費サイズ
Definition GxRenderDevice.inl:141
void * allocateMain(u32 size, GxMemory::ALIGNMENT alignment=GxMemory::ALIGNMENT::_16)
メインメモリ(GPUからアクセスできるメインメモリなどドライバに近いメモリ)確保
Definition GxRenderDevice.cpp:11975
GX_FORCE_INLINE void getPropertyMainMemorySize(void *const pValue)
メインメモリサイズ
Definition GxRenderDevice.inl:136
GX_FORCE_INLINE void getPropertyHighMainMemorySize(void *const pValue)
メインメモリ最大到達サイズ
Definition GxRenderDevice.inl:146
GX_FORCE_INLINE void resetMainDevelopInfo(void)
メインメモリ統計情報リセット
Definition GxRenderDevice.inl:154
void free(void *pAddress)
メモリ解放
Definition GxRenderDevice.cpp:12002
GX_FORCE_INLINE size_t getLocalMemorySize(void) const
ローカルメモリサイズ取得
Definition GxRenderDevice.inl:159
描画関連の依存をこのクラスで吸収します
Definition GxRenderDevice.h:450
GX_FORCE_INLINE u32 getMaxSkinningJointCount(void)
1メッシュに使用する最大のジョイント数
Definition GxRenderDevice.inl:363
static constexpr u32 COMMAND_BLOCK_SIZE
コマンドブロックサイズ
Definition GxRenderDevice.h:923
GX_FORCE_INLINE size_t getLocalMemorySize(void) const
VRAMローカルメモリ(ビデオメモリ)サイズ取得
Definition GxRenderDevice.inl:841
GX_FORCE_INLINE size_t getFreeMainMemorySize(void) const
VRAMメインメモリ(GPUからアクセス可能なメインメモリやドライバ目的のメモリ)空きサイズ取得
Definition GxRenderDevice.inl:831
GX_FORCE_INLINE GxRenderTexture * getTextureByHandle(GX_HANDLE handle) const
ハンドルからテクスチャを取得
Definition GxRenderDevice.inl:342
static constexpr u32 PACKET_BLOCK_SIZE
パケットブロックサイズ
Definition GxRenderDevice.h:921
GX_FORCE_INLINE size_t getMainMemorySize(void) const
VRAMメインメモリ(GPUからアクセス可能なメインメモリやドライバ目的のメモリ)サイズ取得
Definition GxRenderDevice.inl:821
GX_FORCE_INLINE size_t getFreeLocalMemorySize(void) const
VRAMローカルメモリ(ビデオメモリ)空きサイズ取得
Definition GxRenderDevice.inl:851
GX_FORCE_INLINE void * allocateCommandBufferMemory(u32 size)
コマンドバッファメモリから確保
Definition GxRenderDevice.inl:418
GX_FORCE_INLINE size_t getTotalAllocatedHighLocalMemorySize(void) const
VRAMローカルメモリ最大到達サイズ取得
Definition GxRenderDevice.inl:861
GX_FORCE_INLINE size_t getTotalAllocatedHighMainMemorySize(void) const
VRAMメインメモリ最大到達サイズ取得
Definition GxRenderDevice.inl:871
インデックスバッファを管理する
Definition GxRenderIndexBuffer.h:20
GPUリソースを管理する
Definition GxRenderResource.h:20
シェーダ共通の処理を記述
Definition GxRenderShader.h:20
テクスチャクラス
Definition GxRenderTexture.h:19
頂点シェーダに渡す頂点の宣言を管理する
Definition GxRenderVertexDeclaration.h:22
実行時型情報クラス
Definition GxRtti.h:154
シングルトン基礎クラス
Definition GxSingleton.h:19
矩形
Definition GxStruct.h:951
アルファテストステート
Definition GxRender.h:731
u32 _access32
データ
Definition GxRender.h:808
ブレンドステート
Definition GxRender.h:847
u32 _access32
データ
Definition GxRender.h:909
深度テストステート
Definition GxRender.h:601
u32 _access32
データ
Definition GxRender.h:644
メモリ管理ブロック構造体
Definition GxRenderDevice.inl:224
GxBlock * _pPrevious
前のブロック(未使用ブロックリストの時は使わない)
Definition GxRenderDevice.inl:228
GxBlock * _pNext
次のブロック
Definition GxRenderDevice.inl:227
void * _pAddress
管理しているメモリアドレス
Definition GxRenderDevice.inl:225
size_t _size
管理しているサイズ
Definition GxRenderDevice.inl:226
GxRect _rect
矩形
Definition GxRenderDevice.h:589
f32 _farZ
farクリップ
Definition GxRenderDevice.h:591
f32 _nearZ
nearクリップ
Definition GxRenderDevice.h:590
メモリ管理ブロック構造体
Definition GxRenderDevice.inl:48
GxBlock * _pPrevious
前のブロック(未使用ブロックリストの時は使わない)
Definition GxRenderDevice.inl:52
GxBlock * _pNext
次のブロック
Definition GxRenderDevice.inl:51
void * _pAddress
管理しているメモリアドレス
Definition GxRenderDevice.inl:49
size_t _size
管理しているサイズ
Definition GxRenderDevice.inl:50
サンプラステート
Definition GxRender.h:1046
u32 _access32
データ
Definition GxRender.h:1182
ステンシルテストステート
Definition GxRender.h:654
u64 _access64
データ
Definition GxRender.h:706
4次元ベクトル
Definition GxVector.h:582
32bitブーリアン
Definition GxDefine.h:173