summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author therealmogminer@gmail.com <therealmogminer@gmail.com>2016-03-16 18:52:07 +0100
committer therealmogminer@gmail.com <therealmogminer@gmail.com>2016-03-16 18:52:07 +0100
commit493cf7289be81f15a975d60b48e58b0132854323 (patch)
treece0312c41258ad27182bffada0faacb0b5a9d3ac /src
parente1883e3090510d943af54ae24cee3a637e4d72a5 (diff)
More bgfx HLSL fixups, nw
Diffstat (limited to 'src')
-rw-r--r--src/osd/modules/render/bgfx/chainentry.cpp28
-rw-r--r--src/osd/modules/render/bgfx/chainentry.h9
-rw-r--r--src/osd/modules/render/bgfx/chainentryreader.cpp4
-rw-r--r--src/osd/modules/render/bgfx/chainreader.cpp6
-rw-r--r--src/osd/modules/render/bgfx/entryuniform.h1
-rw-r--r--src/osd/modules/render/bgfx/fs_color.sc3
-rw-r--r--src/osd/modules/render/bgfx/fs_ntsc_encode.sc26
-rw-r--r--src/osd/modules/render/bgfx/target.cpp2
-rw-r--r--src/osd/modules/render/bgfx/targetmanager.cpp17
-rw-r--r--src/osd/modules/render/bgfx/texturemanager.cpp10
10 files changed, 62 insertions, 44 deletions
diff --git a/src/osd/modules/render/bgfx/chainentry.cpp b/src/osd/modules/render/bgfx/chainentry.cpp
index ceec50f2706..8b36460ad0c 100644
--- a/src/osd/modules/render/bgfx/chainentry.cpp
+++ b/src/osd/modules/render/bgfx/chainentry.cpp
@@ -24,12 +24,13 @@
#include "vertex.h"
#include "suppressor.h"
-bgfx_chain_entry::bgfx_chain_entry(std::string name, bgfx_effect* effect, std::vector<bgfx_suppressor*> suppressors, std::vector<bgfx_input_pair> inputs, std::vector<bgfx_entry_uniform*> uniforms, bgfx_target* output)
+bgfx_chain_entry::bgfx_chain_entry(std::string name, bgfx_effect* effect, std::vector<bgfx_suppressor*> suppressors, std::vector<bgfx_input_pair> inputs, std::vector<bgfx_entry_uniform*> uniforms, target_manager& targets, std::string output)
: m_name(name)
, m_effect(effect)
, m_suppressors(suppressors)
, m_inputs(inputs)
, m_uniforms(uniforms)
+ , m_targets(targets)
, m_output(output)
{
}
@@ -104,16 +105,20 @@ void bgfx_chain_entry::submit(render_primitive* prim, int view, texture_manager&
source_dims->set(values, sizeof(float) * 2);
}
}
+
for (bgfx_entry_uniform* uniform : m_uniforms)
{
- uniform->bind();
+ if (uniform->name() != "DiffuseSampler")
+ {
+ uniform->bind();
+ }
}
- m_effect->submit(view, blend);
-
- if (m_output != nullptr)
+ m_effect->submit(view, blend);
+
+ if (m_targets.target(m_output) != nullptr)
{
- m_output->page_flip();
+ m_targets.target(m_output)->page_flip();
}
}
@@ -122,11 +127,12 @@ void bgfx_chain_entry::setup_view(int view, uint16_t screen_width, uint16_t scre
bgfx::FrameBufferHandle handle = BGFX_INVALID_HANDLE;
uint16_t width = screen_width;
uint16_t height = screen_height;
- if (m_output != nullptr)
+ if (m_targets.target(m_output) != nullptr)
{
- handle = m_output->target();
- width = m_output->width();
- height = m_output->height();
+ bgfx_target* output = m_targets.target(m_output);
+ handle = output->target();
+ width = output->width();
+ height = output->height();
}
bgfx::setViewFrameBuffer(view, handle);
@@ -136,7 +142,7 @@ void bgfx_chain_entry::setup_view(int view, uint16_t screen_width, uint16_t scre
bx::mtxIdentity(viewMat);
float projMat[16];
- bx::mtxOrtho(projMat, 0.0f, width, height, 0.0f, 0.0f, 100.0f);
+ bx::mtxOrtho(projMat, 0.0f, screen_width, screen_height, 0.0f, 0.0f, 100.0f);
bgfx::setViewTransform(view, viewMat, projMat);
bgfx::setViewClear(view, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x000000ff, 1.0f, 0);
diff --git a/src/osd/modules/render/bgfx/chainentry.h b/src/osd/modules/render/bgfx/chainentry.h
index f9ed1aa6358..d6e7edeaf09 100644
--- a/src/osd/modules/render/bgfx/chainentry.h
+++ b/src/osd/modules/render/bgfx/chainentry.h
@@ -20,6 +20,7 @@
#include <vector>
#include "inputpair.h"
+#include "targetmanager.h"
class render_primitive;
class bgfx_effect;
@@ -27,18 +28,19 @@ class bgfx_target;
class bgfx_entry_uniform;
class bgfx_suppressor;
class texture_manager;
+class target_manager;
class bgfx_chain_entry
{
public:
- bgfx_chain_entry(std::string name, bgfx_effect* effect, std::vector<bgfx_suppressor*> suppressors, std::vector<bgfx_input_pair> inputs, std::vector<bgfx_entry_uniform*> uniforms, bgfx_target* output);
+ bgfx_chain_entry(std::string name, bgfx_effect* effect, std::vector<bgfx_suppressor*> suppressors, std::vector<bgfx_input_pair> inputs, std::vector<bgfx_entry_uniform*> uniforms, target_manager& targets, std::string output);
~bgfx_chain_entry();
void submit(render_primitive* prim, int view, texture_manager& textures, uint16_t screen_width, uint16_t screen_height, uint64_t blend);
// Getters
std::string name() const { return m_name; }
- bgfx_target* target() const { return m_output; }
+ bgfx_target* target() const { return m_targets.target(m_output); }
bool skip();
private:
@@ -50,7 +52,8 @@ private:
std::vector<bgfx_suppressor*> m_suppressors;
std::vector<bgfx_input_pair> m_inputs;
std::vector<bgfx_entry_uniform*> m_uniforms;
- bgfx_target* m_output;
+ target_manager& m_targets;
+ std::string m_output;
};
#endif // __DRAWBGFX_CHAIN_ENTRY__
diff --git a/src/osd/modules/render/bgfx/chainentryreader.cpp b/src/osd/modules/render/bgfx/chainentryreader.cpp
index ce056b01900..0bf27e342cc 100644
--- a/src/osd/modules/render/bgfx/chainentryreader.cpp
+++ b/src/osd/modules/render/bgfx/chainentryreader.cpp
@@ -84,11 +84,11 @@ bgfx_chain_entry* chain_entry_reader::read_from_value(const Value& value, osd_op
std::string output_name = value["output"].GetString();
if (output_name != std::string("backbuffer"))
{
- return new bgfx_chain_entry(value["name"].GetString(), effect, suppressors, inputs, uniforms, targets.target(output_name));
+ return new bgfx_chain_entry(value["name"].GetString(), effect, suppressors, inputs, uniforms, targets, output_name);
}
else
{
- return new bgfx_chain_entry(value["name"].GetString(), effect, suppressors, inputs, uniforms, nullptr);
+ return new bgfx_chain_entry(value["name"].GetString(), effect, suppressors, inputs, uniforms, targets, "none");
}
}
diff --git a/src/osd/modules/render/bgfx/chainreader.cpp b/src/osd/modules/render/bgfx/chainreader.cpp
index d3632174516..5addfc6fffa 100644
--- a/src/osd/modules/render/bgfx/chainreader.cpp
+++ b/src/osd/modules/render/bgfx/chainreader.cpp
@@ -84,9 +84,9 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, osd_options& optio
{
assert(target_array[i].HasMember("name"));
assert(target_array[i]["name"].IsString());
- uint32_t mode = uint32_t(get_enum_from_value(value, "mode", TARGET_STYLE_NATIVE, STYLE_NAMES, STYLE_COUNT));
- bool bilinear = get_bool(target_array[i], "bilinear", false);
- bool double_buffer = get_bool(target_array[i], "doublebuffer", false);
+ uint32_t mode = uint32_t(get_enum_from_value(target_array[i], "mode", TARGET_STYLE_NATIVE, STYLE_NAMES, STYLE_COUNT));
+ bool bilinear = get_bool(target_array[i], "bilinear", true);
+ bool double_buffer = get_bool(target_array[i], "doublebuffer", true);
float prescalef = 1.0f;
float default_prescale = 1.0f;
diff --git a/src/osd/modules/render/bgfx/entryuniform.h b/src/osd/modules/render/bgfx/entryuniform.h
index 9cef6c86825..a72b9e00cf5 100644
--- a/src/osd/modules/render/bgfx/entryuniform.h
+++ b/src/osd/modules/render/bgfx/entryuniform.h
@@ -25,6 +25,7 @@ public:
virtual ~bgfx_entry_uniform() { }
virtual void bind() = 0;
+ std::string name() const { return m_uniform->name(); }
protected:
bgfx_uniform* m_uniform;
diff --git a/src/osd/modules/render/bgfx/fs_color.sc b/src/osd/modules/render/bgfx/fs_color.sc
index 8ee80110440..a90b380a8a9 100644
--- a/src/osd/modules/render/bgfx/fs_color.sc
+++ b/src/osd/modules/render/bgfx/fs_color.sc
@@ -24,9 +24,6 @@ uniform vec4 u_saturation;
#define Scale u_scale.xyz
#define Saturation u_saturation.x
-uniform vec4 u_texsize;
-uniform vec4 u_screenrect;
-
SAMPLER2D(DiffuseSampler, 0);
void main()
diff --git a/src/osd/modules/render/bgfx/fs_ntsc_encode.sc b/src/osd/modules/render/bgfx/fs_ntsc_encode.sc
index 2a16d225183..52246d270dd 100644
--- a/src/osd/modules/render/bgfx/fs_ntsc_encode.sc
+++ b/src/osd/modules/render/bgfx/fs_ntsc_encode.sc
@@ -28,7 +28,7 @@ SAMPLER2D(DiffuseSampler, 0);
void main()
{
- vec2 PValueSourceTexel = vec2(u_p_value.x, 0.0) * u_source_dims.xy;
+ vec2 PValueSourceTexel = vec2(u_p_value.x, 0.0) / u_source_dims.xy;
vec2 C0 = v_texcoord0 + PValueSourceTexel * vec2(0.0, 0.0);
vec2 C1 = v_texcoord0 + PValueSourceTexel * vec2(0.25, 0.0);
@@ -41,6 +41,9 @@ void main()
vec4 Texel2 = texture2D(DiffuseSampler, C2);
vec4 Texel3 = texture2D(DiffuseSampler, C3);
+ vec4 HPosition = Cx;
+ vec4 VPosition = Cy;
+
const vec4 YDot = vec4(0.299, 0.587, 0.114, 0.0);
const vec4 IDot = vec4(0.595716, -0.274453, -0.321263, 0.0);
const vec4 QDot = vec4(0.211456, -0.522591, 0.311135, 0.0);
@@ -48,18 +51,17 @@ void main()
vec4 I = vec4(dot(Texel0, IDot), dot(Texel1, IDot), dot(Texel2, IDot), dot(Texel3, IDot));
vec4 Q = vec4(dot(Texel0, QDot), dot(Texel1, QDot), dot(Texel2, QDot), dot(Texel3, QDot));
- const vec4 PI = vec4(3.1415927, 3.1415927, 3.1415927, 3.1415927);
- const vec4 PI2 = vec4(6.2831854, 6.2831854, 6.2831854, 6.2831854);
- vec4 W = PI2 * u_cc_value.xxxx * u_scan_time.xxxx;
- vec4 WoPI = W / PI;
+ const float PI = 3.1415927;
+ const float PI2 = 6.2831854;
+
+ float W = PI2 * u_cc_value.x * u_scan_time.x;
+ float WoPI = W / PI;
- vec4 HOffset = (u_b_value.xxxx + u_jitter_amount.xxxx * u_jitter_offset.xxxx) / WoPI;
- vec4 VScale = (u_a_value.xxxx * u_source_dims.yyyy) / WoPI;
+ float HOffset = (u_a_value.x + u_jitter_amount.x * u_jitter_offset.x) / WoPI;
+ float VScale = (u_b_value.x * u_source_dims.y) / WoPI;
- vec4 T = Cx + HOffset + Cy * VScale;
+ vec4 T = Cx + vec4(HOffset, HOffset, HOffset, HOffset) + Cy * vec4(VScale, VScale, VScale, VScale);
vec4 TW = T * W;
- vec4 output_rgb = Y + I * cos(TW) + Q * sin(TW);
-
- gl_FragColor = vec4(output_rgb.xyz, 1.0);
-}
+ gl_FragColor = Y + I * cos(TW) + Q * sin(TW);
+} \ No newline at end of file
diff --git a/src/osd/modules/render/bgfx/target.cpp b/src/osd/modules/render/bgfx/target.cpp
index e6a12c5aff3..9fc05625b33 100644
--- a/src/osd/modules/render/bgfx/target.cpp
+++ b/src/osd/modules/render/bgfx/target.cpp
@@ -22,7 +22,7 @@ bgfx_target::bgfx_target(std::string name, bgfx::TextureFormat::Enum format, uin
, m_page_count(double_buffer ? 2 : 1)
{
uint32_t wrap_mode = BGFX_TEXTURE_U_CLAMP | BGFX_TEXTURE_V_CLAMP;
- uint32_t filter_mode = filter ? 0 : (BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MAG_POINT | BGFX_TEXTURE_MIP_POINT);
+ uint32_t filter_mode = filter ? (BGFX_TEXTURE_MIN_ANISOTROPIC | BGFX_TEXTURE_MAG_ANISOTROPIC) : (BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MAG_POINT | BGFX_TEXTURE_MIP_POINT);
m_textures = new bgfx::TextureHandle[m_page_count];
m_targets = new bgfx::FrameBufferHandle[m_page_count];
diff --git a/src/osd/modules/render/bgfx/targetmanager.cpp b/src/osd/modules/render/bgfx/targetmanager.cpp
index e61bda90747..b04a280eb1d 100644
--- a/src/osd/modules/render/bgfx/targetmanager.cpp
+++ b/src/osd/modules/render/bgfx/targetmanager.cpp
@@ -58,19 +58,20 @@ void target_manager::update_guest_targets(uint16_t width, uint16_t height)
{
m_guest_width = width;
m_guest_height = height;
- std::vector<bgfx_target*> to_resize;
for (std::pair<std::string, bgfx_target*> target : m_targets)
{
if ((target.second)->style() == TARGET_STYLE_GUEST)
{
- to_resize.push_back(target.second);
+ bgfx_target* target_ptr = target.second;
+ std::string name = target_ptr->name();
+ const bgfx::TextureFormat::Enum format = target_ptr->format();
+ const bool double_buffered = target_ptr->double_buffered();
+ const bool filter = target_ptr->filter();
+ delete target_ptr;
+
+ target.second = new bgfx_target(name, format, width, height, TARGET_STYLE_GUEST, double_buffered, filter);
+ m_textures.add_provider(name, target.second);
}
}
-
- for (bgfx_target* target : to_resize)
- {
- m_targets[target->name()] = new bgfx_target(target->name(), target->format(), width, height, TARGET_STYLE_GUEST, target->double_buffered(), target->filter());
- delete target;
- }
}
}
diff --git a/src/osd/modules/render/bgfx/texturemanager.cpp b/src/osd/modules/render/bgfx/texturemanager.cpp
index adf31790aec..3c32bcd13c3 100644
--- a/src/osd/modules/render/bgfx/texturemanager.cpp
+++ b/src/osd/modules/render/bgfx/texturemanager.cpp
@@ -28,7 +28,15 @@ texture_manager::~texture_manager()
void texture_manager::add_provider(std::string name, bgfx_texture_handle_provider* provider)
{
- m_textures[name] = provider;
+ std::map<std::string, bgfx_texture_handle_provider*>::iterator iter = m_textures.find(name);
+ if (iter != m_textures.end())
+ {
+ iter->second = provider;
+ }
+ else
+ {
+ m_textures[name] = provider;
+ }
}
bgfx_texture* texture_manager::create_texture(std::string name, bgfx::TextureFormat::Enum format, uint32_t width, uint32_t height, void* data, uint32_t flags)