Let we allow to apply / get the name of shader.
It will be useful when we want to control default shader + debug it.
Change-Id: Ic69201401191449bc78dafa750e6d097e5f72cde
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
/*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
END_TEST;
}
+int UtcDaliShaderMethodNew05(void)
+{
+ TestApplication application;
+
+ Shader shader = Shader::New(VertexSource, FragmentSource, Shader::Hint::NONE, "testShader");
+ DALI_TEST_EQUALS((bool)shader, true, TEST_LOCATION);
+ END_TEST;
+}
+
int UtcDaliShaderAssignmentOperator(void)
{
TestApplication application;
std::string hintSet = "MODIFIES_GEOMETRY";
Property::Map map;
- map["vertex"] = VertexSource;
- map["fragment"] = FragmentSource;
+ map["vertex"] = VertexSource;
+ map["fragment"] = FragmentSource;
map["renderPassTag"] = 0;
- map["hints"] = hintSet;
+ map["hints"] = hintSet;
+ map["name"] = "Test";
Shader shader = Shader::New(map);
std::string f = (*outMap)["fragment"].Get<std::string>();
std::string h = (*outMap)["hints"].Get<std::string>();
int32_t r = (*outMap)["renderPassTag"].Get<int32_t>();
+ std::string n = (*outMap)["name"].Get<std::string>();
DALI_TEST_CHECK(v == map["vertex"].Get<std::string>());
DALI_TEST_CHECK(f == map["fragment"].Get<std::string>());
DALI_TEST_CHECK(h == map["hints"].Get<std::string>());
DALI_TEST_CHECK(r == map["renderPassTag"].Get<int32_t>());
+ DALI_TEST_CHECK(n == map["name"].Get<std::string>());
END_TEST;
}
std::string hintSet = "MODIFIES_GEOMETRY";
Property::Map map;
- map["vertex"] = VertexSource;
- map["fragment"] = FragmentSource;
+ map["vertex"] = VertexSource;
+ map["fragment"] = FragmentSource;
map["renderPassTag"] = 0;
- map["hints"] = Shader::Hint::Value::MODIFIES_GEOMETRY;
+ map["hints"] = Shader::Hint::Value::MODIFIES_GEOMETRY;
+ map["name"] = "Test";
Shader shader = Shader::New(map);
std::string f = (*outMap)["fragment"].Get<std::string>();
std::string h = (*outMap)["hints"].Get<std::string>();
int32_t r = (*outMap)["renderPassTag"].Get<int32_t>();
+ std::string n = (*outMap)["name"].Get<std::string>();
DALI_TEST_CHECK(v == map["vertex"].Get<std::string>());
DALI_TEST_CHECK(f == map["fragment"].Get<std::string>());
// Note : shader.GetProperty return string even we input hints as enum.
DALI_TEST_CHECK(h == hintSet);
DALI_TEST_CHECK(r == map["renderPassTag"].Get<int32_t>());
+ DALI_TEST_CHECK(n == map["name"].Get<std::string>());
END_TEST;
}
std::string hintSet = "MODIFIES_GEOMETRY";
Property::Map map[2];
- map[0]["vertex"] = VertexSource;
- map[0]["fragment"] = FragmentSource;
+ map[0]["vertex"] = VertexSource;
+ map[0]["fragment"] = FragmentSource;
map[0]["renderPassTag"] = 0;
- map[0]["hints"] = hintSet;
+ map[0]["hints"] = hintSet;
+ map[0]["name"] = "Test0";
- map[1]["vertex"] = VertexSource2;
- map[1]["fragment"] = FragmentSource2;
+ map[1]["vertex"] = VertexSource2;
+ map[1]["fragment"] = FragmentSource2;
map[1]["renderPassTag"] = 1;
- map[1]["hints"] = hintSet;
+ map[1]["hints"] = hintSet;
+ map[1]["name"] = "Test1";
Property::Array array;
array.PushBack(map[0]);
std::string f = (*outMap)["fragment"].Get<std::string>();
std::string h = (*outMap)["hints"].Get<std::string>();
int32_t r = (*outMap)["renderPassTag"].Get<int32_t>();
+ std::string n = (*outMap)["name"].Get<std::string>();
DALI_TEST_CHECK(v == map[i]["vertex"].Get<std::string>());
DALI_TEST_CHECK(f == map[i]["fragment"].Get<std::string>());
DALI_TEST_CHECK(h == map[i]["hints"].Get<std::string>());
DALI_TEST_CHECK(r == map[i]["renderPassTag"].Get<int32_t>());
+ DALI_TEST_CHECK(n == map[i]["name"].Get<std::string>());
}
END_TEST;
std::string hintSet = "MODIFIES_GEOMETRY";
Property::Map map[2];
- map[0]["vertex"] = VertexSource;
- map[0]["fragment"] = FragmentSource;
+ map[0]["vertex"] = VertexSource;
+ map[0]["fragment"] = FragmentSource;
map[0]["renderPassTag"] = 0;
- map[0]["hints"] = hintSet;
+ map[0]["hints"] = hintSet;
+ map[0]["name"] = "Test0";
- map[1]["vertex"] = VertexSource2;
- map[1]["fragment"] = FragmentSource2;
+ map[1]["vertex"] = VertexSource2;
+ map[1]["fragment"] = FragmentSource2;
map[1]["renderPassTag"] = 1;
- map[1]["hints"] = hintSet;
+ map[1]["hints"] = hintSet;
+ map[1]["name"] = "Test1";
Property::Array array;
array.PushBack(map[0]);
std::string f = (*outMap)["fragment"].Get<std::string>();
std::string h = (*outMap)["hints"].Get<std::string>();
int32_t r = (*outMap)["renderPassTag"].Get<int32_t>();
+ std::string n = (*outMap)["name"].Get<std::string>();
DALI_TEST_CHECK(v == map[i]["vertex"].Get<std::string>());
DALI_TEST_CHECK(f == map[i]["fragment"].Get<std::string>());
DALI_TEST_CHECK(h == map[i]["hints"].Get<std::string>());
DALI_TEST_CHECK(r == map[i]["renderPassTag"].Get<int32_t>());
+ DALI_TEST_CHECK(n == map[i]["name"].Get<std::string>());
}
END_TEST;
DALI_TEST_CHECK(arrayCount == 0u);
END_TEST;
-}
+}
\ No newline at end of file
#define DALI_GRAPHICS_PROGRAM_CREATE_INFO_H
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
return *this;
}
+ /**
+ * @brief Set the name of program.
+ *
+ * @param[in] value set of allocation callbacks
+ * @return reference to this structure.
+ */
+ auto& SetName(const std::string& value)
+ {
+ name = value;
+ return *this;
+ }
+
GraphicsStructureType type{GraphicsStructureType::PROGRAM_CREATE_INFO_STRUCT};
ExtensionCreateInfo* nextExtension{nullptr};
+ std::string_view name{};
const std::vector<ShaderState>* shaderState{nullptr};
const AllocationCallbacks* allocationCallbacks{nullptr};
};
#define DALI_INTERNAL_SHADER_DATA_H
/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
// EXTERNAL INCLUDES
#include <string>
+#include <string_view>
// INTERNAL INCLUDES
#include <dali/graphics-api/graphics-types.h>
namespace
{
-inline std::vector<char> StringToVector(const std::string& str)
+template<typename StdStringType>
+inline std::vector<char> StringToVector(const StdStringType& str)
{
auto retval = std::vector<char>{};
retval.insert(retval.begin(), str.begin(), str.end());
* @param[in] fragmentSource Source code for fragment program
* @param[in] hints Hints for rendering
* @param[in] renderPassTag RenderPassTag to match shader data and render task.
+ * @param[in] name Shader name for debug.
*/
- ShaderData(std::string vertexSource, std::string fragmentSource, const Dali::Shader::Hint::Value hints, uint32_t renderPassTag)
+ ShaderData(std::string vertexSource, std::string fragmentSource, const Dali::Shader::Hint::Value hints, uint32_t renderPassTag, std::string_view name)
: mShaderHash(-1),
mVertexShader(StringToVector(vertexSource)),
mFragmentShader(StringToVector(fragmentSource)),
mHints(hints),
mSourceMode(Graphics::ShaderSourceMode::TEXT),
- mRenderPassTag(renderPassTag)
+ mRenderPassTag(renderPassTag),
+ mName(name)
+ {
+ }
+
+ /**
+ * Constructor
+ * @param[in] vertexSource Source code for vertex program
+ * @param[in] fragmentSource Source code for fragment program
+ * @param[in] hints Hints for rendering
+ * @param[in] renderPassTag RenderPassTag to match shader data and render task.
+ * @param[in] name Shader name for debug.
+ */
+ ShaderData(std::string_view vertexSource, std::string_view fragmentSource, const Dali::Shader::Hint::Value hints, uint32_t renderPassTag, std::string_view name)
+ : mShaderHash(-1),
+ mVertexShader(StringToVector(vertexSource)),
+ mFragmentShader(StringToVector(fragmentSource)),
+ mHints(hints),
+ mSourceMode(Graphics::ShaderSourceMode::TEXT),
+ mRenderPassTag(renderPassTag),
+ mName(name)
{
}
* @param[in] fragmentSource Source code for fragment program
* @param[in] hints Hints for rendering
* @param[in] renderPassTag RenderPassTag to match shader data and render task.
+ * @param[in] name Shader name for debug.
*/
- ShaderData(std::vector<char>& vertexSource, std::vector<char>& fragmentSource, const Dali::Shader::Hint::Value hints, uint32_t renderPassTag)
+ ShaderData(std::vector<char>& vertexSource, std::vector<char>& fragmentSource, const Dali::Shader::Hint::Value hints, uint32_t renderPassTag, std::string_view name)
: mShaderHash(-1),
mVertexShader(vertexSource),
mFragmentShader(fragmentSource),
mHints(hints),
mSourceMode(Graphics::ShaderSourceMode::BINARY),
- mRenderPassTag(renderPassTag)
+ mRenderPassTag(renderPassTag),
+ mName(name)
{
}
return mRenderPassTag;
}
-private: // Not implemented
- ShaderData(const ShaderData& other); ///< no copying of this object
- ShaderData& operator=(const ShaderData& rhs); ///< no copying of this object
+ /**
+ * Get Name of shader data
+ * @return Name for this shader data, Default value is empty string.
+ */
+ const std::string& GetName() const
+ {
+ return mName;
+ }
+
+private: // Not implemented
+ ShaderData(const ShaderData& other); ///< no copying of this object
+ ShaderData& operator=(const ShaderData& rhs); ///< no copying of this object
private: // Data
std::size_t mShaderHash; ///< hash key created with vertex and fragment shader code
Dali::Vector<uint8_t> mBuffer; ///< buffer containing compiled binary bytecode
Graphics::ShaderSourceMode mSourceMode; ///< Source mode of shader data ( text or binary )
uint32_t mRenderPassTag{0u}; ///< Render Pass Tag for this shader
+ std::string mName{""}; ///< Name for this shader
};
} // namespace Internal
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
}
}
-ShaderDataPtr ShaderFactory::Load(std::string_view vertexSource, std::string_view fragmentSource, const Dali::Shader::Hint::Value hints, uint32_t renderPass, size_t& shaderHash)
+ShaderDataPtr ShaderFactory::Load(std::string_view vertexSource, std::string_view fragmentSource, const Dali::Shader::Hint::Value hints, uint32_t renderPassTag, std::string_view name, size_t& shaderHash)
{
// Work out the filename for the binary that the glsl source will be compiled and linked to:
shaderHash = CalculateHash(vertexSource.data(), fragmentSource.data());
if(shaderData.Get() == nullptr)
{
// Allocate the structure that returns the loaded shader:
- shaderData = new ShaderData(std::string(vertexSource), std::string(fragmentSource), hints, renderPass);
+ shaderData = new ShaderData(vertexSource, fragmentSource, hints, renderPassTag, name);
shaderData->SetHashValue(shaderHash);
shaderData->GetBuffer().Clear();
#define DALI_INTERNAL_SHADER_FACTORY_H
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* @param [in] vertexSource The vertex shader source code
* @param [in] fragmentSource The fragment shader source code
- * @param [in] renderPass RenderPass the shaders are executed
+ * @param [in] renderPassTag RenderPass the shaders are executed
+ * @param [in] name The name of shaders are executed
* @param [out] shaderHash Hash key created from vertex and fragment shader code
* @return ShaderData containing the source and hash value, and additionally,
* a compiled shader program binary if one could be found, else an
* empty binary buffer cleared to size zero.
*/
- Internal::ShaderDataPtr Load(std::string_view vertexSource, std::string_view fragmentSource, const Dali::Shader::Hint::Value hints, uint32_t renderPass, size_t& shaderHash);
+ Internal::ShaderDataPtr Load(std::string_view vertexSource, std::string_view fragmentSource, const Dali::Shader::Hint::Value hints, uint32_t renderPassTag, std::string_view name, size_t& shaderHash);
/**
* @brief Saves shader to memory cache and filesystem.
/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
const uint32_t ShaderHintsTableSize = static_cast<uint32_t>(sizeof(ShaderHintsTable) / sizeof(ShaderHintsTable[0]));
-static constexpr uint32_t DEFAULT_RENDER_PASS_TAG = 0u;
+static constexpr uint32_t DEFAULT_RENDER_PASS_TAG = 0u;
+static constexpr std::string_view DEFAULT_SHADER_NAME = "";
BaseHandle Create()
{
return Property::Value(s);
}
-void GetShaderData(const Property::Map& shaderMap, std::string& vertexShader, std::string& fragmentShader, uint32_t& renderPassTag, Dali::Shader::Hint::Value& hints)
+void GetShaderData(const Property::Map& shaderMap, std::string& vertexShader, std::string& fragmentShader, uint32_t& renderPassTag, Dali::Shader::Hint::Value& hints, std::string& name)
{
hints = Dali::Shader::Hint::NONE;
renderPassTag = DEFAULT_RENDER_PASS_TAG;
+ name = DEFAULT_SHADER_NAME;
if(Property::Value* value = shaderMap.Find("vertex"))
{
renderPassTag = static_cast<uint32_t>(value->Get<int32_t>());
}
+ if(Property::Value* value = shaderMap.Find("name"))
+ {
+ name = value->Get<std::string>();
+ }
+
if(Property::Value* value = shaderMap.Find("hints"))
{
int32_t hintInteger = 0;
ShaderPtr Shader::New(std::string_view vertexShader,
std::string_view fragmentShader,
- Dali::Shader::Hint::Value hints)
+ Dali::Shader::Hint::Value hints,
+ std::string_view shaderName)
{
// create scene object first so it's guaranteed to exist for the event side
auto sceneObject = new SceneGraph::Shader();
AddShaderMessage(updateManager, transferOwnership);
services.RegisterObject(shader.Get());
- shader->UpdateShaderData(vertexShader, fragmentShader, DEFAULT_RENDER_PASS_TAG, hints);
+ shader->UpdateShaderData(vertexShader, fragmentShader, DEFAULT_RENDER_PASS_TAG, hints, shaderName);
return shader;
}
map["fragment"] = Property::Value(mShaderDataList.front()->GetFragmentShader());
map["renderPassTag"] = Property::Value(static_cast<int32_t>(mShaderDataList.front()->GetRenderPassTag()));
map["hints"] = HintString(mShaderDataList.front()->GetHints());
+ map["name"] = Property::Value(mShaderDataList.front()->GetName());
value = map;
}
else
map["fragment"] = Property::Value(shaderData->GetFragmentShader());
map["renderPassTag"] = Property::Value(static_cast<int32_t>(shaderData->GetRenderPassTag()));
map["hints"] = HintString(shaderData->GetHints());
+ map["name"] = Property::Value(shaderData->GetName());
array.PushBack(map);
}
}
void Shader::UpdateShaderData(std::string_view vertexSource,
std::string_view fragmentSource,
uint32_t renderPassTag,
- Dali::Shader::Hint::Value hints)
+ Dali::Shader::Hint::Value hints,
+ std::string_view name)
{
// Try to load a pre-compiled shader binary for the source pair:
ThreadLocalStorage& tls = ThreadLocalStorage::Get();
ShaderFactory& shaderFactory = tls.GetShaderFactory();
size_t shaderHash;
- Internal::ShaderDataPtr shaderData = shaderFactory.Load(vertexSource, fragmentSource, hints, renderPassTag, shaderHash);
+ Internal::ShaderDataPtr shaderData = shaderFactory.Load(vertexSource, fragmentSource, hints, renderPassTag, name, shaderHash);
std::vector<Internal::ShaderDataPtr>::iterator shaderDataIterator = std::find_if(mShaderDataList.begin(), mShaderDataList.end(), [&shaderData](const Internal::ShaderDataPtr& shaderDataItem) { return shaderDataItem->GetRenderPassTag() == shaderData->GetRenderPassTag(); });
if(shaderDataIterator != mShaderDataList.end())
std::string fragment;
uint32_t renderPassTag{DEFAULT_RENDER_PASS_TAG};
Dali::Shader::Hint::Value hints(Dali::Shader::Hint::NONE);
- GetShaderData(*map, vertex, fragment, renderPassTag, hints);
+ std::string name(DEFAULT_SHADER_NAME);
+ GetShaderData(*map, vertex, fragment, renderPassTag, hints, name);
- UpdateShaderData(vertex, fragment, renderPassTag, hints);
+ UpdateShaderData(vertex, fragment, renderPassTag, hints, name);
}
}
else if(shaderMap.GetType() == Property::ARRAY)
std::string fragment;
uint32_t renderPassTag{DEFAULT_RENDER_PASS_TAG};
Dali::Shader::Hint::Value hints(Dali::Shader::Hint::NONE);
- GetShaderData(*map, vertex, fragment, renderPassTag, hints);
+ std::string name(DEFAULT_SHADER_NAME);
+ GetShaderData(*map, vertex, fragment, renderPassTag, hints, name);
- UpdateShaderData(vertex, fragment, renderPassTag, hints);
+ UpdateShaderData(vertex, fragment, renderPassTag, hints, name);
}
}
}
#define DALI_INTERNAL_SHADER_H
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
static ShaderPtr New(std::string_view vertexShader,
std::string_view fragmentShader,
- Dali::Shader::Hint::Value hints);
+ Dali::Shader::Hint::Value hints,
+ std::string_view shaderName);
/**
* @copydoc Dali::Shader::New()
/**
* Constructor
*
- * @param sceneObject the scene object
+ * @param[in] sceneObject the scene object
*/
Shader(const SceneGraph::Shader* sceneObject);
* @param[in] fragmentShader Fragment Shader code for the effect.
* @param[in] renderPassTag render pass tag of this shader data
* @param[in] hints Hints to define the geometry of the rendered object
+ * @param[in] name The name of shader data.
*/
- void UpdateShaderData(std::string_view vertexShader, std::string_view fragmentShader, uint32_t renderPassTag, Dali::Shader::Hint::Value hints);
+ void UpdateShaderData(std::string_view vertexShader, std::string_view fragmentShader, uint32_t renderPassTag, Dali::Shader::Hint::Value hints, std::string_view name);
/**
* @brief Sets shader data from shaderMap.
~Shader() override;
private: // unimplemented methods
- Shader() = delete;
- Shader(const Shader&) = delete;
+ Shader() = delete;
+ Shader(const Shader&) = delete;
Shader& operator=(const Shader&) = delete;
private:
/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
auto createInfo = Graphics::ProgramCreateInfo();
createInfo.SetShaderState(shaderStates);
+ createInfo.SetName(shaderData->GetName());
auto graphicsProgram = mGraphicsController->CreateProgram(createInfo, nullptr);
program->SetGraphicsProgram(std::move(graphicsProgram), *mUniformBufferManager); // generates reflection
}
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
{
Shader Shader::New(std::string_view vertexShader,
std::string_view fragmentShader,
- Hint::Value hints)
+ Hint::Value hints,
+ std::string_view shaderName)
{
- Internal::ShaderPtr shader = Internal::Shader::New(vertexShader, fragmentShader, hints);
+ Internal::ShaderPtr shader = Internal::Shader::New(vertexShader, fragmentShader, hints, shaderName);
return Shader(shader.Get());
}
#define DALI_SHADER_H
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* @brief Name: "program", Type: MAP or ARRAY.
* @note The default value is empty.
* @note It is Property::Map or Property::Array of the map.
- * @note Format: {"renderPassTag":"", "vertex":"", "fragment":"", "hints":""}
+ * @note Format: {"renderPassTag":"", "vertex":"", "fragment":"", "hints":"", "name":""}
* @SINCE_1_1.43
*/
PROGRAM = DEFAULT_OBJECT_PROPERTY_START_INDEX,
* @param[in] vertexShader Vertex shader code for the effect.
* @param[in] fragmentShader Fragment Shader code for the effect.
* @param[in] hints Hints to define the geometry of the rendered object
+ * @param[in] shaderName The name of this shader. (optional)
* @return A handle to a shader effect
*/
static Shader New(std::string_view vertexShader,
std::string_view fragmentShader,
- Hint::Value hints = Hint::NONE);
+ Hint::Value hints = Hint::NONE,
+ std::string_view shaderName = "");
/**
* @brief Creates Shader.