2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "test-graphics-reflection.h"
18 #include "test-graphics-shader.h"
20 #include <dali/public-api/object/property-map.h>
27 static const std::vector<UniformData> UNIFORMS =
29 UniformData("uRendererColor", Property::Type::FLOAT),
30 UniformData("uCustom", Property::Type::INTEGER),
31 UniformData("uCustom3", Property::Type::VECTOR3),
32 UniformData("uFadeColor", Property::Type::VECTOR4),
33 UniformData("uUniform1", Property::Type::VECTOR4),
34 UniformData("uUniform2", Property::Type::VECTOR4),
35 UniformData("uUniform3", Property::Type::VECTOR4),
36 UniformData("uFadeProgress", Property::Type::FLOAT),
37 UniformData("uANormalMatrix", Property::Type::MATRIX3),
38 UniformData("sEffect", Property::Type::FLOAT),
39 UniformData("sTexture", Property::Type::FLOAT),
40 UniformData("sTextureRect", Property::Type::FLOAT),
41 UniformData("sGloss", Property::Type::FLOAT),
42 UniformData("uColor", Property::Type::VECTOR4),
43 UniformData("uModelMatrix", Property::Type::MATRIX),
44 UniformData("uModelView", Property::Type::MATRIX),
45 UniformData("uMvpMatrix", Property::Type::MATRIX),
46 UniformData("uNormalMatrix", Property::Type::MATRIX3),
47 UniformData("uProjection", Property::Type::MATRIX),
48 UniformData("uSize", Property::Type::VECTOR3),
49 UniformData("uViewMatrix", Property::Type::MATRIX),
50 UniformData("uLightCameraProjectionMatrix", Property::Type::MATRIX),
51 UniformData("uLightCameraViewMatrix", Property::Type::MATRIX),
55 TestGraphicsReflection::TestGraphicsReflection(TestGlAbstraction& gl, Property::Array& vfs, const Graphics::ProgramCreateInfo& createInfo, std::vector<UniformData>& customUniforms)
57 mCustomUniforms(customUniforms)
59 for(Property::Array::SizeType i = 0; i < vfs.Count(); ++i)
61 Property::Map* vertexFormat = vfs[i].GetMap();
64 for(Property::Map::SizeType j = 0; j < vertexFormat->Count(); ++j)
66 auto key = vertexFormat->GetKeyAt(j);
67 if(key.type == Property::Key::STRING)
69 mAttributes.push_back(key.stringKey);
75 mDefaultUniformBlock.name = "";
76 mDefaultUniformBlock.members = {};
77 mDefaultUniformBlock.binding = 0;
78 mDefaultUniformBlock.size = 64 * (UNIFORMS.size() + mCustomUniforms.size());
79 mDefaultUniformBlock.descriptorSet = 0;
80 mDefaultUniformBlock.members.clear();
82 for(const auto& data : UNIFORMS)
84 mDefaultUniformBlock.members.emplace_back();
85 auto& item = mDefaultUniformBlock.members.back();
86 item.name = data.name;
88 item.offset = loc * 64;
89 item.location = loc++;
91 item.uniformClass = Graphics::UniformClass::UNIFORM;
94 for(const auto& data : mCustomUniforms)
96 fprintf(stderr, "\ncustom uniforms: %s\n", data.name.c_str());
97 mDefaultUniformBlock.members.emplace_back();
98 auto& item = mDefaultUniformBlock.members.back();
99 item.name = data.name;
101 item.offset = loc * 64;
102 item.location = loc++;
103 item.bufferIndex = 0;
104 item.uniformClass = Graphics::UniformClass::UNIFORM;
107 mUniformBlocks.push_back(mDefaultUniformBlock);
110 uint32_t TestGraphicsReflection::GetVertexAttributeLocation(const std::string& name) const
112 // Automatically assign locations to named attributes when requested
113 auto iter = std::find(mAttributes.begin(), mAttributes.end(), name);
114 if(iter != mAttributes.end())
116 return iter - mAttributes.begin();
120 uint32_t location = mAttributes.size();
121 mAttributes.push_back(name);
127 Dali::Graphics::VertexInputAttributeFormat TestGraphicsReflection::GetVertexAttributeFormat(uint32_t location) const
129 return Dali::Graphics::VertexInputAttributeFormat{};
132 std::string TestGraphicsReflection::GetVertexAttributeName(uint32_t location) const
137 std::vector<uint32_t> TestGraphicsReflection::GetVertexAttributeLocations() const
139 std::vector<uint32_t> locs;
140 for(uint32_t i = 0; i < mAttributes.size(); ++i)
147 uint32_t TestGraphicsReflection::GetUniformBlockCount() const
149 return mUniformBlocks.size();
152 uint32_t TestGraphicsReflection::GetUniformBlockBinding(uint32_t index) const
157 uint32_t TestGraphicsReflection::GetUniformBlockSize(uint32_t index) const
159 // 64 bytes per uniform (64 = 4x4 matrix)
160 // TODO: fix if array will be used
161 return 64 * (UNIFORMS.size() + mCustomUniforms.size());
164 bool TestGraphicsReflection::GetUniformBlock(uint32_t index, Dali::Graphics::UniformBlockInfo& out) const
166 if(index >= mUniformBlocks.size())
171 const auto& block = mUniformBlocks[index];
173 out.name = block.name;
174 out.binding = block.binding;
175 out.descriptorSet = block.descriptorSet;
176 auto membersSize = block.members.size();
177 out.members.resize(membersSize);
178 out.size = block.size;
179 for(auto i = 0u; i < out.members.size(); ++i)
181 const auto& memberUniform = block.members[i];
182 out.members[i].name = memberUniform.name;
183 out.members[i].binding = block.binding;
184 out.members[i].uniformClass = Graphics::UniformClass::UNIFORM;
185 out.members[i].offset = memberUniform.offset;
186 out.members[i].location = memberUniform.location;
192 std::vector<uint32_t> TestGraphicsReflection::GetUniformBlockLocations() const
194 return std::vector<uint32_t>{};
197 std::string TestGraphicsReflection::GetUniformBlockName(uint32_t blockIndex) const
199 return std::string{};
202 uint32_t TestGraphicsReflection::GetUniformBlockMemberCount(uint32_t blockIndex) const
204 if(blockIndex < mUniformBlocks.size())
206 return static_cast<uint32_t>(mUniformBlocks[blockIndex].members.size());
214 std::string TestGraphicsReflection::GetUniformBlockMemberName(uint32_t blockIndex, uint32_t memberLocation) const
216 if(blockIndex < mUniformBlocks.size() && memberLocation < mUniformBlocks[blockIndex].members.size())
218 return mUniformBlocks[blockIndex].members[memberLocation].name;
222 return std::string();
226 uint32_t TestGraphicsReflection::GetUniformBlockMemberOffset(uint32_t blockIndex, uint32_t memberLocation) const
228 if(blockIndex < mUniformBlocks.size() && memberLocation < mUniformBlocks[blockIndex].members.size())
230 return mUniformBlocks[blockIndex].members[memberLocation].offset;
238 bool TestGraphicsReflection::GetNamedUniform(const std::string& name, Dali::Graphics::UniformInfo& out) const
243 const std::vector<Dali::Graphics::UniformInfo>& TestGraphicsReflection::GetSamplers() const
245 static std::vector<Dali::Graphics::UniformInfo> samplers{};
249 Graphics::ShaderLanguage TestGraphicsReflection::GetLanguage() const
251 return Graphics::ShaderLanguage::GLSL_3_1;
254 Dali::Property::Type TestGraphicsReflection::GetMemberType(int blockIndex, int location) const
256 return location < static_cast<int>(UNIFORMS.size()) ? UNIFORMS[location].type : mCustomUniforms[location - UNIFORMS.size()].type;