diff options
author | 2016-03-16 18:52:07 +0100 | |
---|---|---|
committer | 2016-03-16 18:52:07 +0100 | |
commit | 493cf7289be81f15a975d60b48e58b0132854323 (patch) | |
tree | ce0312c41258ad27182bffada0faacb0b5a9d3ac /src | |
parent | e1883e3090510d943af54ae24cee3a637e4d72a5 (diff) |
More bgfx HLSL fixups, nw
Diffstat (limited to 'src')
-rw-r--r-- | src/osd/modules/render/bgfx/chainentry.cpp | 28 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/chainentry.h | 9 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/chainentryreader.cpp | 4 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/chainreader.cpp | 6 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/entryuniform.h | 1 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/fs_color.sc | 3 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/fs_ntsc_encode.sc | 26 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/target.cpp | 2 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/targetmanager.cpp | 17 | ||||
-rw-r--r-- | src/osd/modules/render/bgfx/texturemanager.cpp | 10 |
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) |