summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/bgfx/effectreader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/render/bgfx/effectreader.cpp')
-rw-r--r--src/osd/modules/render/bgfx/effectreader.cpp166
1 files changed, 113 insertions, 53 deletions
diff --git a/src/osd/modules/render/bgfx/effectreader.cpp b/src/osd/modules/render/bgfx/effectreader.cpp
index 3e51cb9d9dc..befdc598537 100644
--- a/src/osd/modules/render/bgfx/effectreader.cpp
+++ b/src/osd/modules/render/bgfx/effectreader.cpp
@@ -6,30 +6,87 @@
//
//============================================================
-#include <string>
-
-#include <bgfx/bgfx.h>
-
-#include "emu.h"
+#include "effectreader.h"
-#include "effect.h"
#include "blendreader.h"
-#include "depthreader.h"
#include "cullreader.h"
-#include "writereader.h"
+#include "depthreader.h"
+#include "effect.h"
#include "shadermanager.h"
-#include "uniformreader.h"
#include "uniform.h"
+#include "uniformreader.h"
+#include "writereader.h"
-#include "effectreader.h"
+#include <utility>
-bgfx_effect* effect_reader::read_from_value(const Value& value, std::string prefix, shader_manager& shaders)
+
+std::unique_ptr<bgfx_effect> effect_reader::read_from_value(
+ const std::string &name,
+ const Value &value,
+ const std::string &prefix,
+ const osd_options &options,
+ shader_manager &shaders)
{
- if (!validate_parameters(value, prefix))
+ uint64_t flags = 0;
+ std::string vertex_name;
+ std::string fragment_name;
+ std::vector<std::unique_ptr<bgfx_uniform> > uniforms;
+
+ if (!get_base_effect_data(value, prefix, flags, vertex_name, fragment_name, uniforms))
{
return nullptr;
}
+ bgfx::ShaderHandle vertex_shader = BGFX_INVALID_HANDLE;
+ bgfx::ShaderHandle fragment_shader = BGFX_INVALID_HANDLE;
+
+ if (!get_shader_data(value, options, shaders, vertex_name, vertex_shader, fragment_name, fragment_shader))
+ {
+ return nullptr;
+ }
+
+ std::unique_ptr<bgfx_effect> effect(new bgfx_effect(std::string(name), flags, vertex_shader, fragment_shader, uniforms));
+ if (!effect->is_valid())
+ return nullptr;
+
+ return effect;
+}
+
+bool effect_reader::validate_value(const Value& value, const std::string &prefix, const osd_options &options)
+{
+ if (!validate_parameters(value, prefix))
+ return false;
+
+ uint64_t flags = 0;
+ std::string vertex_name;
+ std::string fragment_name;
+ std::vector<std::unique_ptr<bgfx_uniform> > uniforms;
+
+ if (!get_base_effect_data(value, prefix, flags, vertex_name, fragment_name, uniforms))
+ return false;
+
+ if (!shader_manager::is_shader_present(options, vertex_name))
+ return false;
+
+ if (!shader_manager::is_shader_present(options, fragment_name))
+ return false;
+
+ return true;
+}
+
+bool effect_reader::get_base_effect_data(
+ const Value& value,
+ const std::string &prefix,
+ uint64_t &flags,
+ std::string &vertex_name,
+ std::string &fragment_name,
+ std::vector<std::unique_ptr<bgfx_uniform> > &uniforms)
+{
+ if (!validate_parameters(value, prefix))
+ {
+ return false;
+ }
+
uint64_t blend = 0;
if (value.HasMember("blend"))
{
@@ -38,34 +95,21 @@ bgfx_effect* effect_reader::read_from_value(const Value& value, std::string pref
uint64_t depth = depth_reader::read_from_value(value["depth"], prefix + "depth: ");
uint64_t cull = cull_reader::read_from_value(value["cull"]);
uint64_t write = write_reader::read_from_value(value["write"]);
+ flags = blend | depth | cull | write;
- std::vector<bgfx_uniform*> uniforms;
const Value& uniform_array = value["uniforms"];
for (uint32_t i = 0; i < uniform_array.Size(); i++)
{
- bgfx_uniform* uniform = uniform_reader::read_from_value(uniform_array[i], prefix + "uniforms[" + std::to_string(i) + "]: ");
- if (uniform == nullptr)
+ auto uniform = uniform_reader::read_from_value(uniform_array[i], prefix + "uniforms[" + std::to_string(i) + "]: ");
+ if (!uniform)
{
- return nullptr;
+ return false;
}
- uniforms.push_back(uniform);
+ uniforms.emplace_back(std::move(uniform));
}
- std::string vertex_name(value["vertex"].GetString());
- bgfx::ShaderHandle vertex_shader = shaders.shader(vertex_name);
- if (vertex_shader.idx == 0xffff)
- {
- for (bgfx_uniform* uniform : uniforms)
- {
- if (uniform != nullptr)
- {
- delete uniform;
- }
- }
- return nullptr;
- }
+ vertex_name = value["vertex"].GetString();
- std::string fragment_name("");
if (value.HasMember("fragment"))
{
fragment_name = value["fragment"].GetString();
@@ -74,33 +118,49 @@ bgfx_effect* effect_reader::read_from_value(const Value& value, std::string pref
{
fragment_name = value["pixel"].GetString();
}
- bgfx::ShaderHandle fragment_shader = shaders.shader(fragment_name);
- if (fragment_shader.idx == 0xffff)
+ else
{
- for (bgfx_uniform* uniform : uniforms)
- {
- if (uniform != nullptr)
- {
- delete uniform;
- }
- }
- return nullptr;
+ fragment_name = "";
+ }
+
+ return true;
+}
+
+bool effect_reader::get_shader_data(
+ const Value &value,
+ const osd_options &options,
+ shader_manager &shaders,
+ std::string &vertex_name,
+ bgfx::ShaderHandle &vertex_shader,
+ std::string &fragment_name,
+ bgfx::ShaderHandle &fragment_shader)
+{
+ vertex_shader = shaders.load_shader(options, vertex_name);
+ if (vertex_shader.idx == bgfx::kInvalidHandle)
+ {
+ return false;
}
- return new bgfx_effect(blend | depth | cull | write, vertex_shader, fragment_shader, uniforms);
+ fragment_shader = shaders.load_shader(options, fragment_name);
+ if (fragment_shader.idx == bgfx::kInvalidHandle)
+ {
+ return false;
+ }
+
+ return true;
}
-bool effect_reader::validate_parameters(const Value& value, std::string prefix)
+bool effect_reader::validate_parameters(const Value& value, const std::string &prefix)
{
- if (!READER_CHECK(value.HasMember("depth"), (prefix + "Must have object value 'depth' (what are our Z-buffer settings?)\n").c_str())) return false;
- if (!READER_CHECK(value.HasMember("cull"), (prefix + "Must have object value 'cull' (do we cull triangles based on winding?)\n").c_str())) return false;
- if (!READER_CHECK(value.HasMember("write"), (prefix + "Must have object value 'write' (what are our color buffer write settings?)\n").c_str())) return false;
- if (!READER_CHECK(value.HasMember("vertex"), (prefix + "Must have string value 'vertex' (what is our vertex shader?)\n").c_str())) return false;
- if (!READER_CHECK(value["vertex"].IsString(), (prefix + "Value 'vertex' must be a string\n").c_str())) return false;
- if (!READER_CHECK(value.HasMember("fragment") || value.HasMember("pixel"), (prefix + "Must have string value named 'fragment' or 'pixel' (what is our fragment/pixel shader?)\n").c_str())) return false;
- if (!READER_CHECK(!value.HasMember("fragment") || value["fragment"].IsString(), (prefix + "Value 'fragment' must be a string\n").c_str())) return false;
- if (!READER_CHECK(!value.HasMember("pixel") || value["pixel"].IsString(), (prefix + "Value 'pixel' must be a string\n").c_str())) return false;
- if (!READER_CHECK(value.HasMember("uniforms"), (prefix + "Must have array value 'uniforms' (what are our shader's parameters?)\n").c_str())) return false;
- if (!READER_CHECK(value["uniforms"].IsArray(), (prefix + "Value 'uniforms' must be an array\n").c_str())) return false;
+ if (!READER_CHECK(value.HasMember("depth"), "%sMust have object value 'depth' (what are our Z-buffer settings?)\n", prefix)) return false;
+ if (!READER_CHECK(value.HasMember("cull"), "%sMust have object value 'cull' (do we cull triangles based on winding?)\n", prefix)) return false;
+ if (!READER_CHECK(value.HasMember("write"), "%sMust have object value 'write' (what are our color buffer write settings?)\n", prefix)) return false;
+ if (!READER_CHECK(value.HasMember("vertex"), "%sMust have string value 'vertex' (what is our vertex shader?)\n", prefix)) return false;
+ if (!READER_CHECK(value["vertex"].IsString(), "%sValue 'vertex' must be a string\n", prefix)) return false;
+ if (!READER_CHECK(value.HasMember("fragment") || value.HasMember("pixel"), "%sMust have string value named 'fragment' or 'pixel' (what is our fragment/pixel shader?)\n", prefix)) return false;
+ if (!READER_CHECK(!value.HasMember("fragment") || value["fragment"].IsString(), "%sValue 'fragment' must be a string\n", prefix)) return false;
+ if (!READER_CHECK(!value.HasMember("pixel") || value["pixel"].IsString(), "%sValue 'pixel' must be a string\n", prefix)) return false;
+ if (!READER_CHECK(value.HasMember("uniforms"), "%sMust have array value 'uniforms' (what are our shader's parameters?)\n", prefix)) return false;
+ if (!READER_CHECK(value["uniforms"].IsArray(), "%sValue 'uniforms' must be an array\n", prefix)) return false;
return true;
}