diff options
Diffstat (limited to 'src/osd/modules/render/drawd3d.c')
-rw-r--r-- | src/osd/modules/render/drawd3d.c | 162 |
1 files changed, 56 insertions, 106 deletions
diff --git a/src/osd/modules/render/drawd3d.c b/src/osd/modules/render/drawd3d.c index 8057581d61f..bcd823be909 100644 --- a/src/osd/modules/render/drawd3d.c +++ b/src/osd/modules/render/drawd3d.c @@ -44,7 +44,6 @@ #include "drawd3d.h" - //============================================================ // DEBUGGING //============================================================ @@ -52,7 +51,6 @@ extern void mtlog_add(const char *event); - //============================================================ // CONSTANTS //============================================================ @@ -67,7 +65,6 @@ enum }; - //============================================================ // MACROS //============================================================ @@ -75,7 +72,6 @@ enum #define FSWAP(var1, var2) do { float temp = var1; var1 = var2; var2 = temp; } while (0) - //============================================================ // GLOBALS //============================================================ @@ -95,6 +91,7 @@ static const line_aa_step line_aa_4step[] = { 0 } }; + //============================================================ // INLINES //============================================================ @@ -167,12 +164,14 @@ INLINE UINT32 ycc_to_rgb(UINT8 y, UINT8 cb, UINT8 cr) return rgb_t(0xff, r, g, b); } + //============================================================ // drawd3d_init //============================================================ static d3d::base * d3dintf; // FIX ME + //============================================================ // PROTOTYPES //============================================================ @@ -180,6 +179,7 @@ static d3d::base * d3dintf; // FIX ME // core functions static void drawd3d_exit(void); + //============================================================ // drawd3d_window_init //============================================================ @@ -196,6 +196,7 @@ int d3d::renderer::create() return 0; } + //============================================================ // drawd3d_exit //============================================================ @@ -222,7 +223,6 @@ void d3d::renderer::save() } - //============================================================ // drawd3d_window_destroy //============================================================ @@ -235,7 +235,6 @@ void d3d::renderer::destroy() } - //============================================================ // drawd3d_window_get_primitives //============================================================ @@ -253,6 +252,7 @@ render_primitive_list *d3d::renderer::get_primitives() return &window().target()->get_primitives(); } + //============================================================ // drawnone_create //============================================================ @@ -283,6 +283,7 @@ int drawd3d_init(running_machine &machine, osd_draw_callbacks *callbacks) return 0; } + //============================================================ // drawd3d_window_draw //============================================================ @@ -314,7 +315,6 @@ void renderer::set_texture(texture_info *texture) } } - void renderer::set_filter(int filter) { if (filter != m_last_filter) @@ -331,7 +331,6 @@ void renderer::set_filter(int filter) } } - void renderer::set_wrap(D3DTEXTUREADDRESS wrap) { if (wrap != m_last_wrap) @@ -348,7 +347,6 @@ void renderer::set_wrap(D3DTEXTUREADDRESS wrap) } } - void renderer::set_modmode(DWORD modmode) { if (modmode != m_last_modmode) @@ -361,7 +359,6 @@ void renderer::set_modmode(DWORD modmode) } } - void renderer::set_blendmode(int blendmode) { int blendenable; @@ -409,7 +406,6 @@ void renderer::set_blendmode(int blendmode) } } - void renderer::reset_render_states() { // this ensures subsequent calls to the above setters will force-update the data @@ -422,8 +418,6 @@ void renderer::reset_render_states() m_last_wrap = (D3DTEXTUREADDRESS)-1; } - - texture_manager::texture_manager(renderer *d3d) { m_renderer = d3d; @@ -737,7 +731,7 @@ void renderer::begin_frame() m_texture_manager->update_textures(); // begin the scene -mtlog_add("drawd3d_window_draw: begin_scene"); + mtlog_add("drawd3d_window_draw: begin_scene"); result = (*d3dintf->device.begin_scene)(m_device); if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device begin_scene call\n", (int)result); @@ -934,7 +928,6 @@ try_again: } - //============================================================ // device_create_resources //============================================================ @@ -1000,7 +993,6 @@ int renderer::device_create_resources() } - //============================================================ // device_delete //============================================================ @@ -1039,6 +1031,7 @@ void renderer::device_delete() m_device = NULL; } + //============================================================ // device_delete_resources //============================================================ @@ -1054,7 +1047,6 @@ void renderer::device_delete_resources() } - //============================================================ // device_verify_caps //============================================================ @@ -1125,7 +1117,6 @@ int renderer::device_verify_caps() } - //============================================================ // device_test_cooperative //============================================================ @@ -1174,7 +1165,6 @@ int renderer::device_test_cooperative() } - //============================================================ // config_adapter_mode //============================================================ @@ -1250,7 +1240,6 @@ int renderer::config_adapter_mode() } - //============================================================ // get_adapter_for_monitor //============================================================ @@ -1277,7 +1266,6 @@ int renderer::get_adapter_for_monitor() } - //============================================================ // pick_best_mode //============================================================ @@ -1366,7 +1354,6 @@ void renderer::pick_best_mode() } - //============================================================ // update_window_size //============================================================ @@ -1401,6 +1388,7 @@ int renderer::update_window_size() return TRUE; } + //============================================================ // batch_vectors //============================================================ @@ -1554,6 +1542,7 @@ void renderer::batch_vector(const render_primitive *prim, float line_time) } } + //============================================================ // draw_line //============================================================ @@ -1638,7 +1627,6 @@ void renderer::draw_line(const render_primitive *prim) } - //============================================================ // draw_quad //============================================================ @@ -1752,6 +1740,7 @@ void poly_info::init(D3DPRIMITIVETYPE type, UINT32 count, UINT32 numverts, m_prim_height = prim_height; } + //============================================================ // primitive_alloc //============================================================ @@ -1791,7 +1780,6 @@ vertex *renderer::mesh_alloc(int numverts) } - //============================================================ // primitive_flush_pending //============================================================ @@ -1877,6 +1865,7 @@ void renderer::primitive_flush_pending() m_numpolys = 0; } + //============================================================ // texture_info destructor //============================================================ @@ -1904,6 +1893,7 @@ texture_info::~texture_info() } } + //============================================================ // texture_info constructor //============================================================ @@ -2080,18 +2070,17 @@ error: } - //============================================================ // texture_info::compute_size_subroutine //============================================================ -void texture_info::compute_size_subroutine(int texwidth, int texheight, int* p_width, int* p_height) +void texture_info::compute_size_subroutine(texture_manager* texture_manager, int texwidth, int texheight, int* p_width, int* p_height) { int finalheight = texheight; int finalwidth = texwidth; // round width/height up to nearest power of 2 if we need to - if (!(m_texture_manager->get_texture_caps() & D3DPTEXTURECAPS_NONPOW2CONDITIONAL)) + if (!(texture_manager->get_texture_caps() & D3DPTEXTURECAPS_NONPOW2CONDITIONAL)) { // first the width if (finalwidth & (finalwidth - 1)) @@ -2115,7 +2104,7 @@ void texture_info::compute_size_subroutine(int texwidth, int texheight, int* p_w } // round up to square if we need to - if (m_texture_manager->get_texture_caps() & D3DPTEXTURECAPS_SQUAREONLY) + if (texture_manager->get_texture_caps() & D3DPTEXTURECAPS_SQUAREONLY) { if (finalwidth < finalheight) finalwidth = finalheight; @@ -2124,11 +2113,11 @@ void texture_info::compute_size_subroutine(int texwidth, int texheight, int* p_w } // adjust the aspect ratio if we need to - while (finalwidth < finalheight && finalheight / finalwidth > m_texture_manager->get_max_texture_aspect()) + while (finalwidth < finalheight && finalheight / finalwidth > texture_manager->get_max_texture_aspect()) { finalwidth *= 2; } - while (finalheight < finalwidth && finalwidth / finalheight > m_texture_manager->get_max_texture_aspect()) + while (finalheight < finalwidth && finalwidth / finalheight > texture_manager->get_max_texture_aspect()) { finalheight *= 2; } @@ -2137,6 +2126,7 @@ void texture_info::compute_size_subroutine(int texwidth, int texheight, int* p_w *p_height = finalheight; } + //============================================================ // texture_info::compute_size //============================================================ @@ -2161,7 +2151,7 @@ void texture_info::compute_size(int texwidth, int texheight) finalwidth += 2 * m_xborderpix; finalheight += 2 * m_yborderpix; - compute_size_subroutine(finalwidth, finalheight, &finalwidth, &finalheight); + texture_info::compute_size_subroutine(m_texture_manager, finalwidth, finalheight, &finalwidth, &finalheight); // if we added pixels for the border, and that just barely pushed us over, take it back if (finalwidth > m_texture_manager->get_max_texture_width() || finalheight > m_texture_manager->get_max_texture_height()) @@ -2172,7 +2162,7 @@ void texture_info::compute_size(int texwidth, int texheight) m_xborderpix = 0; m_yborderpix = 0; - compute_size_subroutine(finalwidth, finalheight, &finalwidth, &finalheight); + texture_info::compute_size_subroutine(m_texture_manager, finalwidth, finalheight, &finalwidth, &finalheight); } // if we're above the max width/height, do what? @@ -2195,7 +2185,6 @@ void texture_info::compute_size(int texwidth, int texheight) } - //============================================================ // copyline_palette16 //============================================================ @@ -2214,7 +2203,6 @@ INLINE void copyline_palette16(UINT32 *dst, const UINT16 *src, int width, const } - //============================================================ // copyline_palettea16 //============================================================ @@ -2233,7 +2221,6 @@ INLINE void copyline_palettea16(UINT32 *dst, const UINT16 *src, int width, const } - //============================================================ // copyline_rgb32 //============================================================ @@ -2277,7 +2264,6 @@ INLINE void copyline_rgb32(UINT32 *dst, const UINT32 *src, int width, const rgb_ } - //============================================================ // copyline_argb32 //============================================================ @@ -2321,7 +2307,6 @@ INLINE void copyline_argb32(UINT32 *dst, const UINT32 *src, int width, const rgb } - //============================================================ // copyline_yuy16_to_yuy2 //============================================================ @@ -2387,7 +2372,6 @@ INLINE void copyline_yuy16_to_yuy2(UINT16 *dst, const UINT16 *src, int width, co } - //============================================================ // copyline_yuy16_to_uyvy //============================================================ @@ -2451,7 +2435,6 @@ INLINE void copyline_yuy16_to_uyvy(UINT16 *dst, const UINT16 *src, int width, co } - //============================================================ // copyline_yuy16_to_argb //============================================================ @@ -2529,7 +2512,6 @@ INLINE void copyline_yuy16_to_argb(UINT32 *dst, const UINT16 *src, int width, co } - //============================================================ // texture_set_data //============================================================ @@ -2612,7 +2594,6 @@ void texture_info::set_data(const render_texinfo *texsource, UINT32 flags) } - //============================================================ // texture_info::prescale //============================================================ @@ -2804,6 +2785,7 @@ bool cache_target::init(renderer *d3d, base *d3dintf, int width, int height, int return true; } + //============================================================ // render_target::~render_target //============================================================ @@ -2822,42 +2804,30 @@ render_target::~render_target() (*d3dintf->surface.release)(bloom_target[index]); bloom_target[index] = NULL; } - } - - for (int index = 0; index < 5; index++) + } + + for (int index = 0; index < 2; index++) { - if (render_texture[index] != NULL) + if (native_texture[index] != NULL) { - (*d3dintf->texture.release)(render_texture[index]); - render_texture[index] = NULL; + (*d3dintf->texture.release)(native_texture[index]); + native_texture[index] = NULL; } - if (target[index] != NULL) + if (native_target[index] != NULL) { - (*d3dintf->surface.release)(target[index]); - target[index] = NULL; + (*d3dintf->surface.release)(native_target[index]); + native_target[index] = NULL; + } + if (prescale_texture[index] != NULL) + { + (*d3dintf->texture.release)(prescale_texture[index]); + prescale_texture[index] = NULL; + } + if (prescale_target[index] != NULL) + { + (*d3dintf->surface.release)(prescale_target[index]); + prescale_target[index] = NULL; } - } - - if (prescaletexture != NULL) - { - (*d3dintf->texture.release)(prescaletexture); - prescaletexture = NULL; - } - if (prescaletarget != NULL) - { - (*d3dintf->surface.release)(prescaletarget); - prescaletarget = NULL; - } - - if (smalltexture != NULL) - { - (*d3dintf->texture.release)(smalltexture); - smalltexture = NULL; - } - if (smalltarget != NULL) - { - (*d3dintf->surface.release)(smalltarget); - smalltarget = NULL; } } @@ -2869,41 +2839,21 @@ render_target::~render_target() bool render_target::init(renderer *d3d, base *d3dintf, int width, int height, int prescale_x, int prescale_y) { D3DFORMAT format = D3DFMT_A8R8G8B8; + + HRESULT result; + + for (int index = 0; index < 2; index++) + { + result = (*d3dintf->device.create_texture)(d3d->get_device(), width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &native_texture[index]); + if (result != D3D_OK) + return false; + (*d3dintf->texture.get_surface_level)(native_texture[index], 0, &native_target[index]); - HRESULT result = (*d3dintf->device.create_texture)(d3d->get_device(), width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &render_texture[0]); - if (result != D3D_OK) - return false; - (*d3dintf->texture.get_surface_level)(render_texture[0], 0, &target[0]); - - result = (*d3dintf->device.create_texture)(d3d->get_device(), width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &render_texture[1]); - if (result != D3D_OK) - return false; - (*d3dintf->texture.get_surface_level)(render_texture[1], 0, &target[1]); - - result = (*d3dintf->device.create_texture)(d3d->get_device(), width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &render_texture[2]); - if (result != D3D_OK) - return false; - (*d3dintf->texture.get_surface_level)(render_texture[2], 0, &target[2]); - - result = (*d3dintf->device.create_texture)(d3d->get_device(), width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &render_texture[3]); - if (result != D3D_OK) - return false; - (*d3dintf->texture.get_surface_level)(render_texture[3], 0, &target[3]); - - result = (*d3dintf->device.create_texture)(d3d->get_device(), width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &render_texture[4]); - if (result != D3D_OK) - return false; - (*d3dintf->texture.get_surface_level)(render_texture[4], 0, &target[4]); - - result = (*d3dintf->device.create_texture)(d3d->get_device(), width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &smalltexture); - if (result != D3D_OK) - return false; - (*d3dintf->texture.get_surface_level)(smalltexture, 0, &smalltarget); - - result = (*d3dintf->device.create_texture)(d3d->get_device(), width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &prescaletexture); - if (result != D3D_OK) - return false; - (*d3dintf->texture.get_surface_level)(prescaletexture, 0, &prescaletarget); + result = (*d3dintf->device.create_texture)(d3d->get_device(), width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &prescale_texture[index]); + if (result != D3D_OK) + return false; + (*d3dintf->texture.get_surface_level)(prescale_texture[index], 0, &prescale_target[index]); + } float bloom_size = (d3d->get_width() < d3d->get_height()) ? d3d->get_width() : d3d->get_height(); int bloom_index = 0; |