Previous 199869 Revisions Next

r46594 Tuesday 22nd March, 2016 at 15:54:01 UTC by Ryan Holtz
Fix housemnq crash, nw
[/branches/bgfx_shader/src/osd/modules/render]drawbgfx.cpp
[/branches/bgfx_shader/src/osd/modules/render/bgfx]chainentry.cpp inputpair.cpp inputpair.h target.cpp target.h targetmanager.cpp targetmanager.h targetreader.cpp

branches/bgfx_shader/src/osd/modules/render/bgfx/chainentry.cpp
r255105r255106
5555
5656    for (bgfx_input_pair input : m_inputs)
5757    {
58        input.bind(m_effect, textures, screen);
58        input.bind(m_effect, m_targets, textures, screen);
5959    }
6060
6161    bgfx::TransientVertexBuffer buffer;
r255105r255106
7474
7575    m_effect->submit(view, blend);
7676
77    std::string output_name = m_output;
78    if (output_name == "output" || output_name == "previous")
79    {
80        output_name = output_name + std::to_string(screen);
81    }
77    std::string output_name = m_output + std::to_string(screen);
8278    if (m_targets.target(output_name) != nullptr)
8379    {
8480        m_targets.target(output_name)->page_flip();
r255105r255106
158154   bgfx::FrameBufferHandle handle = BGFX_INVALID_HANDLE;
159155   uint16_t width = screen_width;
160156   uint16_t height = screen_height;
161    std::string output_name = m_output;
162    if (output_name == "output" || output_name == "previous")
163    {
164        output_name = output_name + std::to_string(screen);
165    }
157    std::string output_name = m_output + std::to_string(screen);
166158    if (m_targets.target(output_name) != nullptr)
167159    {
168160        bgfx_target* output = m_targets.target(output_name);
branches/bgfx_shader/src/osd/modules/render/bgfx/inputpair.cpp
r255105r255106
1717#include "effect.h"
1818#include "uniform.h"
1919#include "texturemanager.h"
20#include "targetmanager.h"
2021
2122bgfx_input_pair::bgfx_input_pair(int index, std::string sampler, std::string texture)
2223   : m_index(index)
r255105r255106
2526{
2627}
2728
28void bgfx_input_pair::bind(bgfx_effect *effect, texture_manager& textures, const int32_t screen) const
29void bgfx_input_pair::bind(bgfx_effect *effect, target_manager& targets, texture_manager& textures, const int32_t screen) const
2930{
3031    assert(effect->uniform(m_sampler) != nullptr);
3132    std::string texture = m_texture;
32    if (m_texture == "previous")
33    if (targets.target(m_texture + std::to_string(screen)) != nullptr)
3334    {
3435        texture = m_texture + std::to_string(screen);
3536    }
branches/bgfx_shader/src/osd/modules/render/bgfx/inputpair.h
r255105r255106
1818
1919class bgfx_effect;
2020class texture_manager;
21class target_manager;
2122
2223class bgfx_input_pair
2324{
2425public:
2526   bgfx_input_pair(int index, std::string sampler, std::string texture);
2627
27   void bind(bgfx_effect *effect, texture_manager& textures, const int32_t screen) const;
28   void bind(bgfx_effect *effect, target_manager& targets, texture_manager& textures, const int32_t screen) const;
2829
2930    // Getters
3031    std::string sampler() const { return m_sampler; }
branches/bgfx_shader/src/osd/modules/render/bgfx/target.cpp
r255105r255106
66//
77//============================================================
88
9#include "emu.h"
10
911#include "target.h"
1012
11bgfx_target::bgfx_target(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t prescale_x, uint32_t prescale_y, uint32_t style, bool double_buffer, bool filter, bool init, bool output)
13bgfx_target::bgfx_target(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t prescale_x, uint32_t prescale_y, uint32_t style, int32_t index, bool double_buffer, bool filter, bool init, bool output)
1214   : m_name(name)
1315   , m_format(format)
1416   , m_targets(nullptr)
r255105r255106
2123   , m_style(style)
2224   , m_filter(filter)
2325    , m_output(output)
24   , m_current_page(0)
26    , m_index(index)
27    , m_current_page(0)
2528   , m_initialized(false)
2629   , m_page_count(double_buffer ? 2 : 1)
2730{
r255105r255106
3538      for (int page = 0; page < m_page_count; page++)
3639      {
3740         m_textures[page] = bgfx::createTexture2D(width * prescale_x, height * prescale_y, 1, format, wrap_mode | filter_mode | BGFX_TEXTURE_RT);
41            assert(m_textures[page].idx != 0xffff);
3842         m_targets[page] = bgfx::createFrameBuffer(1, &m_textures[page], false);
39      }
43            assert(m_targets[page].idx != 0xffff);
44        }
4045
4146      m_initialized = true;
4247   }
r255105r255106
5560   , m_style(TARGET_STYLE_CUSTOM)
5661   , m_filter(false)
5762   , m_current_page(0)
58   , m_initialized(true)
63    , m_index(-1)
64    , m_initialized(true)
5965   , m_page_count(0)
6066{
6167   m_targets = new bgfx::FrameBufferHandle[1];
r255105r255106
6672
6773bgfx_target::~bgfx_target()
6874{
69   if (!m_initialized) return;
75   if (!m_initialized)
76    {
77        return;
78    }
7079
7180   if (m_page_count > 0)
7281   {
7382      for (int page = 0; page < m_page_count; page++)
7483      {
7584         bgfx::destroyFrameBuffer(m_targets[page]);
76         bgfx::destroyTexture(m_textures[page]);
77      }
85            bgfx::destroyTexture(m_textures[page]);
86        }
7887      delete [] m_textures;
7988      delete [] m_targets;
8089   }
branches/bgfx_shader/src/osd/modules/render/bgfx/target.h
r255105r255106
2727class bgfx_target : public bgfx_texture_handle_provider
2828{
2929public:
30   bgfx_target(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t prescale_x, uint32_t prescale_y, uint32_t style, bool double_buffer, bool filter, bool init = true, bool output = false);
30   bgfx_target(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t prescale_x, uint32_t prescale_y, uint32_t style, int32_t index, bool double_buffer, bool filter, bool init = true, bool output = false);
3131   bgfx_target(void *handle, uint16_t width, uint16_t height);
3232   virtual ~bgfx_target();
3333
r255105r255106
4343    uint32_t                    prescale_x() const { return m_prescale_x; }
4444    uint32_t                    prescale_y() const { return m_prescale_y; }
4545    bool                        output() const { return m_output; }
46    int32_t                     index() const { return m_index; }
4647
4748   // bgfx_texture_handle_provider
4849   virtual uint16_t width() const override { return m_width; }
r255105r255106
6768   uint32_t               m_style;
6869   bool                  m_filter;
6970    bool                        m_output;
71    int32_t                     m_index;
7072
7173   uint32_t               m_current_page;
7274
branches/bgfx_shader/src/osd/modules/render/bgfx/targetmanager.cpp
r255105r255106
1919
2020#include "target.h"
2121
22const int32_t target_manager::MAX_SCREENS = 100;
23
24target_manager::target_manager(osd_options& options, texture_manager& textures)
25    : m_textures(textures)
26    , m_options(options)
27    , m_screen_count(0)
28{
29    m_guest_width = new uint16_t[MAX_SCREENS];
30    m_guest_height = new uint16_t[MAX_SCREENS];
31    memset(m_guest_width, 0, sizeof(uint16_t) * MAX_SCREENS);
32    memset(m_guest_height, 0, sizeof(uint16_t) * MAX_SCREENS);
33}
34
2235target_manager::~target_manager()
2336{
2437   for (std::pair<std::string, bgfx_target*> target : m_targets)
2538   {
26      delete target.second;
39        if (target.second != nullptr)
40        {
41            delete target.second;
42        }
2743   }
2844   m_targets.clear();
45    delete [] m_guest_width;
46    delete [] m_guest_height;
2947}
3048
3149bgfx_target* target_manager::create_target(std::string name, bgfx::TextureFormat::Enum format, uint32_t width, uint32_t height, uint32_t prescale_x, uint32_t prescale_y, uint32_t style, bool double_buffer, bool filter, bool output)
3250{
33   bgfx_target* target = new bgfx_target(name, format, width, height, prescale_x, prescale_y, style, double_buffer, filter, width > 0 && height > 0, output);
51   bgfx_target* target = new bgfx_target(name, format, width, height, prescale_x, prescale_y, style, -1, double_buffer, filter, width > 0 && height > 0, output);
3452   m_targets[name] = target;
3553
3654   m_textures.add_provider(name, target);
r255105r255106
5573   return nullptr;
5674}
5775
58void target_manager::update_guest_targets(uint16_t width, uint16_t height)
76void target_manager::update_guest_targets(int32_t screen, uint16_t width, uint16_t height)
5977{
60   if (width != m_guest_width || height != m_guest_height)
78    if (screen < 0 || screen >= MAX_SCREENS)
79    {
80        return;
81    }
82
83   if (width != m_guest_width[screen] || height != m_guest_height[screen])
6184   {
62      m_guest_width = width;
63      m_guest_height = height;
85      m_guest_width[screen] = width;
86      m_guest_height[screen] = height;
87        ensure_guest_targets();
88        rebuild_guest_targets(screen);
89   }
90}
6491
65      std::vector<bgfx_target*> to_resize;
66      for (std::pair<std::string, bgfx_target*> target : m_targets)
67      {
68         if ((target.second)->style() == TARGET_STYLE_GUEST)
69         {
70            to_resize.push_back(target.second);
71         }
72      }
92void target_manager::ensure_guest_targets()
93{
94    // Build a list of all guest targets that end in 0 *or* don't end in a number
95    std::vector<std::string> existing_names;
96    for (std::pair<std::string, bgfx_target*> target_pair : m_targets)
97    {
98        bgfx_target* target = target_pair.second;
99        if (target == nullptr || target->style() != TARGET_STYLE_GUEST)
100        {
101            continue;
102        }
73103
74      for (bgfx_target* target : to_resize)
75      {
76         std::string name = target->name();
77         const bgfx::TextureFormat::Enum format = target->format();
78         const bool double_buffered = target->double_buffered();
79         const bool filter = target->filter();
80         const uint32_t prescale_x = target->prescale_x();
81         const uint32_t prescale_y = target->prescale_y();
82         delete target;
104        // If the last character is not a digit, add it to the list
105        std::string name = target->name();
106        char last_char = name[name.length() - 1];
107        if ((last_char & 0xf0) != 0x30) {
108            existing_names.push_back(name);
109        }
83110
84         m_targets[name] = new bgfx_target(name, format, m_guest_width, m_guest_height, prescale_x, prescale_y, TARGET_STYLE_GUEST, double_buffered, filter);
85         m_textures.add_provider(name, m_targets[name]);
86      }
87   }
111        // If the last character is a zero, and the stripped name isn't already in the list, strip it off and add it to the list
112        if (last_char == 0x30)
113        {
114            std::string shortened_name = name.substr(0, name.length() - 1);
115            bool exists = false;
116            for (std::string other_name : existing_names)
117            {
118                if (other_name == shortened_name)
119                {
120                    exists = true;
121                    break;
122                }
123            }
124            if (!exists)
125            {
126                existing_names.push_back(shortened_name);
127            }
128        }
129    }
130
131    for (std::string name : existing_names)
132    {
133        create_nonexistent_targets(name);
134    }
88135}
89136
90void target_manager::update_window_count(uint32_t count)
137void target_manager::rebuild_guest_targets(int32_t screen)
91138{
92    if (count != m_window_count)
139    std::vector<bgfx_target*> to_resize;
140    for (std::pair<std::string, bgfx_target*> target : m_targets) {
141        bgfx_target* target_ptr = target.second;
142        if (target_ptr == nullptr) {
143            continue;
144        }
145        bool is_guest = target_ptr->style() == TARGET_STYLE_GUEST;
146        bool is_desired_screen = target_ptr->index() == screen || target_ptr->index() == -1;
147        std::string name = target_ptr->name();
148        bool is_indexed = (name[name.length() - 1] & 0xf0) == 0x30;
149        if (is_guest && is_desired_screen && is_indexed) {
150            to_resize.push_back(target.second);
151        }
152    }
153
154    for (bgfx_target* target : to_resize) {
155        std::string name = target->name();
156        const bgfx::TextureFormat::Enum format = target->format();
157        const bool double_buffered = target->double_buffered();
158        const bool filter = target->filter();
159        const uint32_t prescale_x = target->prescale_x();
160        const uint32_t prescale_y = target->prescale_y();
161        delete target;
162
163        const uint16_t width = m_guest_width[screen];
164        const uint16_t height = m_guest_height[screen];
165        const bool init = width > 0 && height > 0;
166        m_targets[name] = new bgfx_target(name, format, width, height, prescale_x, prescale_y, TARGET_STYLE_GUEST, screen, double_buffered, filter, init);
167        m_textures.add_provider(name, m_targets[name]);
168    }
169}
170
171void target_manager::update_screen_count(uint32_t count)
172{
173    if (count != m_screen_count)
93174    {
94        m_window_count = count;
95        rebuild_outputs();
175        uint32_t old_count = m_screen_count;
176        m_screen_count = count;
177        if (m_screen_count > old_count)
178        {
179            create_nonexistent_targets("output");
180            create_nonexistent_targets("previous");
181        }
96182    }
97183}
98184
99void target_manager::rebuild_outputs()
185void target_manager::create_nonexistent_targets(std::string name)
100186{
101    for (uint32_t i = 0; i < m_window_count; i++)
187    bool double_buffered = true;
188    bool filter = true;
189    if (m_targets[name + "0"] != nullptr)
102190    {
103        rebuild_target("output" + std::to_string(i));
104        rebuild_target("previous" + std::to_string(i));
191        double_buffered = m_targets[name + "0"]->double_buffered();
192        filter = m_targets[name + "0"]->filter();
105193    }
194
195    for (uint32_t screen = 0; screen < m_screen_count; screen++)
196    {
197        create_guest_if_nonexistent(name, screen, double_buffered, filter);
198    }
106199}
107200
108void target_manager::rebuild_target(std::string name)
201bool target_manager::create_guest_if_nonexistent(std::string name, int32_t screen, bool double_buffered, bool filter)
109202{
110    bgfx_target* target = m_targets[name];
111    if (target != nullptr) {
112        delete target;
203    std::string full_name = name + std::to_string(screen);
204    if (m_targets[full_name] != nullptr)
205    {
206        return false;
113207    }
114    m_targets[name] = new bgfx_target(name, bgfx::TextureFormat::RGBA8, m_guest_width, m_guest_height, m_options.bgfx_prescale_x(), m_options.bgfx_prescale_y(), TARGET_STYLE_GUEST, true, true);
115    m_textures.add_provider(name, m_targets[name]);
208
209    bool init = m_guest_width[screen] > 0 && m_guest_height[screen] > 0;
210    m_targets[full_name] = new bgfx_target(full_name, bgfx::TextureFormat::RGBA8, m_guest_width[screen], m_guest_height[screen], m_options.bgfx_prescale_x(), m_options.bgfx_prescale_y(), TARGET_STYLE_GUEST, screen, double_buffered, filter, init);
211    return true;
116212}
No newline at end of file
branches/bgfx_shader/src/osd/modules/render/bgfx/targetmanager.h
r255105r255106
2626
2727class target_manager {
2828public:
29   target_manager(osd_options& options, texture_manager& textures) : m_textures(textures), m_options(options), m_guest_width(0), m_guest_height(0), m_window_count(0) { }
29   target_manager(osd_options& options, texture_manager& textures);
3030   ~target_manager();
3131
3232   bgfx_target* create_target(std::string name, bgfx::TextureFormat::Enum format, uint32_t width, uint32_t height, uint32_t prescale_x, uint32_t prescale_y, uint32_t style, bool double_buffer, bool filter, bool output);
3333   bgfx_target* create_backbuffer(void *handle, uint32_t width, uint32_t height);
3434
35   void update_guest_targets(uint16_t width, uint16_t height);
36    void update_window_count(uint32_t count);
35   void update_guest_targets(int32_t screen, uint16_t width, uint16_t height);
36    void update_screen_count(uint32_t count);
3737
3838   // Getters
3939   bgfx_target* target(std::string name);
40   uint16_t guest_width() const { return m_guest_width; }
41   uint16_t guest_height() const { return m_guest_height; }
40   uint16_t guest_width(int32_t screen) const { return m_guest_width[screen]; }
41   uint16_t guest_height(int32_t screen) const { return m_guest_height[screen]; }
4242
4343private:
44    void rebuild_guest_targets(int32_t screen);
4445    void rebuild_outputs();
45    void rebuild_target(std::string name);
46    void ensure_guest_targets();
47    void create_nonexistent_targets(std::string name);
48    bool create_guest_if_nonexistent(std::string name, int32_t screen, bool double_buffered, bool filter);
4649
4750   std::map<std::string, bgfx_target*> m_targets;
4851   texture_manager& m_textures;
4952    osd_options& m_options;
5053
51   uint16_t m_guest_width;
52   uint16_t m_guest_height;
53    uint32_t m_window_count;
54   uint16_t *m_guest_width;
55   uint16_t *m_guest_height;
56    uint32_t m_screen_count;
57
58    static const int32_t MAX_SCREENS;
5459};
5560
5661#endif // __DRAWBGFX_TARGET_MANAGER__
branches/bgfx_shader/src/osd/modules/render/bgfx/targetreader.cpp
r255105r255106
4040   switch (mode)
4141   {
4242      case TARGET_STYLE_GUEST:
43         width = targets.guest_width();
44         height = targets.guest_height();
4543         break;
4644      case TARGET_STYLE_NATIVE:
4745         width = screen_width;
branches/bgfx_shader/src/osd/modules/render/drawbgfx.cpp
r255105r255106
331331   vertex[5].m_v = v[0];
332332}
333333
334void renderer_bgfx::process_screen_quad(int view, render_primitive* prim)
334void renderer_bgfx::process_screen_quad(int screen, render_primitive* prim)
335335{
336336    uint32_t texture_flags = BGFX_TEXTURE_U_CLAMP | BGFX_TEXTURE_V_CLAMP;
337337    if (video_config.filter == 0)
r255105r255106
348348    bgfx_texture *texture = new bgfx_texture("screen", bgfx::TextureFormat::RGBA8, tex_width, tex_height, mem);
349349    m_textures->add_provider("screen", texture);
350350
351    int screens = 0;
352    screen_device_iterator iter(window().machine().root_device());
353    for (const screen_device *screen = iter.first(); screen != nullptr; screen = iter.next())
354    {
355        screens++;
356    }
357    m_targets->update_guest_targets(tex_width, tex_height);
358    m_targets->update_window_count(screens);
351    m_targets->update_guest_targets(screen, tex_width, tex_height);
359352
360    m_screen_chain->process(prim, view, view / m_screen_chain->applicable_passes(), *m_textures, window(), get_blend_state(PRIMFLAG_GET_BLENDMODE(prim->flags)));
353    m_screen_chain->process(prim, screen * m_screen_chain->applicable_passes(), screen, *m_textures, window(), get_blend_state(PRIMFLAG_GET_BLENDMODE(prim->flags)));
361354
362355    m_textures->add_provider("screen", nullptr);
363356    delete texture;
r255105r255106
744737    // process
745738    render_primitive *prim = window().m_primlist->first();
746739
747    int seen = 0;
740    int screens = 0;
741    screen_device_iterator iter(window().machine().root_device());
742    for (const screen_device *screen = iter.first(); screen != nullptr; screen = iter.next()) {
743        screens++;
744    }
745    m_targets->update_screen_count(screens);
746
747    int seen_screen_quads = 0;
748748    while (prim != nullptr)
749749    {
750750        if (PRIMFLAG_GET_SCREENTEX(prim->flags))
751751        {
752         process_screen_quad(m_screen_chain->applicable_passes() * seen, prim);
753            seen++;
752         process_screen_quad(seen_screen_quads, prim);
753            seen_screen_quads++;
754754        }
755755        prim = prim->next();
756756    }
757757
758758    window().m_primlist->release_lock();
759759
760    uint32_t total_passes = seen * m_screen_chain->applicable_passes();
760    uint32_t total_passes = seen_screen_quads * m_screen_chain->applicable_passes();
761761    bgfx::setViewFrameBuffer(total_passes, BGFX_INVALID_HANDLE);
762762
763763    return total_passes;


Previous 199869 Revisions Next


© 1997-2024 The MAME Team