summaryrefslogtreecommitdiffstats
path: root/RenderScript
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2019-10-19 19:49:52 +0000
committerEgor Yusov <egor.yusov@gmail.com>2019-10-19 19:49:52 +0000
commit62dbbec16e3fbd9c6a7ab8943e727676d2ca5d20 (patch)
tree3f44b9f89135b3f0107aae5ac71be5d27c6cb4b1 /RenderScript
parentUpdated imgui (diff)
downloadDiligentTools-62dbbec16e3fbd9c6a7ab8943e727676d2ca5d20.tar.gz
DiligentTools-62dbbec16e3fbd9c6a7ab8943e727676d2ca5d20.zip
Few updates to comply with API version 240033
Diffstat (limited to 'RenderScript')
-rw-r--r--RenderScript/include/ScriptParser.h26
-rw-r--r--RenderScript/src/DrawAttribsParser.cpp101
-rw-r--r--RenderScript/src/ScriptParser.cpp28
3 files changed, 126 insertions, 29 deletions
diff --git a/RenderScript/include/ScriptParser.h b/RenderScript/include/ScriptParser.h
index b65b0fc..9e5cf79 100644
--- a/RenderScript/include/ScriptParser.h
+++ b/RenderScript/include/ScriptParser.h
@@ -36,6 +36,28 @@ namespace Diligent
class ScriptParser : public RefCountedObject<IObject>
{
public:
+ struct CombinedDrawAttribs
+ {
+ union
+ {
+ Uint32 NumVertices = 0;
+ Uint32 NumIndices;
+ };
+ VALUE_TYPE IndexType = VT_UNDEFINED;
+ DRAW_FLAGS Flags = DRAW_FLAG_NONE;
+ RESOURCE_STATE_TRANSITION_MODE IndirectAttribsBufferStateTransitionMode = RESOURCE_STATE_TRANSITION_MODE_NONE;
+ Uint32 NumInstances = 1;
+ Uint32 BaseVertex = 0;
+ Uint32 IndirectDrawArgsOffset = 0;
+ union
+ {
+ Uint32 StartVertexLocation = 0;
+ Uint32 FirstIndexLocation;
+ };
+ Uint32 FirstInstanceLocation = 0;
+ IBuffer* pIndirectDrawAttribs = nullptr;
+ };
+
typedef RefCountedObject<IObject> TBase;
ScriptParser( IReferenceCounters* pRefCounters, IRenderDevice* pRenderDevice );
@@ -102,7 +124,9 @@ namespace Diligent
void PushFuncStub( lua_State *L, const RefCntAutoPtr<IBuffer> &pBuffer );
void PushFuncStub( lua_State *L, const ITexture* pTexture );
void PushFuncStub( lua_State *L, const RefCntAutoPtr<ITexture> &pTexture );
- void PushFuncStub( lua_State *L, const DrawAttribs &DrawAttribs );
+ void PushFuncStub( lua_State *L, const struct CombinedDrawAttribs &Attribs );
+ void PushFuncStub( lua_State *L, const DrawAttribs &Attribs );
+ void PushFuncStub( lua_State *L, const DrawIndexedAttribs &Attribs );
void PushFuncStub( lua_State *L, const IResourceMapping* pResourceMapping );
void PushFuncStub( lua_State *L, const RefCntAutoPtr<IResourceMapping> &pResourceMapping );
void PushFuncStub( lua_State *L, const ITextureView* pTextureView );
diff --git a/RenderScript/src/DrawAttribsParser.cpp b/RenderScript/src/DrawAttribsParser.cpp
index 554a9eb..ee395a9 100644
--- a/RenderScript/src/DrawAttribsParser.cpp
+++ b/RenderScript/src/DrawAttribsParser.cpp
@@ -24,9 +24,12 @@
#include "pch.h"
#include "DrawAttribsParser.h"
#include "BufferParser.h"
+#include "ScriptParser.h"
namespace Diligent
{
+ using CombinedDrawAttribs = ScriptParser::CombinedDrawAttribs;
+
const Char* DrawAttribsParser::DrawAttribsLibName = "DrawAttribs";
DrawAttribsParser::DrawAttribsParser( BufferParser *pBuffParser, IRenderDevice *pRenderDevice, lua_State *L ) :
@@ -36,8 +39,8 @@ namespace Diligent
m_BufferMetatableName(pBuffParser->GetMetatableName())
{
// NumVertices and NumIndices are in Union
- DEFINE_BINDER( m_Bindings, DrawAttribs, NumVertices );
- DEFINE_BINDER( m_Bindings, DrawAttribs, NumIndices );
+ DEFINE_BINDER( m_Bindings, CombinedDrawAttribs, NumVertices );
+ DEFINE_BINDER( m_Bindings, CombinedDrawAttribs, NumIndices );
DEFINE_ENUM_ELEMENT_MAPPING( m_DrawFlagsEnumMapping, DRAW_FLAG_NONE );
DEFINE_ENUM_ELEMENT_MAPPING( m_DrawFlagsEnumMapping, DRAW_FLAG_VERIFY_STATES );
@@ -45,40 +48,39 @@ namespace Diligent
DEFINE_ENUM_ELEMENT_MAPPING( m_DrawFlagsEnumMapping, DRAW_FLAG_VERIFY_RENDER_TARGETS );
DEFINE_ENUM_ELEMENT_MAPPING( m_DrawFlagsEnumMapping, DRAW_FLAG_VERIFY_ALL );
- DEFINE_FLAGS_BINDER( m_Bindings, DrawAttribs, Flags, DRAW_FLAGS, m_DrawFlagsEnumMapping );
- DEFINE_ENUM_BINDER( m_Bindings, DrawAttribs, IndirectAttribsBufferStateTransitionMode, m_StateTransitionModeEnumMapping);
+ DEFINE_FLAGS_BINDER( m_Bindings, CombinedDrawAttribs, Flags, DRAW_FLAGS, m_DrawFlagsEnumMapping );
+ DEFINE_ENUM_BINDER( m_Bindings, CombinedDrawAttribs, IndirectAttribsBufferStateTransitionMode, m_StateTransitionModeEnumMapping);
DEFINE_ENUM_ELEMENT_MAPPING( m_ValueTypeEnumMapping, VT_UINT16 );
DEFINE_ENUM_ELEMENT_MAPPING( m_ValueTypeEnumMapping, VT_UINT32 );
- DEFINE_ENUM_BINDER( m_Bindings, DrawAttribs, IndexType, m_ValueTypeEnumMapping );
+ DEFINE_ENUM_BINDER( m_Bindings, CombinedDrawAttribs, IndexType, m_ValueTypeEnumMapping );
- DEFINE_BINDER( m_Bindings, DrawAttribs, IsIndexed );
- DEFINE_BINDER( m_Bindings, DrawAttribs, NumInstances );
+ DEFINE_BINDER( m_Bindings, CombinedDrawAttribs, NumInstances );
- DEFINE_BINDER( m_Bindings, DrawAttribs, BaseVertex );
- DEFINE_BINDER( m_Bindings, DrawAttribs, IndirectDrawArgsOffset );
+ DEFINE_BINDER( m_Bindings, CombinedDrawAttribs, BaseVertex );
+ DEFINE_BINDER( m_Bindings, CombinedDrawAttribs, IndirectDrawArgsOffset );
// StartVertexLocation and FirstIndexLocation are in union
- DEFINE_BINDER( m_Bindings, DrawAttribs, StartVertexLocation );
- DEFINE_BINDER( m_Bindings, DrawAttribs, FirstIndexLocation );
+ DEFINE_BINDER( m_Bindings, CombinedDrawAttribs, StartVertexLocation );
+ DEFINE_BINDER( m_Bindings, CombinedDrawAttribs, FirstIndexLocation );
- DEFINE_BINDER( m_Bindings, DrawAttribs, FirstInstanceLocation );
+ DEFINE_BINDER( m_Bindings, CombinedDrawAttribs, FirstInstanceLocation );
std::vector<String> AllowedMetatable = { "Metatables.Buffer" };
- DEFINE_BINDER_EX( m_Bindings, DrawAttribs, pIndirectDrawAttribs, EngineObjectPtrLoader<IBuffer>, AllowedMetatable );
+ DEFINE_BINDER_EX( m_Bindings, CombinedDrawAttribs, pIndirectDrawAttribs, EngineObjectPtrLoader<IBuffer>, AllowedMetatable );
};
void DrawAttribsParser::CreateObj( lua_State *L )
{
INIT_LUA_STACK_TRACKING(L);
- DrawAttribs DrawAttrs;
+ CombinedDrawAttribs DrawAttrs;
ParseLuaTable( L, 1, &DrawAttrs, m_Bindings );
CHECK_LUA_STACK_HEIGHT();
- auto pDrawAttribs = reinterpret_cast<DrawAttribs*>(lua_newuserdata( L, sizeof( DrawAttribs ) ));
- memcpy(pDrawAttribs, &DrawAttrs, sizeof(DrawAttribs));
+ auto pDrawAttribs = reinterpret_cast<CombinedDrawAttribs*>(lua_newuserdata( L, sizeof( CombinedDrawAttribs ) ));
+ memcpy(pDrawAttribs, &DrawAttrs, sizeof(CombinedDrawAttribs));
CHECK_LUA_STACK_HEIGHT( +1 );
}
@@ -91,37 +93,81 @@ namespace Diligent
void DrawAttribsParser::ReadField( lua_State *L, void *pData, const Char *Field )
{
- auto pDrawAttribs = reinterpret_cast<DrawAttribs*>(pData);
+ auto pDrawAttribs = reinterpret_cast<CombinedDrawAttribs*>(pData);
PushField( L, pDrawAttribs, Field, m_Bindings );
}
void DrawAttribsParser::UpdateField( lua_State *L, void *pData, const Char *Field )
{
- auto pDrawAttribs = reinterpret_cast<DrawAttribs*>(pData);
+ auto pDrawAttribs = reinterpret_cast<CombinedDrawAttribs*>(pData);
Diligent::UpdateField( L, -1, pDrawAttribs, Field, m_Bindings );
}
void DrawAttribsParser::PushExistingObject( lua_State *L, const void *pObject )
{
- auto pDrawAttribs = reinterpret_cast<DrawAttribs*>(lua_newuserdata( L, sizeof( DrawAttribs ) ));
- memcpy( pDrawAttribs, pObject, sizeof( DrawAttribs ) );
+ auto pDrawAttribs = reinterpret_cast<CombinedDrawAttribs*>(lua_newuserdata( L, sizeof( CombinedDrawAttribs ) ));
+ memcpy( pDrawAttribs, pObject, sizeof( CombinedDrawAttribs ) );
}
int DrawAttribsParser::Draw( lua_State *L )
{
- auto pDrawAttribs = GetUserData<DrawAttribs*>( L, 1, m_MetatableRegistryName.c_str() );
+ auto pDrawAttribs = GetUserData<CombinedDrawAttribs*>( L, 1, m_MetatableRegistryName.c_str() );
auto *pContext = LoadDeviceContextFromRegistry( L );
- pContext->Draw( *pDrawAttribs );
+ if (pDrawAttribs->pIndirectDrawAttribs != nullptr)
+ {
+ if (pDrawAttribs->IndexType != VT_UNDEFINED)
+ {
+ DrawIndexedIndirectAttribs Attribs;
+ Attribs.Flags = pDrawAttribs->Flags;
+ Attribs.IndexType = pDrawAttribs->IndexType;
+ Attribs.IndirectAttribsBufferStateTransitionMode = pDrawAttribs->IndirectAttribsBufferStateTransitionMode;
+ Attribs.IndirectDrawArgsOffset = pDrawAttribs->IndirectDrawArgsOffset;
+ pContext->DrawIndexedIndirect(Attribs, pDrawAttribs->pIndirectDrawAttribs);
+ }
+ else
+ {
+ DrawIndirectAttribs Attribs;
+ Attribs.Flags = pDrawAttribs->Flags;
+ Attribs.IndirectAttribsBufferStateTransitionMode = pDrawAttribs->IndirectAttribsBufferStateTransitionMode;
+ Attribs.IndirectDrawArgsOffset = pDrawAttribs->IndirectDrawArgsOffset;
+ pContext->DrawIndirect(Attribs, pDrawAttribs->pIndirectDrawAttribs);
+ }
+ }
+ else
+ {
+ if (pDrawAttribs->IndexType != VT_UNDEFINED)
+ {
+ DrawIndexedAttribs Attribs;
+ Attribs.BaseVertex = pDrawAttribs->BaseVertex;
+ Attribs.FirstIndexLocation = pDrawAttribs->FirstIndexLocation;
+ Attribs.FirstInstanceLocation = pDrawAttribs->FirstInstanceLocation;
+ Attribs.Flags = pDrawAttribs->Flags;
+ Attribs.IndexType = pDrawAttribs->IndexType;
+ Attribs.NumIndices = pDrawAttribs->NumIndices;
+ Attribs.NumInstances = pDrawAttribs->NumInstances;
+ pContext->DrawIndexed(Attribs);
+ }
+ else
+ {
+ DrawAttribs Attribs;
+ Attribs.FirstInstanceLocation = pDrawAttribs->FirstInstanceLocation;
+ Attribs.Flags = pDrawAttribs->Flags;
+ Attribs.NumInstances = pDrawAttribs->NumInstances;
+ Attribs.NumVertices = pDrawAttribs->NumVertices;
+ Attribs.StartVertexLocation = pDrawAttribs->StartVertexLocation;
+ pContext->Draw(Attribs);
+ }
+ }
return 0;
}
int DrawAttribsParser::DispatchCompute( lua_State *L )
{
- DispatchComputeAttribs DispatchAttrs;
if( lua_type( L, 1 ) == LUA_TUSERDATA )
{
- DispatchAttrs.pIndirectDispatchAttribs = *GetUserData<IBuffer**>( L, 1, m_BufferMetatableName.c_str() );
+ DispatchComputeIndirectAttribs DispatchAttrs;
+ auto* pIndirectDispatchAttribs = *GetUserData<IBuffer**>( L, 1, m_BufferMetatableName.c_str() );
int CurrArgInd = 2;
if( CurrArgInd <= lua_gettop( L ) && lua_isnumber( L, CurrArgInd ) )
{
@@ -133,19 +179,22 @@ namespace Diligent
EnumMemberBinder<RESOURCE_STATE_TRANSITION_MODE> StateTransitionModeLoader(0, "StateTransitionMode", m_StateTransitionModeEnumMapping);
StateTransitionModeLoader.SetValue( L, CurrArgInd, &DispatchAttrs.IndirectAttribsBufferStateTransitionMode );
}
+ auto *pContext = LoadDeviceContextFromRegistry( L );
+ pContext->DispatchComputeIndirect( DispatchAttrs, pIndirectDispatchAttribs );
}
else
{
+ DispatchComputeAttribs DispatchAttrs;
if( lua_gettop( L ) >= 1 )
DispatchAttrs.ThreadGroupCountX = ReadValueFromLua<Uint32>( L, 1 );
if( lua_gettop( L ) >= 2 )
DispatchAttrs.ThreadGroupCountY = ReadValueFromLua<Uint32>( L, 2 );
if( lua_gettop( L ) >= 3 )
DispatchAttrs.ThreadGroupCountY = ReadValueFromLua<Uint32>( L, 3 );
+ auto *pContext = LoadDeviceContextFromRegistry( L );
+ pContext->DispatchCompute( DispatchAttrs );
}
- auto *pContext = LoadDeviceContextFromRegistry( L );
- pContext->DispatchCompute( DispatchAttrs );
return 0;
}
diff --git a/RenderScript/src/ScriptParser.cpp b/RenderScript/src/ScriptParser.cpp
index 72c7ee2..7862303 100644
--- a/RenderScript/src/ScriptParser.cpp
+++ b/RenderScript/src/ScriptParser.cpp
@@ -67,9 +67,33 @@ namespace Diligent
IMPLEMENT_PUSH_FUNC_STUBS( IShaderResourceBinding, m_pShaderResBindingParser )
- void ScriptParser::SpecialPushFuncs::PushFuncStub( lua_State *L, const DrawAttribs &DrawAttribs )
+ void ScriptParser::SpecialPushFuncs::PushFuncStub( lua_State *L, const CombinedDrawAttribs &CombinedAttribs )
{
- m_pScriptParser->m_pDrawAttribsParser->PushObject( L, &DrawAttribs );
+ m_pScriptParser->m_pDrawAttribsParser->PushObject( L, &CombinedAttribs );
+ }
+
+ void ScriptParser::SpecialPushFuncs::PushFuncStub( lua_State *L, const DrawAttribs &Attribs )
+ {
+ CombinedDrawAttribs CombinedAttribs;
+ CombinedAttribs.FirstInstanceLocation = Attribs.FirstInstanceLocation;
+ CombinedAttribs.Flags = Attribs.Flags;
+ CombinedAttribs.NumInstances = Attribs.NumInstances;
+ CombinedAttribs.NumVertices = Attribs.NumVertices;
+ CombinedAttribs.StartVertexLocation = Attribs.StartVertexLocation;
+ PushFuncStub( L, CombinedAttribs );
+ }
+
+ void ScriptParser::SpecialPushFuncs::PushFuncStub( lua_State *L, const DrawIndexedAttribs &Attribs )
+ {
+ CombinedDrawAttribs CombinedAttribs;
+ CombinedAttribs.BaseVertex = Attribs.BaseVertex;
+ CombinedAttribs.FirstIndexLocation = Attribs.FirstIndexLocation;
+ CombinedAttribs.FirstInstanceLocation = Attribs.FirstInstanceLocation;
+ CombinedAttribs.Flags = Attribs.Flags;
+ CombinedAttribs.IndexType = Attribs.IndexType;
+ CombinedAttribs.NumIndices = Attribs.NumIndices;
+ CombinedAttribs.NumInstances = Attribs.NumInstances;
+ PushFuncStub( L, CombinedAttribs );
}
void ScriptParser::SpecialPushFuncs::PushFuncStub( lua_State *L, const Viewport &Viewport )