summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/drawd3d.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/render/drawd3d.c')
-rw-r--r--src/osd/modules/render/drawd3d.c162
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;