summaryrefslogtreecommitdiffstats
path: root/RenderScript/src/ScriptParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'RenderScript/src/ScriptParser.cpp')
-rw-r--r--RenderScript/src/ScriptParser.cpp263
1 files changed, 263 insertions, 0 deletions
diff --git a/RenderScript/src/ScriptParser.cpp b/RenderScript/src/ScriptParser.cpp
new file mode 100644
index 0000000..3331eac
--- /dev/null
+++ b/RenderScript/src/ScriptParser.cpp
@@ -0,0 +1,263 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#include "pch.h"
+#include "ScriptParser.h"
+#include "LuaBindings.h"
+#include "SamplerParser.h"
+#include "LayoutDescParser.h"
+#include "ShaderParser.h"
+#include "BufferParser.h"
+#include "TextureParser.h"
+#include "DrawAttribsParser.h"
+#include "FileSystem.h"
+#include "ResourceMappingParser.h"
+#include "TextureViewParser.h"
+#include "BufferViewParser.h"
+#include "DepthStencilStateParser.h"
+#include "RasterizerStateParser.h"
+#include "BlendStateParser.h"
+#include "DeviceContextFuncBindings.h"
+#include "ViewportParser.h"
+#include "ScissorRectParser.h"
+#include "ShaderVariableParser.h"
+
+using namespace Diligent;
+using namespace Diligent;
+
+namespace Diligent
+{
+ const Char* ScriptParser::DeviceContextRegistryKey = "DeviceContext";
+
+#define IMPLEMENT_PUSH_FUNC_STUBS(ObjectType, ParserName) \
+ void ScriptParser::SpecialPushFuncs::PushFuncStub( lua_State *L, const ObjectType* pObject) \
+ { \
+ m_pScriptParser->ParserName->PushObject( L, pObject ); \
+ } \
+ \
+ void ScriptParser::SpecialPushFuncs::PushFuncStub( lua_State *L, const RefCntAutoPtr<ObjectType> &pObject ) \
+ { \
+ PushFuncStub( L, pObject.RawPtr() ); \
+ }
+
+ IMPLEMENT_PUSH_FUNC_STUBS( ISampler, m_pSamplerParser)
+ IMPLEMENT_PUSH_FUNC_STUBS( IVertexDescription, m_pLayoutDescParser )
+ IMPLEMENT_PUSH_FUNC_STUBS( IShader, m_pShaderParser )
+ IMPLEMENT_PUSH_FUNC_STUBS( IBuffer, m_pBufferParser )
+ IMPLEMENT_PUSH_FUNC_STUBS( ITexture, m_pTextureParser )
+ IMPLEMENT_PUSH_FUNC_STUBS( IResourceMapping, m_pResourceMappingParser )
+ IMPLEMENT_PUSH_FUNC_STUBS( ITextureView, m_pTextureViewParser )
+ IMPLEMENT_PUSH_FUNC_STUBS( IBufferView, m_pBufferViewParser )
+ IMPLEMENT_PUSH_FUNC_STUBS( IDepthStencilState, m_pDSStateParser )
+ IMPLEMENT_PUSH_FUNC_STUBS( IRasterizerState, m_pRSParser )
+ IMPLEMENT_PUSH_FUNC_STUBS( IBlendState, m_pBSParser )
+ IMPLEMENT_PUSH_FUNC_STUBS( IShaderVariable, m_pShaderVariableParser )
+
+
+ void ScriptParser::SpecialPushFuncs::PushFuncStub( lua_State *L, const DrawAttribs &DrawAttribs )
+ {
+ m_pScriptParser->m_pDrawAttribsParser->PushObject( L, &DrawAttribs );
+ }
+
+ void ScriptParser::SpecialPushFuncs::PushFuncStub( lua_State *L, const Viewport &Viewport )
+ {
+ m_pScriptParser->m_pViewportParser->PushObject( L, &Viewport );
+ }
+
+ void ScriptParser::SpecialPushFuncs::PushFuncStub( lua_State *L, const Rect &Rect )
+ {
+ m_pScriptParser->m_pScissorRectParser->PushObject( L, &Rect );
+ }
+
+ ScriptParser::ScriptParser( IRenderDevice *pRenderDevice ) :
+ m_pRenderDevice( pRenderDevice ),
+ m_LuaState( LuaState::LUA_LIB_BASE | LuaState::LUA_LIB_COROUTINE | LuaState::LUA_LIB_TABLE |
+ LuaState::LUA_LIB_STRING | LuaState::LUA_LIB_BIT32 | LuaState::LUA_LIB_MATH )
+ {
+ // Run's ctor is called BEFORE the m_LuaState's ctor
+ // We need to explicitly init the object:
+ m_RunFunctionCaller.SetLuaState( m_LuaState );
+ m_RunFunctionCaller.SetScriptParser( this );
+
+ // We need to define global constants before initializing parsers
+ DefineGlobalConstants(m_LuaState);
+
+ m_pSamplerParser.reset( new SamplerParser( pRenderDevice, m_LuaState ) );
+ m_pLayoutDescParser.reset( new LayoutDescParser( pRenderDevice, m_LuaState ) );
+ m_pBufferParser.reset( new BufferParser( pRenderDevice, m_LuaState ) );
+ m_pTextureParser.reset( new TextureParser( pRenderDevice, m_LuaState ) );
+ m_pDrawAttribsParser.reset( new DrawAttribsParser( m_pBufferParser.get(), pRenderDevice, m_LuaState ) );
+ // Texture view parser must be create AFTER texture parser, because it
+ // registers CreateView function in Metatables.Texture table
+ m_pTextureViewParser.reset( new TextureViewParser( m_pTextureParser.get(), m_pSamplerParser.get(), pRenderDevice, m_LuaState ) );
+ m_pBufferViewParser.reset( new BufferViewParser( m_pBufferParser.get(), pRenderDevice, m_LuaState ) );
+ m_pResourceMappingParser.reset( new ResourceMappingParser( pRenderDevice, m_LuaState, m_pTextureViewParser.get(), m_pBufferParser.get(), m_pBufferViewParser.get() ) );
+ m_pShaderParser.reset( new ShaderParser( pRenderDevice, m_LuaState, m_pResourceMappingParser->GetMetatableName() ) );
+ m_pDSStateParser.reset( new DepthStencilStateParser( pRenderDevice, m_LuaState ) );
+ m_pRSParser.reset( new RasterizerStateParser( pRenderDevice, m_LuaState ) );
+ m_pBSParser.reset( new BlendStateParser( pRenderDevice, m_LuaState ) );
+ m_pDeviceCtxFuncBindings.reset( new DeviceContextFuncBindings( pRenderDevice, m_LuaState, m_pTextureViewParser.get() ) );
+ m_pViewportParser.reset( new ViewportParser( pRenderDevice, m_LuaState ) );
+ m_pScissorRectParser.reset( new ScissorRectParser( pRenderDevice, m_LuaState ) );
+ m_pShaderVariableParser.reset( new ShaderVariableParser( pRenderDevice, m_LuaState, m_pShaderParser->GetMetatableName(), m_pBufferParser->GetMetatableName(), m_pBufferViewParser->GetMetatableName(), m_pTextureViewParser->GetMetatableName() ) );
+ }
+
+ ScriptParser::~ScriptParser()
+ {
+ // It is essentially important to close Lua first, because we need to release
+ // all user data
+ m_LuaState.Close();
+ }
+
+ void ScriptParser::DefineGlobalConstants( lua_State *L )
+ {
+ INIT_LUA_STACK_TRACKING( L );
+
+ // Create a new empty table and push it onto the stack
+ lua_newtable( L ); // -0 | +1 -> +1
+
+ const auto &DeviceCaps = m_pRenderDevice->GetDeviceCaps();
+ const Char *pDeviceStr = nullptr;
+ switch(DeviceCaps.DevType)
+ {
+ case DeviceType::OpenGL:
+ pDeviceStr = "OpenGL";
+ break;
+
+ case DeviceType::OpenGLES:
+ pDeviceStr = "OpenGLES";
+ break;
+
+ case DeviceType::DirectX:
+ pDeviceStr = "DirectX";
+ break;
+
+ default:
+ UNEXPECTED( "Unknown device type" );
+ }
+ SetTableField( L, "DeviceType", -1, pDeviceStr ); // -0 | +0 -> 0
+
+ // lua_setglobal() pops a value from the stack and sets it as the new value of global name.
+ lua_setglobal( L, "Constants" ); // -1 | +0 -> -1
+
+ CHECK_LUA_STACK_HEIGHT();
+
+ lua_newtable( L ); // -0 | +1 -> +1
+ lua_setglobal( L, "Context" ); // -1 | +0 -> -1
+
+ CHECK_LUA_STACK_HEIGHT();
+ }
+
+ // Every C-function called by Lua sees only its own private stack, with its first argument at index 1
+ // Return the number of results pushed onto the stack
+
+ void ScriptParser::Parse( const Char *pScript )
+ {
+ // Load the chunck and push it onto the top of the stack.
+ // In case of errors, the error message is pushed onto the top of the stack
+ if( luaL_loadstring( m_LuaState, pScript ) )
+ {
+ // Get the error message from the top of the stack
+
+ // NOTE: the lua_tostring function returns a pointer to an internal copy of the string.
+ // The string is always zero-terminated and Lua ensures that this pointer is valid as long
+ // as the corresponding value is in the stack.
+ auto ErrorMsg = lua_tostring( m_LuaState, -1 );
+
+ if( ErrorMsg )
+ {
+ LOG_ERROR_AND_THROW( "Failed to parse the script file:\n", ErrorMsg );
+ }
+ else
+ {
+ LOG_ERROR_AND_THROW( "Failed to parse the script file." );
+ }
+ lua_pop( m_LuaState, 1 ); // pop error message from the stack
+ }
+ }
+
+ void ScriptParser::GetSamplerByName( const Char *SamplerName, ISampler** ppSampler )
+ {
+ m_pSamplerParser->GetObjectByName( m_LuaState, SamplerName, ppSampler );
+ }
+
+ void ScriptParser::GetVertexDescriptionByName( const Char *VertDescName, IVertexDescription** ppVertDesc )
+ {
+ m_pLayoutDescParser->GetObjectByName( m_LuaState, VertDescName, ppVertDesc );
+ }
+
+ void ScriptParser::GetShaderByName( const Char *ShaderName, IShader** ppShader )
+ {
+ m_pShaderParser->GetObjectByName( m_LuaState, ShaderName, ppShader );
+ }
+
+ void ScriptParser::GetBufferByName( const Char *BufferName, IBuffer** ppBuffer )
+ {
+ m_pBufferParser->GetObjectByName( m_LuaState, BufferName, ppBuffer );
+ }
+
+ void ScriptParser::GetTextureByName( const Char *TextureName, ITexture** ppTexture )
+ {
+ m_pTextureParser->GetObjectByName( m_LuaState, TextureName, ppTexture );
+ }
+
+ void ScriptParser::GetResourceMappingByName( const Char *ResourceMappingName, IResourceMapping** ppResourceMapping )
+ {
+ m_pResourceMappingParser->GetObjectByName( m_LuaState, ResourceMappingName, ppResourceMapping );
+ }
+
+ void ScriptParser::GetTextureViewByName( const Char *TextureViewName, ITextureView** ppTextureView )
+ {
+ m_pTextureViewParser->GetObjectByName( m_LuaState, TextureViewName, ppTextureView );
+ }
+
+ void ScriptParser::GetBufferViewByName( const Char *BufferViewName, IBufferView** ppBufferView )
+ {
+ m_pBufferViewParser->GetObjectByName( m_LuaState, BufferViewName, ppBufferView );
+ }
+
+ void ScriptParser::GetDepthStencilStateByName( const Char *DepthStencilStateName, IDepthStencilState** ppDepthStencilState )
+ {
+ m_pDSStateParser->GetObjectByName( m_LuaState, DepthStencilStateName, ppDepthStencilState );
+ }
+
+ void ScriptParser::GetRasterizerStateByName( const Char *RasterizerStateName, IRasterizerState** ppRasterizerState )
+ {
+ m_pRSParser->GetObjectByName( m_LuaState, RasterizerStateName, ppRasterizerState );
+ }
+
+ void ScriptParser::GetBlendStateByName( const Char *BlendStateName, IBlendState** ppBlendState )
+ {
+ m_pBSParser->GetObjectByName( m_LuaState, BlendStateName, ppBlendState );
+ }
+
+ void ScriptParser::GetShaderVariableByName( const Char *ShaderVarName, IShaderVariable** ppShaderVar )
+ {
+ m_pShaderVariableParser->GetObjectByName( m_LuaState, ShaderVarName, ppShaderVar );
+ }
+
+ void ScriptParser::QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface )
+ {
+ UNSUPPORTED( "Not implemented" );
+ }
+}