summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/d3d/d3dhlsl.cpp
diff options
context:
space:
mode:
author Jezze <jezze@gmx.net>2016-10-22 17:12:38 +0200
committer Jezze <jezze@gmx.net>2016-10-22 22:56:15 +0200
commit390e6bd43d3f9f429e100b5cf65caf7836e85a4a (patch)
tree791a41254b5b9dd8d918e90418edd617471fe383 /src/osd/modules/render/d3d/d3dhlsl.cpp
parente42ed88254f3c875974e142472da25f6d4346fa9 (diff)
Refactored d3d_render_target (nw)
* removed cashe_target class * moved cashe texture and surface to d3d_render_target class * render targets are now created per screen not per screen texture * removed useless creation of render targets for ui textures
Diffstat (limited to 'src/osd/modules/render/d3d/d3dhlsl.cpp')
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.cpp218
1 files changed, 61 insertions, 157 deletions
diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp
index 0f7b61ea6b0..db39deb0aad 100644
--- a/src/osd/modules/render/d3d/d3dhlsl.cpp
+++ b/src/osd/modules/render/d3d/d3dhlsl.cpp
@@ -368,37 +368,12 @@ void shaders::render_snapshot(IDirect3DSurface9 *surface)
//============================================================
-// remove_cache_target - remove an active cache target
-//============================================================
-
-void shaders::remove_cache_target(cache_target *cache)
-{
- if (cache == nullptr)
- return;
-
- for (auto it = m_cache_target_list.begin(); it != m_cache_target_list.end(); it++)
- {
- if ((*it).get() == cache)
- {
- m_cache_target_list.erase(it);
- break;
- }
- }
-}
-
-
-//============================================================
// remove_render_target - remove an active target
//============================================================
-void shaders::remove_render_target(texture_info *texture)
-{
- remove_render_target(find_render_target(texture));
-}
-
-void shaders::remove_render_target(int source_width, int source_height, uint32_t screen_index, uint32_t page_index)
+void shaders::remove_render_target(int source_width, int source_height, uint32_t screen_index)
{
- remove_render_target(find_render_target(source_width, source_height, screen_index, page_index));
+ remove_render_target(find_render_target(source_width, source_height, screen_index));
}
void shaders::remove_render_target(d3d_render_target *rt)
@@ -406,11 +381,6 @@ void shaders::remove_render_target(d3d_render_target *rt)
if (rt == nullptr)
return;
- int screen_index = rt->screen_index;
- int other_page = 1 - rt->page_index;
- int width = rt->width;
- int height = rt->height;
-
for (auto it = m_render_target_list.begin(); it != m_render_target_list.end(); it++)
{
if ((*it).get() == rt)
@@ -419,11 +389,6 @@ void shaders::remove_render_target(d3d_render_target *rt)
break;
}
}
-
- remove_cache_target(find_cache_target(screen_index, width, height));
-
- // Remove other double-buffered page (if it exists)
- remove_render_target(width, height, screen_index, other_page);
}
@@ -859,6 +824,7 @@ void shaders::begin_draw()
return;
}
+ curr_screen = 0;
curr_effect = default_effect;
default_effect->set_technique("ScreenTechnique");
@@ -939,48 +905,13 @@ void shaders::blit(
// shaders::find_render_target
//============================================================
-d3d_render_target* shaders::find_render_target(texture_info *texture)
-{
- uint32_t screen_index_data = (uint32_t)texture->get_texinfo().osddata;
- uint32_t screen_index = screen_index_data >> 1;
- uint32_t page_index = screen_index_data & 1;
-
- return find_render_target(texture->get_width(), texture->get_height(), screen_index, page_index);
-}
-
-
-//============================================================
-// shaders::find_render_target
-//============================================================
-
-d3d_render_target* shaders::find_render_target(int source_width, int source_height, uint32_t screen_index, uint32_t page_index)
+d3d_render_target* shaders::find_render_target(int source_width, int source_height, uint32_t screen_index)
{
for (auto it = m_render_target_list.begin(); it != m_render_target_list.end(); it++)
{
if ((*it)->width == source_width &&
(*it)->height == source_height &&
- (*it)->screen_index == screen_index &&
- (*it)->page_index == page_index)
- {
- return (*it).get();
- }
- }
-
- return nullptr;
-}
-
-
-//============================================================
-// shaders::find_cache_target
-//============================================================
-
-cache_target *shaders::find_cache_target(uint32_t screen_index, int width, int height)
-{
- for (auto it = m_cache_target_list.begin(); it != m_cache_target_list.end(); it++)
- {
- if ((*it)->screen_index == screen_index &&
- (*it)->width == width &&
- (*it)->height == height)
+ (*it)->screen_index == screen_index)
{
return (*it).get();
}
@@ -1128,7 +1059,7 @@ int shaders::defocus_pass(d3d_render_target *rt, int source_index, poly_info *po
return next_index;
}
-int shaders::phosphor_pass(d3d_render_target *rt, cache_target *ct, int source_index, poly_info *poly, int vertnum)
+int shaders::phosphor_pass(d3d_render_target *rt, int source_index, poly_info *poly, int vertnum)
{
int next_index = source_index;
@@ -1141,7 +1072,7 @@ int shaders::phosphor_pass(d3d_render_target *rt, cache_target *ct, int source_i
curr_effect = phosphor_effect;
curr_effect->update_uniforms();
curr_effect->set_texture("Diffuse", rt->target_texture[next_index]);
- curr_effect->set_texture("LastPass", ct->texture);
+ curr_effect->set_texture("LastPass", rt->cache_texture);
curr_effect->set_bool("Passthrough", false);
next_index = rt->next_index(next_index);
@@ -1154,7 +1085,7 @@ int shaders::phosphor_pass(d3d_render_target *rt, cache_target *ct, int source_i
curr_effect->set_bool("Passthrough", true);
// Avoid changing targets due to page flipping
- blit(ct->target, true, D3DPT_TRIANGLELIST, 0, 2);
+ blit(rt->cache_surface, true, D3DPT_TRIANGLELIST, 0, 2);
return next_index;
}
@@ -1401,11 +1332,17 @@ void shaders::render_quad(poly_info *poly, int vertnum)
auto win = d3d->assert_window();
- if (PRIMFLAG_GET_SCREENTEX(d3d->get_last_texture_flags()) && curr_texture != nullptr)
+ if (PRIMFLAG_GET_SCREENTEX(poly->flags()))
{
+ if (curr_texture == nullptr)
+ {
+ osd_printf_verbose("Direct3D: No texture\n");
+ return;
+ }
+
curr_screen = curr_screen < num_screens ? curr_screen : 0;
- curr_render_target = find_render_target(curr_texture);
+ curr_render_target = find_render_target(curr_texture->get_width(), curr_texture->get_height(), curr_screen);
d3d_render_target *rt = curr_render_target;
if (rt == nullptr)
@@ -1414,8 +1351,6 @@ void shaders::render_quad(poly_info *poly, int vertnum)
return;
}
- cache_target *ct = find_cache_target(rt->screen_index, curr_texture->get_width(), curr_texture->get_height());
-
int next_index = 0;
next_index = ntsc_pass(rt, next_index, poly, vertnum); // handled in bgfx
@@ -1424,7 +1359,7 @@ void shaders::render_quad(poly_info *poly, int vertnum)
next_index = deconverge_pass(rt, next_index, poly, vertnum); // handled in bgfx
next_index = defocus_pass(rt, next_index, poly, vertnum); // 1st pass
next_index = defocus_pass(rt, next_index, poly, vertnum); // 2nd pass
- next_index = phosphor_pass(rt, ct, next_index, poly, vertnum);
+ next_index = phosphor_pass(rt, next_index, poly, vertnum);
// create bloom textures
int phosphor_index = next_index;
@@ -1450,13 +1385,15 @@ void shaders::render_quad(poly_info *poly, int vertnum)
}
else if (PRIMFLAG_GET_VECTOR(poly->flags()))
{
+ curr_screen = curr_screen < num_screens ? curr_screen : 0;
+
int source_width = int(poly->prim_width() + 0.5f);
int source_height = int(poly->prim_height() + 0.5f);
if (win->swap_xy())
{
std::swap(source_width, source_height);
}
- curr_render_target = find_render_target(source_width, source_height, 0, 0);
+ curr_render_target = find_render_target(source_width, source_height, curr_screen);
d3d_render_target *rt = curr_render_target;
if (rt == nullptr)
@@ -1474,6 +1411,8 @@ void shaders::render_quad(poly_info *poly, int vertnum)
{
osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call\n", result);
}
+
+ curr_screen++;
}
else if (PRIMFLAG_GET_VECTORBUF(poly->flags()))
{
@@ -1485,7 +1424,7 @@ void shaders::render_quad(poly_info *poly, int vertnum)
{
std::swap(source_width, source_height);
}
- curr_render_target = find_render_target(source_width, source_height, 0, 0);
+ curr_render_target = find_render_target(source_width, source_height, curr_screen);
d3d_render_target *rt = curr_render_target;
if (rt == nullptr)
@@ -1494,15 +1433,13 @@ void shaders::render_quad(poly_info *poly, int vertnum)
return;
}
- cache_target *ct = find_cache_target(rt->screen_index, rt->width, rt->height);
-
int next_index = 0;
next_index = vector_buffer_pass(rt, next_index, poly, vertnum);
next_index = deconverge_pass(rt, next_index, poly, vertnum);
next_index = defocus_pass(rt, next_index, poly, vertnum); // 1st pass
next_index = defocus_pass(rt, next_index, poly, vertnum); // 2nd pass
- next_index = phosphor_pass(rt, ct, next_index, poly, vertnum);
+ next_index = phosphor_pass(rt, next_index, poly, vertnum);
// create bloom textures
int phosphor_index = next_index;
@@ -1558,26 +1495,10 @@ void shaders::end_draw()
//============================================================
-// shaders::add_cache_target - register a cache target
-//============================================================
-
-bool shaders::add_cache_target(renderer_d3d9* d3d, texture_info* texture, int source_width, int source_height, int target_width, int target_height, int screen_index)
-{
- auto target = std::make_unique<cache_target>();
-
- if (!target->init(d3d, source_width, source_height, target_width, target_height, screen_index))
- return false;
-
- m_cache_target_list.push_back(std::move(target));
-
- return true;
-}
-
-//============================================================
// shaders::get_texture_target
//============================================================
-d3d_render_target* shaders::get_texture_target(render_primitive *prim, texture_info *texture)
+d3d_render_target* shaders::get_texture_target(render_primitive *prim, int width, int height, int screen)
{
if (!enabled())
{
@@ -1586,6 +1507,9 @@ d3d_render_target* shaders::get_texture_target(render_primitive *prim, texture_i
auto win = d3d->assert_window();
+ int source_width = width;
+ int source_height = height;
+ int source_screen = screen;
int target_width = int(prim->get_full_quad_width() + 0.5f);
int target_height = int(prim->get_full_quad_height() + 0.5f);
target_width *= oversampling_enable ? 2 : 1;
@@ -1596,24 +1520,25 @@ d3d_render_target* shaders::get_texture_target(render_primitive *prim, texture_i
}
// find render target and check if the size of the target quad has changed
- d3d_render_target *target = find_render_target(texture);
+ d3d_render_target *target = find_render_target(source_width, source_height, source_screen);
if (target != nullptr)
{
- if (PRIMFLAG_GET_SCREENTEX(prim->flags))
+ // check if the size of the screen quad has changed
+ if (target->target_width != target_width || target->target_height != target_height)
{
- // check if the size of the screen quad has changed
- if (target->target_width != target_width || target->target_height != target_height)
- {
- osd_printf_verbose("Direct3D: Get texture target - invalid size\n");
- return nullptr;
- }
+ osd_printf_verbose("Direct3D: Get texture target - invalid size\n");
+ return nullptr;
}
}
+ else
+ {
+ osd_printf_verbose("Direct3D: Get texture target - not found - %dx%d:%d\n", source_width, source_height, source_screen);
+ }
return target;
}
-d3d_render_target* shaders::get_vector_target(render_primitive *prim)
+d3d_render_target* shaders::get_vector_target(render_primitive *prim, int screen)
{
if (!enabled())
{
@@ -1624,6 +1549,7 @@ d3d_render_target* shaders::get_vector_target(render_primitive *prim)
int source_width = int(prim->get_quad_width() + 0.5f);
int source_height = int(prim->get_quad_height() + 0.5f);
+ int source_screen = screen;
int target_width = int(prim->get_full_quad_width() + 0.5f);
int target_height = int(prim->get_full_quad_height() + 0.5f);
target_width *= oversampling_enable ? 2 : 1;
@@ -1635,24 +1561,25 @@ d3d_render_target* shaders::get_vector_target(render_primitive *prim)
}
// find render target
- d3d_render_target *target = find_render_target(source_width, source_height, 0, 0);
+ d3d_render_target *target = find_render_target(source_width, source_height, source_screen);
if (target != nullptr)
{
- if (PRIMFLAG_GET_VECTORBUF(prim->flags))
+ // check if the size of the screen quad has changed
+ if (target->target_width != target_width || target->target_height != target_height)
{
- // check if the size of the screen quad has changed
- if (target->target_width != target_width || target->target_height != target_height)
- {
- osd_printf_verbose("Direct3D: Get vector target - invalid size\n");
- return nullptr;
- }
+ osd_printf_verbose("Direct3D: Get vector target - invalid size\n");
+ return nullptr;
}
}
+ else
+ {
+ osd_printf_verbose("Direct3D: Get vector target - not found - %dx%d:%d\n", source_width, source_height, source_screen);
+ }
return target;
}
-bool shaders::create_vector_target(render_primitive *prim)
+bool shaders::create_vector_target(render_primitive *prim, int screen)
{
if (!enabled())
{
@@ -1663,6 +1590,7 @@ bool shaders::create_vector_target(render_primitive *prim)
int source_width = int(prim->get_quad_width() + 0.5f);
int source_height = int(prim->get_quad_height() + 0.5f);
+ int source_screen = screen;
int target_width = int(prim->get_full_quad_width() + 0.5f);
int target_height = int(prim->get_full_quad_height() + 0.5f);
target_width *= oversampling_enable ? 2 : 1;
@@ -1674,7 +1602,7 @@ bool shaders::create_vector_target(render_primitive *prim)
}
osd_printf_verbose("Direct3D: Create vector target - %dx%d\n", target_width, target_height);
- if (!add_render_target(d3d, prim, nullptr, source_width, source_height, target_width, target_height))
+ if (!add_render_target(d3d, prim, source_width, source_height, source_screen, target_width, target_height))
{
return false;
}
@@ -1687,38 +1615,15 @@ bool shaders::create_vector_target(render_primitive *prim)
// shaders::add_render_target - register a render target
//============================================================
-bool shaders::add_render_target(renderer_d3d9* d3d, render_primitive *prim, texture_info* texture, int source_width, int source_height, int target_width, int target_height)
+bool shaders::add_render_target(renderer_d3d9* d3d, render_primitive *prim, int source_width, int source_height, int source_screen, int target_width, int target_height)
{
- uint32_t screen_index = 0;
- uint32_t page_index = 0;
- if (texture != nullptr)
- {
- uint32_t screen_index_data = (uint32_t)texture->get_texinfo().osddata;
- screen_index = screen_index_data >> 1;
- page_index = screen_index_data & 1;
-
- remove_render_target(find_render_target(texture));
- }
- else
- {
- remove_render_target(find_render_target(source_width, source_height, 0, 0));
- }
+ remove_render_target(find_render_target(source_width, source_height, source_screen));
auto target = std::make_unique<d3d_render_target>();
- if (!target->init(d3d, source_width, source_height, target_width, target_height, screen_index, page_index))
+ if (!target->init(d3d, source_width, source_height, target_width, target_height, source_screen))
return false;
- // cached target only for screen texture and vector buffer
- if (PRIMFLAG_GET_SCREENTEX(prim->flags) || PRIMFLAG_GET_VECTORBUF(prim->flags))
- {
- if (!find_cache_target(target->screen_index, source_width, source_height))
- {
- if (!add_cache_target(d3d, texture, source_width, source_height, target_width, target_height, target->screen_index))
- return false;
- }
- }
-
m_render_target_list.push_back(std::move(target));
return true;
@@ -1736,10 +1641,10 @@ void shaders::enumerate_screens()
//============================================================
-// shaders::register_texture(texture::info)
+// shaders::create_texture_target
//============================================================
-bool shaders::register_texture(render_primitive *prim, texture_info *texture)
+bool shaders::create_texture_target(render_primitive *prim, int width, int height, int screen)
{
if (!enabled())
{
@@ -1748,8 +1653,9 @@ bool shaders::register_texture(render_primitive *prim, texture_info *texture)
auto win = d3d->assert_window();
- int source_width = texture->get_width();
- int source_height = texture->get_height();
+ int source_width = width;
+ int source_height = height;
+ int source_screen = screen;
int target_width = int(prim->get_full_quad_width() + 0.5f);
int target_height = int(prim->get_full_quad_height() + 0.5f);
target_width *= oversampling_enable ? 2 : 1;
@@ -1760,8 +1666,8 @@ bool shaders::register_texture(render_primitive *prim, texture_info *texture)
std::swap(target_width, target_height);
}
- osd_printf_verbose("Direct3D: Register texture - %dx%d\n", target_width, target_height);
- if (!add_render_target(d3d, prim, texture, source_width, source_height, target_width, target_height))
+ osd_printf_verbose("Direct3D: Create texture target - %dx%d\n", target_width, target_height);
+ if (!add_render_target(d3d, prim, source_width, source_height, source_screen, target_width, target_height))
{
return false;
}
@@ -1790,8 +1696,6 @@ void shaders::delete_resources()
last_options = *options;
}
- m_cache_target_list.clear();
-
m_render_target_list.clear();
if (downsample_effect != nullptr)