summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/osd/windows/d3d9intf.c123
-rw-r--r--src/osd/windows/d3dhlsl.c72
-rw-r--r--src/osd/windows/d3dintf.h45
-rw-r--r--src/osd/windows/drawd3d.h1
-rw-r--r--src/osd/windows/window.c1
-rw-r--r--src/osd/windows/winmain.c1
-rw-r--r--src/osd/windows/winmain.h2
7 files changed, 208 insertions, 37 deletions
diff --git a/src/osd/windows/d3d9intf.c b/src/osd/windows/d3d9intf.c
index 2e1bc29b873..828776f44e1 100644
--- a/src/osd/windows/d3d9intf.c
+++ b/src/osd/windows/d3d9intf.c
@@ -685,6 +685,124 @@ static const vertex_buffer_interface d3d9_vertex_buffer_interface =
// Direct3DEffect interfaces
//============================================================
+uniform::uniform(effect *shader, const char *name, uniform_type type)
+{
+ m_shader = shader;
+ m_type = type;
+ m_next = NULL;
+ m_prev = NULL;
+ m_handle = m_shader->get_parameter(NULL, name);
+ m_ival = 0;
+ memset(m_vec, 0, sizeof(float) * 4);
+ m_mval = NULL;
+ m_texture = NULL;
+
+ switch (type)
+ {
+ case UT_INT:
+ case UT_FLOAT:
+ case UT_MATRIX:
+ case UT_SAMPLER:
+ m_count = 1;
+ break;
+ case UT_VEC2:
+ m_count = 2;
+ break;
+ case UT_VEC3:
+ m_count = 3;
+ break;
+ case UT_VEC4:
+ m_count = 4;
+ break;
+ default:
+ m_count = 1;
+ break;
+ }
+}
+
+void uniform::set_next(uniform *next)
+{
+ m_next->set_prev(next);
+ next->set_next(m_next);
+
+ next->set_prev(this);
+ m_next = next;
+}
+
+void uniform::set_prev(uniform *prev)
+{
+ m_prev->set_next(prev);
+ prev->set_prev(m_prev);
+
+ prev->set_next(this);
+ m_prev = prev;
+}
+
+void uniform::set(float x, float y, float z, float w)
+{
+ m_vec[0] = x;
+ m_vec[1] = y;
+ m_vec[2] = z;
+ m_vec[3] = w;
+}
+
+void uniform::set(float x, float y, float z)
+{
+ m_vec[0] = x;
+ m_vec[1] = y;
+ m_vec[2] = z;
+}
+
+void uniform::set(float x, float y)
+{
+ m_vec[0] = x;
+ m_vec[1] = y;
+}
+
+void uniform::set(float x)
+{
+ m_vec[0] = x;
+}
+
+void uniform::set(int x)
+{
+ m_ival = x;
+}
+
+void uniform::set(matrix *mat)
+{
+ m_mval = mat;
+}
+
+void uniform::set(texture *tex)
+{
+ m_texture = tex;
+}
+
+void uniform::upload()
+{
+ switch(m_type)
+ {
+ case UT_INT:
+ m_shader->set_int(m_handle, m_ival);
+ break;
+ case UT_FLOAT:
+ m_shader->set_float(m_handle, m_vec[0]);
+ break;
+ case UT_VEC2:
+ case UT_VEC3:
+ case UT_VEC4:
+ m_shader->set_vector(m_handle, m_count, m_vec);
+ break;
+ case UT_MATRIX:
+ m_shader->set_matrix(m_handle, m_mval);
+ break;
+ case UT_SAMPLER:
+ m_shader->set_texture(m_handle, m_texture);
+ break;
+ }
+}
+
effect::effect(device *dev, const char *name, const char *path)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
@@ -783,6 +901,11 @@ void effect::set_texture(D3DXHANDLE param, texture *tex)
m_effect->SetTexture(param, (IDirect3DTexture9*)tex);
}
+D3DXHANDLE effect::get_parameter(D3DXHANDLE param, const char *name)
+{
+ return m_effect->GetParameterByName(param, name);
+}
+
ULONG effect::release()
{
return m_effect->Release();
diff --git a/src/osd/windows/d3dhlsl.c b/src/osd/windows/d3dhlsl.c
index 93f5a002dfb..dd8237b729a 100644
--- a/src/osd/windows/d3dhlsl.c
+++ b/src/osd/windows/d3dhlsl.c
@@ -1055,8 +1055,8 @@ void shaders::blit(surface *dst, texture *src, surface *new_dst, D3DPRIMITIVETYP
curr_effect->set_texture("Diffuse", src);
- curr_effect->set_float("TargetWidth", (float)dstw);
- curr_effect->set_float("TargetHeight", (float)dsth);
+ float dst_dims[2] = { (float)dstw, (float)dsth };
+ curr_effect->set_vector("ScreenDims", 2, dst_dims);
curr_effect->set_float("PostPass", 1.0f);
curr_effect->set_float("PincushionAmount", options->pincushion);
curr_effect->set_float("Brighten", 0.0f);
@@ -1102,8 +1102,8 @@ void shaders::blit(surface *dst, texture *src, surface *new_dst, D3DPRIMITIVETYP
curr_effect->set_texture("Diffuse", src);
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
curr_effect->set_float("ScreenWidth", (float)d3d->get_width());
curr_effect->set_float("ScreenHeight", (float)d3d->get_height());
curr_effect->set_float("PostPass", 1.0f);
@@ -1211,8 +1211,8 @@ void shaders::init_effect_info(poly_info *poly)
vec2f delta = texture->get_uvstop() - texture->get_uvstart();
curr_effect->set_vector("RawDims", 2, &texture->get_rawdims().c.x);
curr_effect->set_vector("SizeRatio", 2, &delta.c.x);
- curr_effect->set_float("TargetWidth", d3d->get_width());
- curr_effect->set_float("TargetHeight", d3d->get_height());
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
curr_effect->set_vector("Floor", 3, options->floor);
curr_effect->set_float("SnapX", snap_width);
curr_effect->set_float("SnapY", snap_height);
@@ -1316,6 +1316,7 @@ void shaders::ntsc_pass(render_target *rt, texture_info *texture, vec2f &texsize
curr_effect->set_float("HeightRatio", 1.0f / delta.c.y);
curr_effect->set_float("ScreenWidth", d3d->get_width());
curr_effect->set_float("ScreenHeight", d3d->get_height());
+
curr_effect->set_float("CCValue", options->yiq_cc);
curr_effect->set_float("AValue", options->yiq_a);
curr_effect->set_float("BValue", options->yiq_b);
@@ -1358,6 +1359,7 @@ void shaders::ntsc_pass(render_target *rt, texture_info *texture, vec2f &texsize
curr_effect->set_float("HeightRatio", 1.0f / delta.c.y);
curr_effect->set_float("ScreenWidth", d3d->get_width());
curr_effect->set_float("ScreenHeight", d3d->get_height());
+
curr_effect->set_float("CCValue", options->yiq_cc);
curr_effect->set_float("AValue", options->yiq_a);
curr_effect->set_float("BValue", options->yiq_b);
@@ -1406,8 +1408,9 @@ void shaders::color_convolution_pass(render_target *rt, texture_info *texture, v
if(options->params_dirty)
{
curr_effect->set_vector("RawDims", 2, &rawdims.c.x);
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
+
curr_effect->set_float("YIQEnable", options->yiq_enable ? 1.0f : 0.0f);
curr_effect->set_vector("RedRatios", 3, options->red_ratio);
curr_effect->set_vector("GrnRatios", 3, options->grn_ratio);
@@ -1447,8 +1450,8 @@ void shaders::prescale_pass(render_target *rt, texture_info *texture, vec2f &tex
if(options->params_dirty)
{
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
curr_effect->set_vector("RawDims", 2, &rawdims.c.x);
}
@@ -1481,8 +1484,8 @@ void shaders::deconverge_pass(render_target *rt, texture_info *texture, vec2f &t
if(options->params_dirty)
{
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
curr_effect->set_vector("RawDims", 2, &rawdims.c.x);
curr_effect->set_vector("SizeRatio", 2, &delta.c.x);
curr_effect->set_vector("ConvergeX", 3, options->converge_x);
@@ -1520,8 +1523,8 @@ void shaders::defocus_pass(render_target *rt, texture_info *texture, vec2f &texs
curr_effect->set_texture("Diffuse", rt->render_texture[2]);
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
curr_effect->set_vector("Defocus", 2, &options->defocus[0]);
curr_effect->begin(&num_passes, 0);
@@ -1546,8 +1549,7 @@ void shaders::defocus_pass(render_target *rt, texture_info *texture, vec2f &texs
curr_effect->set_texture("Diffuse", rt->render_texture[0]);
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
curr_effect->set_vector("Defocus", 2, &options->defocus[1]);
curr_effect->begin(&num_passes, 0);
@@ -1576,8 +1578,8 @@ void shaders::phosphor_pass(render_target *rt, cache_target *ct, texture_info *t
if(options->params_dirty)
{
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
curr_effect->set_vector("Phosphor", 3, options->phosphor);
}
curr_effect->set_float("TextureWidth", (float)rt->target_width);
@@ -1637,8 +1639,9 @@ void shaders::avi_post_pass(render_target *rt, texture_info *texture, vec2f &tex
UINT num_passes = 0;
curr_effect = post_effect;
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
+
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
// Scanlines and shadow mask, at high res for AVI logging
if(avi_output_file != NULL)
@@ -1696,19 +1699,15 @@ void shaders::screen_post_pass(render_target *rt, texture_info *texture, vec2f &
curr_effect->set_texture("Diffuse", rt->render_texture[0]);
curr_effect->set_vector("RawDims", 2, &rawdims.c.x);
curr_effect->set_vector("SizeRatio", 2, &delta.c.x);
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
d3d->set_wrap(D3DTADDRESS_MIRROR);
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
-
HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[2]);
- d3d->set_wrap(D3DTADDRESS_MIRROR);
result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(1,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
curr_effect->begin(&num_passes, 0);
@@ -1743,8 +1742,8 @@ void shaders::raster_bloom_pass(render_target *rt, texture_info *texture, vec2f
float prim_width = poly->get_prim_width();
float prim_height = poly->get_prim_height();
float prim_ratio[2] = { prim_width / bloom_width, prim_height / bloom_height };
- float screen_size[2] = { d3d->get_width(), d3d->get_height() };
- curr_effect->set_vector("ScreenSize", 2, screen_size);
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenSize", 2, &screendims.c.x);
for(; bloom_size >= 2.0f && bloom_index < 11; bloom_size *= 0.5f)
{
float target_size[2] = { bloom_width, bloom_height };
@@ -1779,8 +1778,7 @@ void shaders::raster_bloom_pass(render_target *rt, texture_info *texture, vec2f
curr_effect = bloom_effect;
- float target_size[2] = { d3d->get_width(), d3d->get_height() };
- curr_effect->set_vector("TargetSize", 2, target_size);
+ curr_effect->set_vector("TargetSize", 2, &screendims.c.x);
float weight0123[4] = { options->bloom_level0_weight, options->bloom_level1_weight,
options->bloom_level2_weight, options->bloom_level3_weight };
float weight4567[4] = { options->bloom_level4_weight, options->bloom_level5_weight,
@@ -1790,7 +1788,7 @@ void shaders::raster_bloom_pass(render_target *rt, texture_info *texture, vec2f
curr_effect->set_vector("Level0123Weight", 4, weight0123);
curr_effect->set_vector("Level4567Weight", 4, weight4567);
curr_effect->set_vector("Level89AWeight", 3, weight89A);
- curr_effect->set_vector("TargetSize", 2, target_size);
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
curr_effect->set_texture("DiffuseA", rt->render_texture[2]);
curr_effect->set_float("DiffuseScaleA", 1.0f);
@@ -1891,8 +1889,8 @@ void shaders::render_quad(poly_info *poly, int vertnum)
if(options->params_dirty)
{
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
}
float time_params[2] = { 0.0f, 0.0f };
@@ -2043,8 +2041,8 @@ void shaders::render_quad(poly_info *poly, int vertnum)
if(options->params_dirty)
{
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
curr_effect->set_vector("Phosphor", 3, options->phosphor);
}
curr_effect->set_float("TextureWidth", (float)d3d->get_width());
@@ -2088,8 +2086,8 @@ void shaders::render_quad(poly_info *poly, int vertnum)
{
curr_effect = default_effect;
- curr_effect->set_float("TargetWidth", (float)d3d->get_width());
- curr_effect->set_float("TargetHeight", (float)d3d->get_height());
+ vec2f screendims = d3d->get_dims();
+ curr_effect->set_vector("ScreenDims", 2, &screendims.c.x);
curr_effect->set_float("PostPass", 0.0f);
curr_effect->begin(&num_passes, 0);
diff --git a/src/osd/windows/d3dintf.h b/src/osd/windows/d3dintf.h
index 201d0d26d5e..a5fd1bd0314 100644
--- a/src/osd/windows/d3dintf.h
+++ b/src/osd/windows/d3dintf.h
@@ -77,9 +77,54 @@ struct device;
struct surface;
struct texture;
struct vertex_buffer;
+class effect;
typedef D3DXVECTOR4 vector;
typedef D3DMATRIX matrix;
+class uniform
+{
+public:
+ typedef enum
+ {
+ UT_VEC4,
+ UT_VEC3,
+ UT_VEC2,
+ UT_FLOAT,
+ UT_INT,
+ UT_MATRIX,
+ UT_SAMPLER,
+ } uniform_type;
+
+ uniform(effect *shader, const char *name, uniform_type type);
+
+ void set_next(uniform *next);
+ void set_prev(uniform *prev);
+
+ void set(float x, float y, float z, float w);
+ void set(float x, float y, float z);
+ void set(float x, float y);
+ void set(float x);
+ void set(int x);
+ void set(matrix *mat);
+ void set(texture *tex);
+
+ void upload();
+
+protected:
+ uniform *m_next;
+ uniform *m_prev;
+
+ float m_vec[4];
+ int m_ival;
+ matrix *m_mval;
+ texture *m_texture;
+ int m_count;
+ uniform_type m_type;
+
+ effect *m_shader;
+ D3DXHANDLE m_handle;
+};
+
class effect
{
public:
diff --git a/src/osd/windows/drawd3d.h b/src/osd/windows/drawd3d.h
index 6ab48555f21..f22838a030b 100644
--- a/src/osd/windows/drawd3d.h
+++ b/src/osd/windows/drawd3d.h
@@ -177,6 +177,7 @@ public:
// Setters / getters
int get_adapter() { return m_adapter; }
int get_width() { return m_width; }
+ vec2f get_dims() { return vec2f(m_width, m_height); }
int get_height() { return m_height; }
int get_refresh() { return m_refresh; }
diff --git a/src/osd/windows/window.c b/src/osd/windows/window.c
index 60828a1cfc7..44c0ade7d95 100644
--- a/src/osd/windows/window.c
+++ b/src/osd/windows/window.c
@@ -677,6 +677,7 @@ void winwindow_video_window_create(running_machine &machine, int index, win_moni
// allocate a new window object
window = global_alloc_clear(win_window_info(machine));
+ printf("%d, %d\n", config->width, config->height);
window->maxwidth = config->width;
window->maxheight = config->height;
window->refresh = config->refresh;
diff --git a/src/osd/windows/winmain.c b/src/osd/windows/winmain.c
index bf0df5348f0..c5b077f06a8 100644
--- a/src/osd/windows/winmain.c
+++ b/src/osd/windows/winmain.c
@@ -318,6 +318,7 @@ const options_entry windows_options::s_option_entries[] =
{ WINOPTION_WINDOW ";w", "0", OPTION_BOOLEAN, "enable window mode; otherwise, full screen mode is assumed" },
{ WINOPTION_MAXIMIZE ";max", "1", OPTION_BOOLEAN, "default to maximized windows; otherwise, windows will be minimized" },
{ WINOPTION_KEEPASPECT ";ka", "1", OPTION_BOOLEAN, "constrain to the proper aspect ratio" },
+ { WINOPTION_UNEVENSTRETCH ";ues", "1", OPTION_BOOLEAN, "allow non-integer stretch factors" },
{ WINOPTION_PRESCALE, "1", OPTION_INTEGER, "scale screen rendering by this amount in software" },
{ WINOPTION_WAITVSYNC ";vs", "0", OPTION_BOOLEAN, "enable waiting for the start of VBLANK before flipping screens; reduces tearing effects" },
{ WINOPTION_SYNCREFRESH ";srf", "0", OPTION_BOOLEAN, "enable using the start of VBLANK for throttling instead of the game time" },
diff --git a/src/osd/windows/winmain.h b/src/osd/windows/winmain.h
index da482d74cc6..e84adc5425b 100644
--- a/src/osd/windows/winmain.h
+++ b/src/osd/windows/winmain.h
@@ -66,6 +66,7 @@
#define WINOPTION_WINDOW "window"
#define WINOPTION_MAXIMIZE "maximize"
#define WINOPTION_KEEPASPECT "keepaspect"
+#define WINOPTION_UNEVENSTRETCH "unevenstretch"
#define WINOPTION_PRESCALE "prescale"
#define WINOPTION_WAITVSYNC "waitvsync"
#define WINOPTION_SYNCREFRESH "syncrefresh"
@@ -193,6 +194,7 @@ public:
bool window() const { return bool_value(WINOPTION_WINDOW); }
bool maximize() const { return bool_value(WINOPTION_MAXIMIZE); }
bool keep_aspect() const { return bool_value(WINOPTION_KEEPASPECT); }
+ bool uneven_stretch() const { return bool_value(WINOPTION_UNEVENSTRETCH); }
int prescale() const { return int_value(WINOPTION_PRESCALE); }
bool wait_vsync() const { return bool_value(WINOPTION_WAITVSYNC); }
bool sync_refresh() const { return bool_value(WINOPTION_SYNCREFRESH); }