2 * Copyright (c) 2022 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("uActorColor", Property::Type::VECTOR4),
44 UniformData("uModelMatrix", Property::Type::MATRIX),
45 UniformData("uModelView", Property::Type::MATRIX),
46 UniformData("uMvpMatrix", Property::Type::MATRIX),
47 UniformData("uNormalMatrix", Property::Type::MATRIX3),
48 UniformData("uProjection", Property::Type::MATRIX),
49 UniformData("uSize", Property::Type::VECTOR3),
50 UniformData("uViewMatrix", Property::Type::MATRIX),
51 UniformData("uLightCameraProjectionMatrix", Property::Type::MATRIX),
52 UniformData("uLightCameraViewMatrix", Property::Type::MATRIX),
54 // WARNING: IF YOU CHANGE THIS LIST, ALSO CHANGE mActiveUniforms IN test-gl-abstraction, Initialize
58 TestGraphicsReflection::TestGraphicsReflection(TestGlAbstraction& gl, Property::Array& vfs, const Graphics::ProgramCreateInfo& createInfo, std::vector<UniformData>& customUniforms)
60 mCustomUniforms(customUniforms)
62 for(Property::Array::SizeType i = 0; i < vfs.Count(); ++i)
64 Property::Map* vertexFormat = vfs[i].GetMap();
67 for(Property::Map::SizeType j = 0; j < vertexFormat->Count(); ++j)
69 auto key = vertexFormat->GetKeyAt(j);
70 if(key.type == Property::Key::STRING)
72 mAttributes.push_back(key.stringKey);
78 mDefaultUniformBlock.name = "";
79 mDefaultUniformBlock.members = {};
80 mDefaultUniformBlock.binding = 0;
81 mDefaultUniformBlock.size = 64 * (UNIFORMS.size() + mCustomUniforms.size());
82 mDefaultUniformBlock.descriptorSet = 0;
83 mDefaultUniformBlock.members.clear();
85 for(const auto& data : UNIFORMS)
87 mDefaultUniformBlock.members.emplace_back();
88 auto& item = mDefaultUniformBlock.members.back();
89 item.name = data.name;
91 item.offset = loc * 64;
92 item.location = loc++;
94 item.uniformClass = Graphics::UniformClass::UNIFORM;
97 for(const auto& data : mCustomUniforms)
99 fprintf(stderr, "\ncustom uniforms: %s\n", data.name.c_str());
100 mDefaultUniformBlock.members.emplace_back();
101 auto& item = mDefaultUniformBlock.members.back();
102 item.name = data.name;
104 item.offset = loc * 64;
105 item.location = loc++;
106 item.bufferIndex = 0;
107 item.uniformClass = Graphics::UniformClass::UNIFORM;
110 mUniformBlocks.push_back(mDefaultUniformBlock);
113 uint32_t TestGraphicsReflection::GetVertexAttributeLocation(const std::string& name) const
115 // Automatically assign locations to named attributes when requested
116 auto iter = std::find(mAttributes.begin(), mAttributes.end(), name);
117 if(iter != mAttributes.end())
119 return iter - mAttributes.begin();
123 uint32_t location = mAttributes.size();
124 mAttributes.push_back(name);
130 Dali::Graphics::VertexInputAttributeFormat TestGraphicsReflection::GetVertexAttributeFormat(uint32_t location) const
132 return Dali::Graphics::VertexInputAttributeFormat{};
135 std::string TestGraphicsReflection::GetVertexAttributeName(uint32_t location) const
140 std::vector<uint32_t> TestGraphicsReflection::GetVertexAttributeLocations() const
142 std::vector<uint32_t> locs;
143 for(uint32_t i = 0; i < mAttributes.size(); ++i)
150 uint32_t TestGraphicsReflection::GetUniformBlockCount() const
152 return mUniformBlocks.size();
155 uint32_t TestGraphicsReflection::GetUniformBlockBinding(uint32_t index) const
160 uint32_t TestGraphicsReflection::GetUniformBlockSize(uint32_t index) const
162 // 64 bytes per uniform (64 = 4x4 matrix)
163 // TODO: fix if array will be used
164 return 64 * (UNIFORMS.size() + mCustomUniforms.size());
167 bool TestGraphicsReflection::GetUniformBlock(uint32_t index, Dali::Graphics::UniformBlockInfo& out) const
169 if(index >= mUniformBlocks.size())
174 const auto& block = mUniformBlocks[index];
176 out.name = block.name;
177 out.binding = block.binding;
178 out.descriptorSet = block.descriptorSet;
179 auto membersSize = block.members.size();
180 out.members.resize(membersSize);
181 out.size = block.size;
182 for(auto i = 0u; i < out.members.size(); ++i)
184 const auto& memberUniform = block.members[i];
185 out.members[i].name = memberUniform.name;
186 out.members[i].binding = block.binding;
187 out.members[i].uniformClass = Graphics::UniformClass::UNIFORM;
188 out.members[i].offset = memberUniform.offset;
189 out.members[i].location = memberUniform.location;
195 std::vector<uint32_t> TestGraphicsReflection::GetUniformBlockLocations() const
197 return std::vector<uint32_t>{};
200 std::string TestGraphicsReflection::GetUniformBlockName(uint32_t blockIndex) const
202 return std::string{};
205 uint32_t TestGraphicsReflection::GetUniformBlockMemberCount(uint32_t blockIndex) const
207 if(blockIndex < mUniformBlocks.size())
209 return static_cast<uint32_t>(mUniformBlocks[blockIndex].members.size());
217 std::string TestGraphicsReflection::GetUniformBlockMemberName(uint32_t blockIndex, uint32_t memberLocation) const
219 if(blockIndex < mUniformBlocks.size() && memberLocation < mUniformBlocks[blockIndex].members.size())
221 return mUniformBlocks[blockIndex].members[memberLocation].name;
225 return std::string();
229 uint32_t TestGraphicsReflection::GetUniformBlockMemberOffset(uint32_t blockIndex, uint32_t memberLocation) const
231 if(blockIndex < mUniformBlocks.size() && memberLocation < mUniformBlocks[blockIndex].members.size())
233 return mUniformBlocks[blockIndex].members[memberLocation].offset;
241 bool TestGraphicsReflection::GetNamedUniform(const std::string& name, Dali::Graphics::UniformInfo& out) const
246 const std::vector<Dali::Graphics::UniformInfo>& TestGraphicsReflection::GetSamplers() const
248 static std::vector<Dali::Graphics::UniformInfo> samplers{};
252 Graphics::ShaderLanguage TestGraphicsReflection::GetLanguage() const
254 return Graphics::ShaderLanguage::GLSL_3_1;
257 Dali::Property::Type TestGraphicsReflection::GetMemberType(int blockIndex, int location) const
259 return location < static_cast<int>(UNIFORMS.size()) ? UNIFORMS[location].type : mCustomUniforms[location - UNIFORMS.size()].type;