namespace Dali
{
+
+struct UniformData
+{
+ std::string name;
+ Property::Type type;
+ UniformData( const std::string& name, Property::Type type = Property::Type::NONE)
+ : name(name), type(type)
+ {}
+};
+
class DALI_CORE_API TestGlAbstraction : public Dali::Integration::GlAbstraction
{
public:
GetUniformLocation(program, "uViewMatrix");
GetUniformLocation(program, "uLightCameraProjectionMatrix");
GetUniformLocation(program, "uLightCameraViewMatrix");
+
+ for( const auto& uniform : mCustomUniformData )
+ {
+ GetUniformLocation(program, uniform.name.c_str());
+ }
}
inline void PixelStorei(GLenum pname, GLint param) override
}
}
- fprintf(stderr, "Not found, printing possible values:\n");
+ fprintf(stderr, "%s Not found, printing possible values:\n", name);
for(ProgramUniformMap::const_iterator program_it = mUniforms.begin();
program_it != mUniforms.end();
++program_it)
if(mProgramUniforms.GetUniformValue(programId, uniformId, origValue))
{
std::stringstream out;
- out << uniform_it->first << ": " << origValue;
+ out << "Program: " << programId << ", " << uniform_it->first << ": " << origValue;
fprintf(stderr, "%s\n", out.str().c_str());
}
}
return false;
}
+ inline void SetCustomUniforms(std::vector<UniformData>& customUniformData)
+ {
+ mCustomUniformData = customUniformData;
+ }
+
inline GLuint GetLastShaderCompiled() const
{
return mLastShaderCompiled;
typedef std::map<GLuint, UniformIDMap> ProgramUniformMap;
ProgramUniformMap mUniforms;
+ std::vector<UniformData> mCustomUniformData{};
+
template<typename T>
struct ProgramUniformValue : public std::map<GLuint, std::map<GLint, T> >
{
*/
#include "test-graphics-reflection.h"
+#include "test-graphics-shader.h"
+
#include <dali/public-api/object/property-map.h>
#include <vector>
#include <string>
{
namespace
{
-// Add members
-struct UniformData
+static const std::vector<UniformData> UNIFORMS =
{
- std::string name;
- Property::Type type;
- UniformData( const std::string& name, Property::Type type = Property::Type::NONE)
- : name(name), type(type)
- {}
+ UniformData("uRendererColor",Property::Type::FLOAT),
+ UniformData("uCustom", Property::Type::INTEGER),
+ UniformData("uCustom3", Property::Type::VECTOR3),
+ UniformData("uFadeColor", Property::Type::VECTOR4),
+ UniformData("uUniform1", Property::Type::VECTOR4),
+ UniformData("uUniform2", Property::Type::VECTOR4),
+ UniformData("uUniform3", Property::Type::VECTOR4),
+ UniformData("uFadeProgress", Property::Type::FLOAT),
+ UniformData("uANormalMatrix", Property::Type::MATRIX3),
+ UniformData("sEffect", Property::Type::FLOAT),
+ UniformData("sTexture", Property::Type::FLOAT),
+ UniformData("sTextureRect", Property::Type::FLOAT),
+ UniformData("sGloss", Property::Type::FLOAT),
+ UniformData("uColor", Property::Type::VECTOR4),
+ UniformData("uModelMatrix", Property::Type::MATRIX),
+ UniformData("uModelView", Property::Type::MATRIX),
+ UniformData("uMvpMatrix", Property::Type::MATRIX),
+ UniformData("uNormalMatrix", Property::Type::MATRIX3),
+ UniformData("uProjection", Property::Type::MATRIX),
+ UniformData("uSize", Property::Type::VECTOR3),
+ UniformData("uViewMatrix", Property::Type::MATRIX),
+ UniformData("uLightCameraProjectionMatrix", Property::Type::MATRIX),
+ UniformData("uLightCameraViewMatrix", Property::Type::MATRIX),
};
-static const std::vector<UniformData> UNIFORMS =
- {
- UniformData("uRendererColor",Property::Type::FLOAT),
- UniformData("uCustom", Property::Type::INTEGER),
- UniformData("uCustom3", Property::Type::VECTOR3),
- UniformData("uFadeColor", Property::Type::VECTOR4),
- UniformData("uUniform1", Property::Type::VECTOR4),
- UniformData("uUniform2", Property::Type::VECTOR4),
- UniformData("uUniform3", Property::Type::VECTOR4),
- UniformData("uFadeProgress", Property::Type::FLOAT),
- UniformData("uANormalMatrix", Property::Type::MATRIX3),
- UniformData("sEffect", Property::Type::FLOAT),
- UniformData("sTexture", Property::Type::FLOAT),
- UniformData("sTextureRect", Property::Type::FLOAT),
- UniformData("sGloss", Property::Type::FLOAT),
- UniformData("uColor", Property::Type::VECTOR4),
- UniformData("uModelMatrix", Property::Type::MATRIX),
- UniformData("uModelView", Property::Type::MATRIX),
- UniformData("uMvpMatrix", Property::Type::MATRIX),
- UniformData("uNormalMatrix", Property::Type::MATRIX3),
- UniformData("uProjection", Property::Type::MATRIX),
- UniformData("uSize", Property::Type::VECTOR3),
- UniformData("uViewMatrix", Property::Type::MATRIX),
- UniformData("uLightCameraProjectionMatrix", Property::Type::MATRIX),
- UniformData("uLightCameraViewMatrix", Property::Type::MATRIX),
-
- };
-}
-
-TestGraphicsReflection::TestGraphicsReflection(TestGlAbstraction& gl, Property::Array& vfs)
- : mGl(gl)
+}
+
+TestGraphicsReflection::TestGraphicsReflection(TestGlAbstraction& gl, Property::Array& vfs, const Graphics::ProgramCreateInfo& createInfo, std::vector<UniformData>& customUniforms)
+ : mGl(gl),
+ mCustomUniforms(customUniforms)
{
for(Property::Array::SizeType i = 0; i < vfs.Count(); ++i)
{
}
}
}
+
+ mDefaultUniformBlock.name = "";
+ mDefaultUniformBlock.members = {};
+ mDefaultUniformBlock.binding = 0;
+ mDefaultUniformBlock.size = 64 * (UNIFORMS.size() + mCustomUniforms.size());
+ mDefaultUniformBlock.descriptorSet = 0;
+ mDefaultUniformBlock.members.clear();
+ int loc = 0;
+ for( const auto& data : UNIFORMS )
+ {
+ mDefaultUniformBlock.members.emplace_back();
+ auto& item = mDefaultUniformBlock.members.back();
+ item.name = data.name;
+ item.binding = 0;
+ item.offset = loc*64;
+ item.location = loc++;
+ item.bufferIndex = 0;
+ item.uniformClass = Graphics::UniformClass::UNIFORM;
+ }
+
+ for( const auto& data : mCustomUniforms )
+ {
+ fprintf(stderr, "\ncustom uniforms: %s\n", data.name.c_str());
+ mDefaultUniformBlock.members.emplace_back();
+ auto& item = mDefaultUniformBlock.members.back();
+ item.name = data.name;
+ item.binding = 0;
+ item.offset = loc*64;
+ item.location = loc++;
+ item.bufferIndex = 0;
+ item.uniformClass = Graphics::UniformClass::UNIFORM;
+ }
+
+ mUniformBlocks.push_back(mDefaultUniformBlock);
}
uint32_t TestGraphicsReflection::GetVertexAttributeLocation(const std::string& name) const
uint32_t TestGraphicsReflection::GetUniformBlockCount() const
{
- return 1u;
+ return mUniformBlocks.size();
}
uint32_t TestGraphicsReflection::GetUniformBlockBinding(uint32_t index) const
{
// 64 bytes per uniform (64 = 4x4 matrix)
// TODO: fix if array will be used
- return 64 * UNIFORMS.size();
+ return 64 * (UNIFORMS.size() + mCustomUniforms.size());
}
bool TestGraphicsReflection::GetUniformBlock(uint32_t index, Dali::Graphics::UniformBlockInfo& out) const
{
- auto& info = out;
- info.name = "";
- info.members = {};
- info.binding = 0;
- info.size = 64 * UNIFORMS.size();
- info.descriptorSet = 0;
- info.members.clear();
- int loc = 0;
- for( const auto& data : UNIFORMS )
+ if(index >= mUniformBlocks.size())
{
- info.members.emplace_back();
- auto& item = info.members.back();
- item.name = data.name;
- item.binding = 0;
- item.offset = loc*64;
- item.location = loc++;
- item.bufferIndex = 0;
- item.uniformClass = Graphics::UniformClass::UNIFORM;
+ return false;
+ }
+
+ const auto& block = mUniformBlocks[index];
+
+ out.name = block.name;
+ out.binding = block.binding;
+ out.descriptorSet = block.descriptorSet;
+ auto membersSize = block.members.size();
+ out.members.resize(membersSize);
+ out.size = block.size;
+ for(auto i = 0u; i < out.members.size(); ++i)
+ {
+ const auto& memberUniform = block.members[i];
+ out.members[i].name = memberUniform.name;
+ out.members[i].binding = block.binding;
+ out.members[i].uniformClass = Graphics::UniformClass::UNIFORM;
+ out.members[i].offset = memberUniform.offset;
+ out.members[i].location = memberUniform.location;
}
+
return true;
}
uint32_t TestGraphicsReflection::GetUniformBlockMemberCount(uint32_t blockIndex) const
{
- return UNIFORMS.size();
+ if(blockIndex < mUniformBlocks.size())
+ {
+ return static_cast<uint32_t>(mUniformBlocks[blockIndex].members.size());
+ }
+ else
+ {
+ return 0u;
+ }
}
std::string TestGraphicsReflection::GetUniformBlockMemberName(uint32_t blockIndex, uint32_t memberLocation) const
{
- return UNIFORMS[memberLocation].name;
+ if(blockIndex < mUniformBlocks.size() && memberLocation < mUniformBlocks[blockIndex].members.size())
+ {
+ return mUniformBlocks[blockIndex].members[memberLocation].name;
+ }
+ else
+ {
+ return std::string();
+ }
}
uint32_t TestGraphicsReflection::GetUniformBlockMemberOffset(uint32_t blockIndex, uint32_t memberLocation) const
{
- return 0u;
+ if(blockIndex < mUniformBlocks.size() && memberLocation < mUniformBlocks[blockIndex].members.size())
+ {
+ return mUniformBlocks[blockIndex].members[memberLocation].offset;
+ }
+ else
+ {
+ return 0u;
+ }
}
bool TestGraphicsReflection::GetNamedUniform(const std::string& name, Dali::Graphics::UniformInfo& out) const
Dali::Property::Type TestGraphicsReflection::GetMemberType( int blockIndex, int location) const
{
- return UNIFORMS[location].type;
+ return location < static_cast<int>(UNIFORMS.size()) ? UNIFORMS[location].type : mCustomUniforms[location - UNIFORMS.size()].type;
}
} // namespace Dali