summaryrefslogtreecommitdiffstats
path: root/RenderScript/src/BufferViewParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'RenderScript/src/BufferViewParser.cpp')
-rw-r--r--RenderScript/src/BufferViewParser.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/RenderScript/src/BufferViewParser.cpp b/RenderScript/src/BufferViewParser.cpp
index cbd7aec..2dae7a2 100644
--- a/RenderScript/src/BufferViewParser.cpp
+++ b/RenderScript/src/BufferViewParser.cpp
@@ -25,11 +25,41 @@
#include "BufferViewParser.h"
#include "BufferParser.h"
#include "SamplerParser.h"
+#include "GraphicsAccessories.h"
namespace Diligent
{
const Char* BufferViewParser::BufferViewLibName = "BufferView";
+ template<>
+ class MemberBinder<BufferFormat> : public MemberBinderBase
+ {
+ public:
+ MemberBinder( size_t MemberOffset, size_t Dummy ) :
+ MemberBinderBase( MemberOffset )
+ {
+ DEFINE_ENUM_BINDER( m_Bindings, BufferFormat, ValueType, m_ValueTypeEnumMapping );
+ using NumComponentsType = decltype(BufferFormat::NumComponents);
+ DEFINE_BINDER_EX( m_Bindings, BufferFormat, NumComponents, NumComponentsType, Validator<NumComponentsType>( "Num Components", 1, 4 ) );
+ DEFINE_BINDER( m_Bindings, BufferFormat, IsNormalized );
+ }
+
+ virtual void GetValue( lua_State *L, const void* pBasePointer )
+ {
+ const auto &BuffFmt = GetMemberByOffest<BufferFormat>( pBasePointer, m_MemberOffset );
+ PushLuaTable( L, &BuffFmt, m_Bindings );
+ }
+
+ virtual void SetValue( lua_State *L, int Index, void* pBasePointer )
+ {
+ auto &BuffFmt = GetMemberByOffest<BufferFormat>( pBasePointer, m_MemberOffset );
+ ParseLuaTable( L, Index, &BuffFmt, m_Bindings );
+ }
+ private:
+ BindingsMapType m_Bindings;
+ ValueTypeEnumMapping m_ValueTypeEnumMapping;
+ };
+
BufferViewParser::BufferViewParser( BufferParser *pBufParser,
IRenderDevice *pRenderDevice,
lua_State *L ) :
@@ -48,6 +78,8 @@ namespace Diligent
VERIFY( m_ViewTypeEnumMapping.m_Val2StrMap.size() == BUFFER_VIEW_NUM_VIEWS - 1,
"Unexpected map size. Did you update BUFFER_VIEW_TYPE enum?" );
DEFINE_ENUM_BINDER( m_Bindings, SBuffViewDescWrapper, ViewType, m_ViewTypeEnumMapping );
+
+ DEFINE_BINDER_EX( m_Bindings, SBuffViewDescWrapper, Format, BufferFormat, 0 );
DEFINE_BINDER( m_Bindings, SBuffViewDescWrapper, ByteOffset);
DEFINE_BINDER( m_Bindings, SBuffViewDescWrapper, ByteWidth);
@@ -65,6 +97,22 @@ namespace Diligent
auto ppBufferView = reinterpret_cast<IBufferView**>(lua_newuserdata( L, sizeof( IBufferView* ) ));
*ppBufferView = nullptr;
+
+ auto& BuffFmt = BufferViewDesc.Format;
+ const auto& BuffDesc = pBuffer->GetDesc();
+ if (BuffFmt.ValueType != VT_UNDEFINED)
+ {
+ if (BuffFmt.NumComponents == 0)
+ SCRIPT_PARSING_ERROR( L, "Number components cannot be 0" );
+ auto FmtSize = GetValueSize( BuffFmt.ValueType ) * Uint32{BuffFmt.NumComponents};
+ if (BuffDesc.ElementByteStride != FmtSize )
+ {
+ SCRIPT_PARSING_ERROR( L, "Format size (", FmtSize, ") specified by view '", BufferViewDesc.Name,"' does not match the element byte stride (", BuffDesc.ElementByteStride, ") of the buffer '", BuffDesc.Name, "'." );
+ }
+ if (BuffFmt.ValueType == VT_FLOAT32 || BuffFmt.ValueType == VT_FLOAT16)
+ BuffFmt.IsNormalized = false;
+ }
+
pBuffer->CreateView( BufferViewDesc, ppBufferView );
if( *ppBufferView == nullptr )
SCRIPT_PARSING_ERROR(L, "Failed to create buffer view")