diff --git a/src/emu/render.h b/src/emu/render.h index e67f6fcfdca..0b591a9d3d6 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -249,6 +249,7 @@ struct render_texinfo const rgb_t * palette; // palette for PALETTE16 textures, LUTs for RGB15/RGB32 UINT32 seqid; // sequence ID UINT64 osddata; // aux data to pass to osd + void * osdhandle; // handle to OSD-side representation; }; diff --git a/src/osd/windows/d3dcomm.h b/src/osd/windows/d3dcomm.h index 41318dc0822..3951124fe16 100644 --- a/src/osd/windows/d3dcomm.h +++ b/src/osd/windows/d3dcomm.h @@ -42,40 +42,68 @@ #ifndef __WIN_D3DCOMM__ #define __WIN_D3DCOMM__ +struct d3d_info; + //============================================================ // CONSTANTS //============================================================ +namespace d3d +{ +//============================================================ +// FORWARD DECLARATIONS +//============================================================ + +class texture_info; //============================================================ // TYPE DEFINITIONS //============================================================ -/* d3d_texture_info holds information about a texture */ -struct d3d_texture_info +/* d3d::texture_info holds information about a texture */ +class texture_info { - d3d_texture_info * next; // next texture in the list - d3d_texture_info * prev; // prev texture in the list - UINT32 hash; // hash value for the texture - UINT32 flags; // rendering flags - render_texinfo texinfo; // copy of the texture info - float ustart, ustop; // beginning/ending U coordinates - float vstart, vstop; // beginning/ending V coordinates - int rawwidth, rawheight; // raw width/height of the texture - int type; // what type of texture are we? - int xborderpix; // number of border pixels in X - int yborderpix; // number of border pixels in Y - int xprescale; // what is our X prescale factor? - int yprescale; // what is our Y prescale factor? - int cur_frame; // what is our current frame? - int prev_frame; // what was our last frame? (used to determine pause state) - d3d_texture * d3dtex; // Direct3D texture pointer - d3d_surface * d3dsurface; // Direct3D offscreen plain surface pointer - d3d_texture * d3dfinaltex; // Direct3D final (post-scaled) texture - int target_index; // Direct3D target index +public: + texture_info(d3d_info *d3d, render_texinfo *texsource, UINT32 flags); + ~texture_info(); + + render_texinfo * get_texinfo() { return m_texinfo; } + + int get_width() { return m_rawwidth; } + int get_height() { return m_rawheight; } + int get_xscale() { return m_xprescale; } + int get_yscale() { return m_yprescale; } + + void set_data(const render_texinfo *texsource, UINT32 flags); + +public: + void prescale(); + void compute_size(int texwidth, int texheight); + + d3d_info * m_d3d; // d3d info pointer + texture_info * m_next; // next texture in the list + texture_info * m_prev; // prev texture in the list + + UINT32 m_hash; // hash value for the texture + UINT32 m_flags; // rendering flags + render_texinfo * m_texinfo; // copy of the texture info + float m_ustart, m_ustop; // beginning/ending U coordinates + float m_vstart, m_vstop; // beginning/ending V coordinates + int m_rawwidth, m_rawheight; // raw width/height of the texture + int m_type; // what type of texture are we? + int m_xborderpix, m_yborderpix; // number of border pixels on X/Y + int m_xprescale, m_yprescale; // X/Y prescale factor + int m_cur_frame; // what is our current frame? + int m_prev_frame; // what was our last frame? (used to determine pause state) + d3d_texture * m_d3dtex; // Direct3D texture pointer + d3d_surface * m_d3dsurface; // Direct3D offscreen plain surface pointer + d3d_texture * m_d3dfinaltex; // Direct3D final (post-scaled) texture + int m_target_index; // Direct3D target index }; +}; // d3d + /* d3d_poly_info holds information about a single polygon/d3d primitive */ struct d3d_poly_info @@ -85,7 +113,7 @@ struct d3d_poly_info UINT32 numverts; // total number of vertices UINT32 flags; // rendering flags DWORD modmode; // texture modulation mode - d3d_texture_info * texture; // pointer to texture info + d3d::texture_info * texture; // pointer to texture info float line_time; // used by vectors float line_length; // used by vectors }; @@ -108,5 +136,4 @@ struct line_aa_step float weight; // weight contribution }; - #endif diff --git a/src/osd/windows/d3dhlsl.c b/src/osd/windows/d3dhlsl.c index 733725faa0b..897880c1c7a 100644 --- a/src/osd/windows/d3dhlsl.c +++ b/src/osd/windows/d3dhlsl.c @@ -621,7 +621,7 @@ void hlsl_info::remove_cache_target(d3d_cache_target *cache) // remove_render_target - remove an active target //============================================================ -void hlsl_info::remove_render_target(d3d_texture_info *texture) +void hlsl_info::remove_render_target(d3d::texture_info *texture) { remove_render_target(find_render_target(texture)); } @@ -677,7 +677,7 @@ void hlsl_info::remove_render_target(d3d_render_target *rt) // hlsl_info::set_texture //============================================================ -void hlsl_info::set_texture(d3d_texture_info *texture) +void hlsl_info::set_texture(d3d::texture_info *texture) { if (!master_enable || !d3dintf->post_fx_available) return; @@ -686,7 +686,7 @@ void hlsl_info::set_texture(d3d_texture_info *texture) if(texture != NULL) { - if(texture->prev_frame == texture->cur_frame) + if(texture->m_prev_frame == texture->m_cur_frame) { paused = true; } @@ -695,15 +695,15 @@ void hlsl_info::set_texture(d3d_texture_info *texture) paused = false; } - texture->prev_frame = texture->cur_frame; + texture->m_prev_frame = texture->m_cur_frame; } - (*d3dintf->effect.set_texture)(effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex); + (*d3dintf->effect.set_texture)(effect, "Diffuse", (texture == NULL) ? d3d->default_texture->m_d3dfinaltex : texture->m_d3dfinaltex); if (options->yiq_enable) - (*d3dintf->effect.set_texture)(yiq_encode_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex); + (*d3dintf->effect.set_texture)(yiq_encode_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->m_d3dfinaltex : texture->m_d3dfinaltex); else - (*d3dintf->effect.set_texture)(color_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex); - (*d3dintf->effect.set_texture)(pincushion_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex); + (*d3dintf->effect.set_texture)(color_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->m_d3dfinaltex : texture->m_d3dfinaltex); + (*d3dintf->effect.set_texture)(pincushion_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->m_d3dfinaltex : texture->m_d3dfinaltex); } @@ -1115,7 +1115,7 @@ int hlsl_info::create_resources(bool reset) texture.seqid = 0; // now create it - shadow_texture = texture_create(d3d, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)); + shadow_texture = new d3d::texture_info(d3d, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)); } const char *fx_dir = downcast(window->machine().options()).screen_post_fx_dir(); @@ -1526,14 +1526,14 @@ void hlsl_info::init_effect_info(d3d_poly_info *poly) // just post-processing. curr_effect = post_effect; - (*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (poly->texture->cur_frame == 0) ? 0.0f : options->scanline_offset); + (*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (poly->texture->m_cur_frame == 0) ? 0.0f : options->scanline_offset); if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->m_rawwidth); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->m_rawheight); + (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->m_ustop - poly->texture->m_ustart)); + (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->m_vstop - poly->texture->m_vstart)); (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", d3d->height); (*d3dintf->effect.set_vector)(curr_effect, "Floor", 3, options->floor); @@ -1542,20 +1542,20 @@ void hlsl_info::init_effect_info(d3d_poly_info *poly) (*d3dintf->effect.set_float)(curr_effect, "PincushionAmount", options->pincushion); (*d3dintf->effect.set_float)(curr_effect, "CurvatureAmount", options->curvature); (*d3dintf->effect.set_float)(curr_effect, "UseShadow", shadow_texture == NULL ? 0.0f : 1.0f); - (*d3dintf->effect.set_texture)(curr_effect, "Shadow", shadow_texture == NULL ? NULL : shadow_texture->d3dfinaltex); + (*d3dintf->effect.set_texture)(curr_effect, "Shadow", shadow_texture == NULL ? NULL : shadow_texture->m_d3dfinaltex); (*d3dintf->effect.set_float)(curr_effect, "ShadowBrightness", options->shadow_mask_alpha); (*d3dintf->effect.set_float)(curr_effect, "ShadowMaskSizeX", (float)options->shadow_mask_count_x); (*d3dintf->effect.set_float)(curr_effect, "ShadowMaskSizeY", (float)options->shadow_mask_count_y); (*d3dintf->effect.set_float)(curr_effect, "ShadowU", options->shadow_mask_u_size); (*d3dintf->effect.set_float)(curr_effect, "ShadowV", options->shadow_mask_v_size); - (*d3dintf->effect.set_float)(curr_effect, "ShadowWidth", shadow_texture == NULL ? 1.0f : (float)shadow_texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "ShadowHeight", shadow_texture == NULL ? 1.0f : (float)shadow_texture->rawheight); + (*d3dintf->effect.set_float)(curr_effect, "ShadowWidth", shadow_texture == NULL ? 1.0f : (float)shadow_texture->m_rawwidth); + (*d3dintf->effect.set_float)(curr_effect, "ShadowHeight", shadow_texture == NULL ? 1.0f : (float)shadow_texture->m_rawheight); (*d3dintf->effect.set_float)(curr_effect, "ScanlineAmount", options->scanline_alpha); (*d3dintf->effect.set_float)(curr_effect, "ScanlineScale", options->scanline_scale); (*d3dintf->effect.set_float)(curr_effect, "ScanlineHeight", options->scanline_height); (*d3dintf->effect.set_float)(curr_effect, "ScanlineBrightScale", options->scanline_bright_scale); (*d3dintf->effect.set_float)(curr_effect, "ScanlineBrightOffset", options->scanline_bright_offset); - //(*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (poly->texture->cur_frame == 0) ? 0.0f : options->scanline_offset); + //(*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (poly->texture->m_cur_frame == 0) ? 0.0f : options->scanline_offset); (*d3dintf->effect.set_vector)(curr_effect, "Power", 3, options->power); } } @@ -1572,15 +1572,15 @@ void hlsl_info::init_effect_info(d3d_poly_info *poly) // hlsl_info::find_render_target //============================================================ -d3d_render_target* hlsl_info::find_render_target(d3d_texture_info *info) +d3d_render_target* hlsl_info::find_render_target(d3d::texture_info *info) { d3d_render_target *curr = targethead; - - UINT32 screen_index_data = (UINT32)info->texinfo.osddata; + render_texinfo *texinfo = info->get_texinfo(); + UINT32 screen_index_data = (UINT32)texinfo->osddata; UINT32 screen_index = screen_index_data >> 1; UINT32 page_index = screen_index_data & 1; - while (curr != NULL && (curr->screen_index != screen_index || curr->page_index != page_index || curr->width != info->texinfo.width || curr->height != info->texinfo.height)) + while (curr != NULL && (curr->screen_index != screen_index || curr->page_index != page_index || curr->width != texinfo->width || curr->height != texinfo->height)) { curr = curr->next; } @@ -1642,7 +1642,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { return; } - d3d_cache_target *ct = find_cache_target(rt->screen_index, poly->texture->texinfo.width, poly->texture->texinfo.height); + d3d_cache_target *ct = find_cache_target(rt->screen_index, poly->texture->get_texinfo()->width, poly->texture->get_texinfo()->height); if(options->yiq_enable) { @@ -1651,15 +1651,15 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->m_rawwidth); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->m_rawheight); + (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->m_ustop - poly->texture->m_ustart)); + (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->m_vstop - poly->texture->m_vstart)); (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); (*d3dintf->effect.set_float)(curr_effect, "CCValue", options->yiq_cc); (*d3dintf->effect.set_float)(curr_effect, "AValue", options->yiq_a); - (*d3dintf->effect.set_float)(curr_effect, "BValue", (poly->texture->cur_frame == 2) ? 0.0f : ((float)poly->texture->cur_frame * options->yiq_b)); + (*d3dintf->effect.set_float)(curr_effect, "BValue", (poly->texture->m_cur_frame == 2) ? 0.0f : ((float)poly->texture->m_cur_frame * options->yiq_b)); (*d3dintf->effect.set_float)(curr_effect, "PValue", options->yiq_p); (*d3dintf->effect.set_float)(curr_effect, "NotchHalfWidth", options->yiq_n); (*d3dintf->effect.set_float)(curr_effect, "YFreqResponse", options->yiq_y); @@ -1691,18 +1691,18 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) curr_effect = yiq_decode_effect; (*d3dintf->effect.set_texture)(curr_effect, "Composite", rt->texture[4]); - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", poly->texture->d3dfinaltex); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", poly->texture->m_d3dfinaltex); if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->m_rawwidth); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->m_rawheight); + (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->m_ustop - poly->texture->m_ustart)); + (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->m_vstop - poly->texture->m_vstart)); (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); (*d3dintf->effect.set_float)(curr_effect, "CCValue", options->yiq_cc); (*d3dintf->effect.set_float)(curr_effect, "AValue", options->yiq_a); - (*d3dintf->effect.set_float)(curr_effect, "BValue", (poly->texture->cur_frame == 2) ? 0.0f : ((float)poly->texture->cur_frame * options->yiq_b)); + (*d3dintf->effect.set_float)(curr_effect, "BValue", (poly->texture->m_cur_frame == 2) ? 0.0f : ((float)poly->texture->m_cur_frame * options->yiq_b)); (*d3dintf->effect.set_float)(curr_effect, "OValue", options->yiq_o); (*d3dintf->effect.set_float)(curr_effect, "PValue", options->yiq_p); (*d3dintf->effect.set_float)(curr_effect, "NotchHalfWidth", options->yiq_n); @@ -1741,10 +1741,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) /* Render the initial color-convolution pass */ if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", options->yiq_enable ? 1.0f : (1.0f / (poly->texture->ustop - poly->texture->ustart))); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", options->yiq_enable ? 1.0f : (1.0f / (poly->texture->vstop - poly->texture->vstart))); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->m_rawwidth); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->m_rawheight); + (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", options->yiq_enable ? 1.0f : (1.0f / (poly->texture->m_ustop - poly->texture->m_ustart))); + (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", options->yiq_enable ? 1.0f : (1.0f / (poly->texture->m_vstop - poly->texture->m_vstart))); (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); (*d3dintf->effect.set_float)(curr_effect, "YIQEnable", options->yiq_enable ? 1.0f : 0.0f); @@ -1783,10 +1783,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->m_rawwidth); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->m_rawheight); + (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->m_ustop - poly->texture->m_ustart)); + (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->m_vstop - poly->texture->m_vstart)); } (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); @@ -1815,10 +1815,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->m_rawwidth); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->m_rawheight); + (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->m_ustop - poly->texture->m_ustart)); + (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->m_vstop - poly->texture->m_vstart)); (*d3dintf->effect.set_vector)(curr_effect, "ConvergeX", 3, options->converge_x); (*d3dintf->effect.set_vector)(curr_effect, "ConvergeY", 3, options->converge_y); (*d3dintf->effect.set_vector)(curr_effect, "RadialConvergeX", 3, options->radial_converge_x); @@ -1855,10 +1855,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->ustop - poly->texture->ustart)) : 0.0f); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->vstop - poly->texture->vstart)) : 0.0f); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->m_rawwidth); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->m_rawheight); + (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->m_ustop - poly->texture->m_ustart)) : 0.0f); + (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->m_vstop - poly->texture->m_vstart)) : 0.0f); (*d3dintf->effect.set_vector)(curr_effect, "Defocus", 2, &options->defocus[0]); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); @@ -1885,8 +1885,8 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->m_rawwidth); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->m_rawheight); (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f); (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f); (*d3dintf->effect.set_vector)(curr_effect, "Defocus", 2, &options->defocus[1]); @@ -1917,10 +1917,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->m_rawwidth); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->m_rawheight); + (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->m_ustop - poly->texture->m_ustart)); + (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->m_vstop - poly->texture->m_vstart)); (*d3dintf->effect.set_vector)(curr_effect, "Phosphor", 3, options->phosphor); } (*d3dintf->effect.set_float)(curr_effect, "TextureWidth", (float)rt->target_width); @@ -2151,10 +2151,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[2]); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", poly->texture != NULL ? (float)poly->texture->rawwidth : 8.0f); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", poly->texture != NULL ? (float)poly->texture->rawheight : 8.0f); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->ustop - poly->texture->ustart)) : 0.0f); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->vstop - poly->texture->vstart)) : 0.0f); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", poly->texture != NULL ? (float)poly->texture->m_rawwidth : 8.0f); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", poly->texture != NULL ? (float)poly->texture->m_rawheight : 8.0f); + (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->m_ustop - poly->texture->m_ustart)) : 0.0f); + (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->m_vstop - poly->texture->m_vstart)) : 0.0f); (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); (*d3dintf->effect.set_float)(curr_effect, "PostPass", 0.0f); @@ -2174,8 +2174,8 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.end)(curr_effect); #endif - poly->texture->cur_frame++; - poly->texture->cur_frame %= options->yiq_phase_count; + poly->texture->m_cur_frame++; + poly->texture->m_cur_frame %= options->yiq_phase_count; options->params_dirty = false; } @@ -2379,10 +2379,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->m_rawwidth); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->m_rawheight); + (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->m_ustop - poly->texture->m_ustart)); + (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->m_vstop - poly->texture->m_vstart)); result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); @@ -2407,10 +2407,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) #endif else { - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", poly->texture != NULL ? (float)poly->texture->rawwidth : 8.0f); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", poly->texture != NULL ? (float)poly->texture->rawheight : 8.0f); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->ustop - poly->texture->ustart)) : 0.0f); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->vstop - poly->texture->vstart)) : 0.0f); + (*d3dintf->effect.set_float)(curr_effect, "RawWidth", poly->texture != NULL ? (float)poly->texture->m_rawwidth : 8.0f); + (*d3dintf->effect.set_float)(curr_effect, "RawHeight", poly->texture != NULL ? (float)poly->texture->m_rawheight : 8.0f); + (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->m_ustop - poly->texture->m_ustart)) : 0.0f); + (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->m_vstop - poly->texture->m_vstart)) : 0.0f); (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); (*d3dintf->effect.set_float)(curr_effect, "PostPass", 0.0f); @@ -2450,16 +2450,16 @@ void hlsl_info::end_draw() // hlsl_info::register_prescaled_texture //============================================================ -bool hlsl_info::register_prescaled_texture(d3d_texture_info *texture) +bool hlsl_info::register_prescaled_texture(d3d::texture_info *texture) { - return register_texture(texture, texture->rawwidth, texture->rawheight, texture->xprescale, texture->yprescale); + return register_texture(texture); } //============================================================ // hlsl_info::add_cache_target - register a cache target //============================================================ -bool hlsl_info::add_cache_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int xprescale, int yprescale, int screen_index) +bool hlsl_info::add_cache_target(d3d_info* d3d, d3d::texture_info* info, int width, int height, int xprescale, int yprescale, int screen_index) { d3d_cache_target* target = (d3d_cache_target*)global_alloc_clear(d3d_cache_target); @@ -2471,8 +2471,8 @@ bool hlsl_info::add_cache_target(d3d_info* d3d, d3d_texture_info* info, int widt if (info != NULL) { - target->width = info->texinfo.width; - target->height = info->texinfo.height; + target->width = info->get_texinfo()->width; + target->height = info->get_texinfo()->height; } else { @@ -2524,7 +2524,7 @@ void hlsl_info::create_vector_target(render_primitive *prim) // hlsl_info::add_render_target - register a render target //============================================================ -bool hlsl_info::add_render_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int xprescale, int yprescale, bool bloom) +bool hlsl_info::add_render_target(d3d_info* d3d, d3d::texture_info* info, int width, int height, int xprescale, int yprescale, bool bloom) { UINT32 screen_index = 0; UINT32 page_index = 0; @@ -2536,7 +2536,7 @@ bool hlsl_info::add_render_target(d3d_info* d3d, d3d_texture_info* info, int wid remove_render_target(existing_target); } - UINT32 screen_index_data = (UINT32)info->texinfo.osddata; + UINT32 screen_index_data = (UINT32)info->get_texinfo()->osddata; screen_index = screen_index_data >> 1; page_index = screen_index_data & 1; } @@ -2559,8 +2559,8 @@ bool hlsl_info::add_render_target(d3d_info* d3d, d3d_texture_info* info, int wid if (info != NULL) { - target->width = info->texinfo.width; - target->height = info->texinfo.height; + target->width = info->get_texinfo()->width; + target->height = info->get_texinfo()->height; } else { @@ -2611,23 +2611,20 @@ void hlsl_info::enumerate_screens() //============================================================ -// hlsl_info::register_texture +// hlsl_info::register_texture(d3d_texture::info) //============================================================ -bool hlsl_info::register_texture(d3d_texture_info *texture) +bool hlsl_info::register_texture(d3d::texture_info *texture) { - return register_texture(texture, texture->rawwidth, texture->rawheight, 1, 1); -} + int width = texture->get_width(); + int height = texture->get_height(); + int xscale = texture->get_xscale(); + int yscale = texture->get_yscale(); - -//============================================================ -// hlsl_info::register_texture(d3d_texture_info, int, int, int, int) -//============================================================ - -bool hlsl_info::register_texture(d3d_texture_info *texture, int width, int height, int xscale, int yscale) -{ if (!master_enable || !d3dintf->post_fx_available) - return 0; + { + return false; + } enumerate_screens(); diff --git a/src/osd/windows/d3dhlsl.h b/src/osd/windows/d3dhlsl.h index 25c6cf77077..45e8a5e0977 100644 --- a/src/osd/windows/d3dhlsl.h +++ b/src/osd/windows/d3dhlsl.h @@ -138,10 +138,10 @@ public: void init_effect_info(d3d_poly_info *poly); void render_quad(d3d_poly_info *poly, int vertnum); - bool register_texture(d3d_texture_info *texture); - bool register_prescaled_texture(d3d_texture_info *texture); - bool add_render_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int xprescale, int yprescale, bool bloom = false); - bool add_cache_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int xprescale, int yprescale, int screen_index); + bool register_texture(d3d::texture_info *texture); + bool register_prescaled_texture(d3d::texture_info *texture); + bool add_render_target(d3d_info* d3d, d3d::texture_info* info, int width, int height, int xprescale, int yprescale, bool bloom = false); + bool add_cache_target(d3d_info* d3d, d3d::texture_info* info, int width, int height, int xprescale, int yprescale, int screen_index); void window_save(); void window_record(); @@ -152,9 +152,9 @@ public: void record_texture(); void init_fsfx_quad(void *vertbuf); - void set_texture(d3d_texture_info *texture); - d3d_render_target * find_render_target(d3d_texture_info *info); - void remove_render_target(d3d_texture_info *texture); + void set_texture(d3d::texture_info *texture); + d3d_render_target * find_render_target(d3d::texture_info *info); + void remove_render_target(d3d::texture_info *texture); void remove_render_target(int width, int height, UINT32 screen_index, UINT32 page_index); void remove_render_target(d3d_render_target *rt); @@ -175,7 +175,7 @@ private: void end_avi_recording(); void begin_avi_recording(const char *name); - bool register_texture(d3d_texture_info *texture, int width, int height, int xscale, int yscale); + bool register_texture(d3d::texture_info *texture, int width, int height, int xscale, int yscale); d3d_render_target* find_render_target(int width, int height, UINT32 screen_index, UINT32 page_index); d3d_cache_target * find_cache_target(UINT32 screen_index, int width, int height); @@ -199,7 +199,7 @@ private: int prescale_size_y; // prescale size y int preset; // preset, if relevant bitmap_argb32 shadow_bitmap; // shadow mask bitmap for post-processing shader - d3d_texture_info * shadow_texture; // shadow mask texture for post-processing shader + d3d::texture_info * shadow_texture; // shadow mask texture for post-processing shader hlsl_options * options; // current uniform state D3DPRIMITIVETYPE vecbuf_type; UINT32 vecbuf_index; diff --git a/src/osd/windows/drawd3d.c b/src/osd/windows/drawd3d.c index 7aa426d4867..0505244af44 100644 --- a/src/osd/windows/drawd3d.c +++ b/src/osd/windows/drawd3d.c @@ -209,14 +209,14 @@ INLINE UINT32 texture_compute_hash(const render_texinfo *texture, UINT32 flags) } -INLINE void set_texture(d3d_info *d3d, d3d_texture_info *texture) +INLINE void set_texture(d3d_info *d3d, d3d::texture_info *texture) { HRESULT result; if (texture != d3d->last_texture) { d3d->last_texture = texture; - d3d->last_texture_flags = (texture == NULL ? 0 : texture->flags); - result = (*d3dintf->device.set_texture)(d3d->device, 0, (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex); + d3d->last_texture_flags = (texture == NULL ? 0 : texture->m_flags); + result = (*d3dintf->device.set_texture)(d3d->device, 0, (texture == NULL) ? d3d->default_texture->m_d3dfinaltex : texture->m_d3dfinaltex); d3d->hlsl->set_texture(texture); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture call\n", (int)result); } @@ -325,7 +325,7 @@ INLINE void set_blendmode(d3d_info *d3d, int blendmode) INLINE void reset_render_states(d3d_info *d3d) { // this ensures subsequent calls to the above setters will force-update the data - d3d->last_texture = (d3d_texture_info *)~0; + d3d->last_texture = (d3d::texture_info *)~0; d3d->last_filter = -1; d3d->last_blendenable = -1; d3d->last_blendop = -1; @@ -372,13 +372,6 @@ static void draw_quad(d3d_info *d3d, const render_primitive *prim); static d3d_vertex *primitive_alloc(d3d_info *d3d, int numverts); static void primitive_flush_pending(d3d_info *d3d); -// textures -static void texture_compute_size(d3d_info *d3d, int texwidth, int texheight, d3d_texture_info *texture); -static void texture_set_data(d3d_info *d3d, d3d_texture_info *texture, const render_texinfo *texsource, UINT32 flags); -static void texture_prescale(d3d_info *d3d, d3d_texture_info *texture); -static d3d_texture_info *texture_find(d3d_info *d3d, const render_primitive *prim); -static void texture_update(d3d_info *d3d, const render_primitive *prim); - //============================================================ // drawd3d_init //============================================================ @@ -607,7 +600,21 @@ mtlog_add("drawd3d_window_draw: begin"); { if (prim->texture.base != NULL) { - texture_update(d3d, prim); + if (prim->texture.osdhandle == NULL) + { + // if there isn't one, create a new texture + prim->texture.osdhandle = (void*)(new d3d::texture_info(d3d, &prim->texture, prim->flags)); + } + else + { + // if there is one, but with a different seqid, copy the data + d3d::texture_info *texture = (d3d::texture_info *)prim->texture.osdhandle; + if (texture->get_texinfo()->seqid != prim->texture.seqid) + { + texture->set_data(&prim->texture, prim->flags); + texture->get_texinfo()->seqid = prim->texture.seqid; + } + } } else if(d3d->hlsl->vector_enabled() && PRIMFLAG_GET_VECTORBUF(prim->flags)) { @@ -921,7 +928,7 @@ static int device_create_resources(d3d_info *d3d) texture.seqid = 0; // now create it - d3d->default_texture = texture_create(d3d, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)); + d3d->default_texture = new d3d::texture_info(d3d, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)); } // experimental: if we have a vector bitmap, create a texture for it @@ -938,7 +945,7 @@ static int device_create_resources(d3d_info *d3d) texture.seqid = 0; // now create it - d3d->vector_texture = texture_create(d3d, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)); + d3d->vector_texture = new d3d::texture_info(d3d, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)); } return 0; @@ -978,25 +985,9 @@ static void device_delete_resources(d3d_info *d3d) // free all textures while (d3d->texlist != NULL) { - d3d_texture_info *tex = d3d->texlist; - d3d->texlist = tex->next; - if (tex->d3dfinaltex != NULL) - { - if (tex->d3dtex == tex->d3dfinaltex) tex->d3dtex = NULL; - (*d3dintf->texture.release)(tex->d3dfinaltex); - tex->d3dfinaltex = NULL; - } - if (tex->d3dtex != NULL) - { - (*d3dintf->texture.release)(tex->d3dtex); - tex->d3dtex = NULL; - } - if (tex->d3dsurface != NULL) - { - (*d3dintf->surface.release)(tex->d3dsurface); - tex->d3dsurface = NULL; - } - global_free(tex); + d3d::texture_info *tex = d3d->texlist; + d3d->texlist = tex->m_next; + delete tex; } // free the vertex buffer @@ -1537,31 +1528,31 @@ static void draw_line(d3d_info *d3d, const render_primitive *prim, float line_ti // if we have a texture to use for the vectors, use it here if (d3d->vector_texture != NULL) { - vertex[0].u0 = d3d->vector_texture->ustart; - vertex[0].v0 = d3d->vector_texture->vstart; + vertex[0].u0 = d3d->vector_texture->m_ustart; + vertex[0].v0 = d3d->vector_texture->m_vstart; - vertex[2].u0 = d3d->vector_texture->ustop; - vertex[2].v0 = d3d->vector_texture->vstart; + vertex[2].u0 = d3d->vector_texture->m_ustop; + vertex[2].v0 = d3d->vector_texture->m_vstart; - vertex[1].u0 = d3d->vector_texture->ustart; - vertex[1].v0 = d3d->vector_texture->vstop; + vertex[1].u0 = d3d->vector_texture->m_ustart; + vertex[1].v0 = d3d->vector_texture->m_vstop; - vertex[3].u0 = d3d->vector_texture->ustop; - vertex[3].v0 = d3d->vector_texture->vstop; + vertex[3].u0 = d3d->vector_texture->m_ustop; + vertex[3].v0 = d3d->vector_texture->m_vstop; } else if(d3d->default_texture != NULL) { - vertex[0].u0 = d3d->default_texture->ustart; - vertex[0].v0 = d3d->default_texture->vstart; + vertex[0].u0 = d3d->default_texture->m_ustart; + vertex[0].v0 = d3d->default_texture->m_vstart; - vertex[2].u0 = d3d->default_texture->ustart; - vertex[2].v0 = d3d->default_texture->vstart; + vertex[2].u0 = d3d->default_texture->m_ustart; + vertex[2].v0 = d3d->default_texture->m_vstart; - vertex[1].u0 = d3d->default_texture->ustart; - vertex[1].v0 = d3d->default_texture->vstart; + vertex[1].u0 = d3d->default_texture->m_ustart; + vertex[1].v0 = d3d->default_texture->m_vstart; - vertex[3].u0 = d3d->default_texture->ustart; - vertex[3].v0 = d3d->default_texture->vstart; + vertex[3].u0 = d3d->default_texture->m_ustart; + vertex[3].v0 = d3d->default_texture->m_vstart; } // set the color, Z parameters to standard values @@ -1607,17 +1598,15 @@ static void draw_line(d3d_info *d3d, const render_primitive *prim, float line_ti static void draw_quad(d3d_info *d3d, const render_primitive *prim) { - d3d_texture_info *texture = texture_find(d3d, prim); - DWORD color, modmode; - d3d_vertex *vertex; - INT32 r, g, b, a; - d3d_poly_info *poly; - int i; + d3d::texture_info *texture = (d3d::texture_info *)prim->texture.osdhandle; - texture = texture != NULL ? texture : d3d->default_texture; + if (texture == NULL) + { + texture = d3d->default_texture; + } // get a pointer to the vertex buffer - vertex = primitive_alloc(d3d, 4); + d3d_vertex *vertex = primitive_alloc(d3d, 4); if (vertex == NULL) return; @@ -1634,24 +1623,24 @@ static void draw_quad(d3d_info *d3d, const render_primitive *prim) // set the texture coordinates if(texture != NULL) { - float du = texture->ustop - texture->ustart; - float dv = texture->vstop - texture->vstart; - vertex[0].u0 = texture->ustart + du * prim->texcoords.tl.u; - vertex[0].v0 = texture->vstart + dv * prim->texcoords.tl.v; - vertex[1].u0 = texture->ustart + du * prim->texcoords.tr.u; - vertex[1].v0 = texture->vstart + dv * prim->texcoords.tr.v; - vertex[2].u0 = texture->ustart + du * prim->texcoords.bl.u; - vertex[2].v0 = texture->vstart + dv * prim->texcoords.bl.v; - vertex[3].u0 = texture->ustart + du * prim->texcoords.br.u; - vertex[3].v0 = texture->vstart + dv * prim->texcoords.br.v; + float du = texture->m_ustop - texture->m_ustart; + float dv = texture->m_vstop - texture->m_vstart; + vertex[0].u0 = texture->m_ustart + du * prim->texcoords.tl.u; + vertex[0].v0 = texture->m_vstart + dv * prim->texcoords.tl.v; + vertex[1].u0 = texture->m_ustart + du * prim->texcoords.tr.u; + vertex[1].v0 = texture->m_vstart + dv * prim->texcoords.tr.v; + vertex[2].u0 = texture->m_ustart + du * prim->texcoords.bl.u; + vertex[2].v0 = texture->m_vstart + dv * prim->texcoords.bl.v; + vertex[3].u0 = texture->m_ustart + du * prim->texcoords.br.u; + vertex[3].v0 = texture->m_vstart + dv * prim->texcoords.br.v; } // determine the color, allowing for over modulation - r = (INT32)(prim->color.r * 255.0f); - g = (INT32)(prim->color.g * 255.0f); - b = (INT32)(prim->color.b * 255.0f); - a = (INT32)(prim->color.a * 255.0f); - modmode = D3DTOP_MODULATE; + INT32 r = (INT32)(prim->color.r * 255.0f); + INT32 g = (INT32)(prim->color.g * 255.0f); + INT32 b = (INT32)(prim->color.b * 255.0f); + INT32 a = (INT32)(prim->color.a * 255.0f); + DWORD modmode = D3DTOP_MODULATE; if (texture != NULL) { if (d3d->mod2x_supported && (r > 255 || g > 255 || b > 255)) @@ -1672,10 +1661,10 @@ static void draw_quad(d3d_info *d3d, const render_primitive *prim) if (g > 255) g = 255; if (b > 255) b = 255; if (a > 255) a = 255; - color = D3DCOLOR_ARGB(a, r, g, b); + DWORD color = D3DCOLOR_ARGB(a, r, g, b); // set the color, Z parameters to standard values - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { vertex[i].z = 0.0f; vertex[i].rhw = 1.0f; @@ -1683,7 +1672,7 @@ static void draw_quad(d3d_info *d3d, const render_primitive *prim) } // now add a polygon entry - poly = &d3d->poly[d3d->numpolys++]; + d3d_poly_info *poly = &d3d->poly[d3d->numpolys++]; poly->type = D3DPT_TRIANGLESTRIP; poly->count = 2; poly->numverts = 4; @@ -1818,42 +1807,65 @@ static void primitive_flush_pending(d3d_info *d3d) d3d->numpolys = 0; } +//============================================================ +// texture_info destructor +//============================================================ -void texture_destroy(d3d_info *d3d, d3d_texture_info *info) +d3d::texture_info::~texture_info() { + if (m_d3dfinaltex != NULL) + { + if (m_d3dtex == m_d3dfinaltex) + { + m_d3dtex = NULL; + } + (*d3dintf->texture.release)(m_d3dfinaltex); + m_d3dfinaltex = NULL; + } + if (m_d3dtex != NULL) + { + (*d3dintf->texture.release)(m_d3dtex); + m_d3dtex = NULL; + } + if (m_d3dsurface != NULL) + { + (*d3dintf->surface.release)(m_d3dsurface); + m_d3dsurface = NULL; + } } //============================================================ -// texture_create +// texture_info constructor //============================================================ -d3d_texture_info *texture_create(d3d_info *d3d, const render_texinfo *texsource, UINT32 flags) +d3d::texture_info::texture_info(d3d_info *d3d, render_texinfo* texsource, UINT32 flags) { - d3d_texture_info *texture; HRESULT result; - // allocate a new texture - texture = global_alloc_clear(d3d_texture_info); - // fill in the core data - texture->hash = texture_compute_hash(texsource, flags); - texture->flags = flags; - texture->texinfo = *texsource; - texture->xprescale = video_config.prescale; - texture->yprescale = video_config.prescale; + m_d3d = d3d; + m_hash = texture_compute_hash(texsource, flags); + m_flags = flags; + m_texinfo = texsource; + m_xprescale = video_config.prescale; + m_yprescale = video_config.prescale; + + m_d3dtex = NULL; + m_d3dsurface = NULL; + m_d3dfinaltex = NULL; // compute the size - texture_compute_size(d3d, texsource->width, texsource->height, texture); + compute_size(texsource->width, texsource->height); // non-screen textures are easy if (!PRIMFLAG_GET_SCREENTEX(flags)) { assert(PRIMFLAG_TEXFORMAT(flags) != TEXFORMAT_YUY16); - result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth, texture->rawheight, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &texture->d3dtex); + result = (*d3dintf->device.create_texture)(d3d->device, m_rawwidth, m_rawheight, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_d3dtex); if (result != D3D_OK) goto error; - texture->d3dfinaltex = texture->d3dtex; - texture->type = TEXTURE_TYPE_PLAIN; + m_d3dfinaltex = m_d3dtex; + m_type = TEXTURE_TYPE_PLAIN; } // screen textures are allocated differently @@ -1863,45 +1875,62 @@ d3d_texture_info *texture_create(d3d_info *d3d, const render_texinfo *texsource, DWORD usage = d3d->dynamic_supported ? D3DUSAGE_DYNAMIC : 0; D3DPOOL pool = d3d->dynamic_supported ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED; int maxdim = MAX(d3d->presentation.BackBufferWidth, d3d->presentation.BackBufferHeight); - int attempt; // pick the format if (PRIMFLAG_GET_TEXFORMAT(flags) == TEXFORMAT_YUY16) + { format = d3d->yuv_format; + } else if (PRIMFLAG_GET_TEXFORMAT(flags) == TEXFORMAT_ARGB32 || PRIMFLAG_GET_TEXFORMAT(flags) == TEXFORMAT_PALETTEA16) + { format = D3DFMT_A8R8G8B8; + } else + { format = d3d->screen_format; + } // don't prescale above screen size - while (texture->xprescale > 1 && texture->rawwidth * texture->xprescale >= 2 * maxdim) - texture->xprescale--; - while (texture->xprescale > 1 && texture->rawwidth * texture->xprescale > d3d->texture_max_width) - texture->xprescale--; - while (texture->yprescale > 1 && texture->rawheight * texture->yprescale >= 2 * maxdim) - texture->yprescale--; - while (texture->yprescale > 1 && texture->rawheight * texture->yprescale > d3d->texture_max_height) - texture->yprescale--; - if (texture->xprescale != video_config.prescale || texture->yprescale != video_config.prescale) - mame_printf_verbose("Direct3D: adjusting prescale from %dx%d to %dx%d\n", video_config.prescale, video_config.prescale, texture->xprescale, texture->yprescale); + while (m_xprescale > 1 && m_rawwidth * m_xprescale >= 2 * maxdim) + { + m_xprescale--; + } + while (m_xprescale > 1 && m_rawwidth * m_xprescale > d3d->texture_max_width) + { + m_xprescale--; + } + while (m_yprescale > 1 && m_rawheight * m_yprescale >= 2 * maxdim) + { + m_yprescale--; + } + while (m_yprescale > 1 && m_rawheight * m_yprescale > d3d->texture_max_height) + { + m_yprescale--; + } + if (m_xprescale != video_config.prescale || m_yprescale != video_config.prescale) + { + mame_printf_verbose("Direct3D: adjusting prescale from %dx%d to %dx%d\n", video_config.prescale, video_config.prescale, m_xprescale, m_yprescale); + } // loop until we allocate something or error - for (attempt = 0; attempt < 2; attempt++) + for (int attempt = 0; attempt < 2; attempt++) { // second attempt is always 1:1 if (attempt == 1) - texture->xprescale = texture->yprescale = 1; + { + m_xprescale = m_yprescale = 1; + } // screen textures with no prescaling are pretty easy - if (texture->xprescale == 1 && texture->yprescale == 1) + if (m_xprescale == 1 && m_yprescale == 1) { - result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth, texture->rawheight, 1, usage, format, pool, &texture->d3dtex); + result = (*d3dintf->device.create_texture)(d3d->device, m_rawwidth, m_rawheight, 1, usage, format, pool, &m_d3dtex); if (result == D3D_OK) { - texture->d3dfinaltex = texture->d3dtex; - texture->type = d3d->dynamic_supported ? TEXTURE_TYPE_DYNAMIC : TEXTURE_TYPE_PLAIN; + m_d3dfinaltex = m_d3dtex; + m_type = d3d->dynamic_supported ? TEXTURE_TYPE_DYNAMIC : TEXTURE_TYPE_PLAIN; - if (d3d->hlsl->enabled() && !d3d->hlsl->register_texture(texture)) + if (d3d->hlsl->enabled() && !d3d->hlsl->register_texture(this)) { goto error; } @@ -1913,98 +1942,98 @@ d3d_texture_info *texture_create(d3d_info *d3d, const render_texinfo *texsource, // screen textures with prescaling require two allocations else { - int scwidth, scheight; - D3DFORMAT finalfmt; - // use an offscreen plain surface for stretching if supported // (won't work for YUY textures) if (d3d->stretch_supported && PRIMFLAG_GET_TEXFORMAT(flags) != TEXFORMAT_YUY16) { - result = (*d3dintf->device.create_offscreen_plain_surface)(d3d->device, texture->rawwidth, texture->rawheight, format, D3DPOOL_DEFAULT, &texture->d3dsurface); + result = (*d3dintf->device.create_offscreen_plain_surface)(d3d->device, m_rawwidth, m_rawheight, format, D3DPOOL_DEFAULT, &m_d3dsurface); if (result != D3D_OK) + { continue; - texture->type = TEXTURE_TYPE_SURFACE; + } + m_type = TEXTURE_TYPE_SURFACE; } // otherwise, we allocate a dynamic texture for the source else { - result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth, texture->rawheight, 1, usage, format, pool, &texture->d3dtex); + result = (*d3dintf->device.create_texture)(d3d->device, m_rawwidth, m_rawheight, 1, usage, format, pool, &m_d3dtex); if (result != D3D_OK) + { continue; - texture->type = d3d->dynamic_supported ? TEXTURE_TYPE_DYNAMIC : TEXTURE_TYPE_PLAIN; + } + m_type = d3d->dynamic_supported ? TEXTURE_TYPE_DYNAMIC : TEXTURE_TYPE_PLAIN; } // for the target surface, we allocate a render target texture - scwidth = texture->rawwidth * texture->xprescale; - scheight = texture->rawheight * texture->yprescale; + int scwidth = m_rawwidth * m_xprescale; + int scheight = m_rawheight * m_yprescale; // target surfaces typically cannot be YCbCr, so we always pick RGB in that case - finalfmt = (format != d3d->yuv_format) ? format : D3DFMT_A8R8G8B8; - result = (*d3dintf->device.create_texture)(d3d->device, scwidth, scheight, 1, D3DUSAGE_RENDERTARGET, finalfmt, D3DPOOL_DEFAULT, &texture->d3dfinaltex); + D3DFORMAT finalfmt = (format != d3d->yuv_format) ? format : D3DFMT_A8R8G8B8; + result = (*d3dintf->device.create_texture)(d3d->device, scwidth, scheight, 1, D3DUSAGE_RENDERTARGET, finalfmt, D3DPOOL_DEFAULT, &m_d3dfinaltex); if (result == D3D_OK) { - if (d3d->hlsl->enabled() && !d3d->hlsl->register_prescaled_texture(texture)) + if (d3d->hlsl->enabled() && !d3d->hlsl->register_prescaled_texture(this)) { goto error; } break; } - (*d3dintf->texture.release)(texture->d3dtex); - texture->d3dtex = NULL; + (*d3dintf->texture.release)(m_d3dtex); + m_d3dtex = NULL; } } } // copy the data to the texture - texture_set_data(d3d, texture, texsource, flags); + set_data(texsource, flags); + texsource->osdhandle = (void*)this; // add us to the texture list if(d3d->texlist != NULL) - d3d->texlist->prev = texture; - texture->prev = NULL; - texture->next = d3d->texlist; - d3d->texlist = texture; - return texture; + d3d->texlist->m_prev = this; + m_prev = NULL; + m_next = d3d->texlist; + d3d->texlist = this; + return; error: d3dintf->post_fx_available = false; printf("Direct3D: Critical warning: A texture failed to allocate. Expect things to get bad quickly.\n"); - if (texture->d3dsurface != NULL) - (*d3dintf->surface.release)(texture->d3dsurface); - if (texture->d3dtex != NULL) - (*d3dintf->texture.release)(texture->d3dtex); - global_free(texture); - return NULL; + if (m_d3dsurface != NULL) + (*d3dintf->surface.release)(m_d3dsurface); + if (m_d3dtex != NULL) + (*d3dintf->texture.release)(m_d3dtex); } //============================================================ -// texture_compute_size +// texture_info::compute_size //============================================================ -static void texture_compute_size(d3d_info *d3d, int texwidth, int texheight, d3d_texture_info *texture) +void d3d::texture_info::compute_size(int texwidth, int texheight) { int finalheight = texheight; int finalwidth = texwidth; // if we're not wrapping, add a 1-2 pixel border on all sides - texture->xborderpix = 0; - texture->yborderpix = 0; - if (ENABLE_BORDER_PIX && !(texture->flags & PRIMFLAG_TEXWRAP_MASK)) + m_xborderpix = 0; + m_yborderpix = 0; + if (ENABLE_BORDER_PIX && !(m_flags & PRIMFLAG_TEXWRAP_MASK)) { // note we need 2 pixels in X for YUY textures - texture->xborderpix = (PRIMFLAG_GET_TEXFORMAT(texture->flags) == TEXFORMAT_YUY16) ? 2 : 1; - texture->yborderpix = 1; + m_xborderpix = (PRIMFLAG_GET_TEXFORMAT(m_flags) == TEXFORMAT_YUY16) ? 2 : 1; + m_yborderpix = 1; } // compute final texture size - finalwidth += 2 * texture->xborderpix; - finalheight += 2 * texture->yborderpix; + finalwidth += 2 * m_xborderpix; + finalheight += 2 * m_yborderpix; // round width/height up to nearest power of 2 if we need to - if (!(d3d->texture_caps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL)) + if (!(m_d3d->texture_caps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL)) { // first the width if (finalwidth & (finalwidth - 1)) @@ -2028,7 +2057,7 @@ static void texture_compute_size(d3d_info *d3d, int texwidth, int texheight, d3d } // round up to square if we need to - if (d3d->texture_caps & D3DPTEXTURECAPS_SQUAREONLY) + if (m_d3d->texture_caps & D3DPTEXTURECAPS_SQUAREONLY) { if (finalwidth < finalheight) finalwidth = finalheight; @@ -2037,38 +2066,42 @@ static void texture_compute_size(d3d_info *d3d, int texwidth, int texheight, d3d } // adjust the aspect ratio if we need to - while (finalwidth < finalheight && finalheight / finalwidth > d3d->texture_max_aspect) + while (finalwidth < finalheight && finalheight / finalwidth > m_d3d->texture_max_aspect) + { finalwidth *= 2; - while (finalheight < finalwidth && finalwidth / finalheight > d3d->texture_max_aspect) + } + while (finalheight < finalwidth && finalwidth / finalheight > m_d3d->texture_max_aspect) + { finalheight *= 2; + } // if we added pixels for the border, and that just barely pushed us over, take it back - if ((finalwidth > d3d->texture_max_width && finalwidth - 2 * texture->xborderpix <= d3d->texture_max_width) || - (finalheight > d3d->texture_max_height && finalheight - 2 * texture->yborderpix <= d3d->texture_max_height)) + if ((finalwidth > m_d3d->texture_max_width && finalwidth - 2 * m_xborderpix <= m_d3d->texture_max_width) || + (finalheight > m_d3d->texture_max_height && finalheight - 2 * m_yborderpix <= m_d3d->texture_max_height)) { - finalwidth -= 2 * texture->xborderpix; - finalheight -= 2 * texture->yborderpix; - texture->xborderpix = 0; - texture->yborderpix = 0; + finalwidth -= 2 * m_xborderpix; + finalheight -= 2 * m_yborderpix; + m_xborderpix = 0; + m_yborderpix = 0; } // if we're above the max width/height, do what? - if (finalwidth > d3d->texture_max_width || finalheight > d3d->texture_max_height) + if (finalwidth > m_d3d->texture_max_width || finalheight > m_d3d->texture_max_height) { static int printed = FALSE; - if (!printed) mame_printf_warning("Texture too big! (wanted: %dx%d, max is %dx%d)\n", finalwidth, finalheight, (int)d3d->texture_max_width, (int)d3d->texture_max_height); + if (!printed) mame_printf_warning("Texture too big! (wanted: %dx%d, max is %dx%d)\n", finalwidth, finalheight, (int)m_d3d->texture_max_width, (int)m_d3d->texture_max_height); printed = TRUE; } // compute the U/V scale factors - texture->ustart = (float)texture->xborderpix / (float)finalwidth; - texture->ustop = (float)(texwidth + texture->xborderpix) / (float)finalwidth; - texture->vstart = (float)texture->yborderpix / (float)finalheight; - texture->vstop = (float)(texheight + texture->yborderpix) / (float)finalheight; + m_ustart = (float)m_xborderpix / (float)finalwidth; + m_ustop = (float)(texwidth + m_xborderpix) / (float)finalwidth; + m_vstart = (float)m_yborderpix / (float)finalheight; + m_vstop = (float)(texheight + m_yborderpix) / (float)finalheight; // set the final values - texture->rawwidth = finalwidth; - texture->rawheight = finalheight; + m_rawwidth = finalwidth; + m_rawheight = finalheight; } @@ -2411,58 +2444,58 @@ INLINE void copyline_yuy16_to_argb(UINT32 *dst, const UINT16 *src, int width, co // texture_set_data //============================================================ -static void texture_set_data(d3d_info *d3d, d3d_texture_info *texture, const render_texinfo *texsource, UINT32 flags) +void d3d::texture_info::set_data(const render_texinfo *texsource, UINT32 flags) { D3DLOCKED_RECT rect; HRESULT result; - int miny, maxy; - int dsty; // lock the texture - switch (texture->type) + switch (m_type) { default: - case TEXTURE_TYPE_PLAIN: result = (*d3dintf->texture.lock_rect)(texture->d3dtex, 0, &rect, NULL, 0); break; - case TEXTURE_TYPE_DYNAMIC: result = (*d3dintf->texture.lock_rect)(texture->d3dtex, 0, &rect, NULL, D3DLOCK_DISCARD); break; - case TEXTURE_TYPE_SURFACE: result = (*d3dintf->surface.lock_rect)(texture->d3dsurface, &rect, NULL, D3DLOCK_DISCARD); break; + case TEXTURE_TYPE_PLAIN: result = (*d3dintf->texture.lock_rect)(m_d3dtex, 0, &rect, NULL, 0); break; + case TEXTURE_TYPE_DYNAMIC: result = (*d3dintf->texture.lock_rect)(m_d3dtex, 0, &rect, NULL, D3DLOCK_DISCARD); break; + case TEXTURE_TYPE_SURFACE: result = (*d3dintf->surface.lock_rect)(m_d3dsurface, &rect, NULL, D3DLOCK_DISCARD); break; } if (result != D3D_OK) + { return; + } // loop over Y - miny = 0 - texture->yborderpix; - maxy = texsource->height + texture->yborderpix; - for (dsty = miny; dsty < maxy; dsty++) + int miny = 0 - m_yborderpix; + int maxy = texsource->height + m_yborderpix; + for (int dsty = miny; dsty < maxy; dsty++) { int srcy = (dsty < 0) ? 0 : (dsty >= texsource->height) ? texsource->height - 1 : dsty; - void *dst = (BYTE *)rect.pBits + (dsty + texture->yborderpix) * rect.Pitch; + void *dst = (BYTE *)rect.pBits + (dsty + m_yborderpix) * rect.Pitch; // switch off of the format and switch (PRIMFLAG_GET_TEXFORMAT(flags)) { case TEXFORMAT_PALETTE16: - copyline_palette16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix); + copyline_palette16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix); break; case TEXFORMAT_PALETTEA16: - copyline_palettea16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix); + copyline_palettea16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix); break; case TEXFORMAT_RGB32: - copyline_rgb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix); + copyline_rgb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix); break; case TEXFORMAT_ARGB32: - copyline_argb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix); + copyline_argb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix); break; case TEXFORMAT_YUY16: - if (d3d->yuv_format == D3DFMT_YUY2) - copyline_yuy16_to_yuy2((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix); - else if (d3d->yuv_format == D3DFMT_UYVY) - copyline_yuy16_to_uyvy((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix); + if (m_d3d->yuv_format == D3DFMT_YUY2) + copyline_yuy16_to_yuy2((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix); + else if (m_d3d->yuv_format == D3DFMT_UYVY) + copyline_yuy16_to_uyvy((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix); else - copyline_yuy16_to_argb((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix); + copyline_yuy16_to_argb((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix); break; default: @@ -2472,58 +2505,61 @@ static void texture_set_data(d3d_info *d3d, d3d_texture_info *texture, const ren } // unlock - switch (texture->type) + switch (m_type) { default: - case TEXTURE_TYPE_PLAIN: result = (*d3dintf->texture.unlock_rect)(texture->d3dtex, 0); break; - case TEXTURE_TYPE_DYNAMIC: result = (*d3dintf->texture.unlock_rect)(texture->d3dtex, 0); break; - case TEXTURE_TYPE_SURFACE: result = (*d3dintf->surface.unlock_rect)(texture->d3dsurface); break; + case TEXTURE_TYPE_PLAIN: result = (*d3dintf->texture.unlock_rect)(m_d3dtex, 0); break; + case TEXTURE_TYPE_DYNAMIC: result = (*d3dintf->texture.unlock_rect)(m_d3dtex, 0); break; + case TEXTURE_TYPE_SURFACE: result = (*d3dintf->surface.unlock_rect)(m_d3dsurface); break; + } + if (result != D3D_OK) + { + mame_printf_verbose("Direct3D: Error %08X during texture unlock_rect call\n", (int)result); } - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during texture unlock_rect call\n", (int)result); // prescale - texture_prescale(d3d, texture); + prescale(); } //============================================================ -// texture_prescale +// texture_info::prescale //============================================================ -static void texture_prescale(d3d_info *d3d, d3d_texture_info *texture) +void d3d::texture_info::prescale() { d3d_surface *surface; HRESULT result; int i; // if we don't need to, just skip it - if (texture->d3dtex == texture->d3dfinaltex) + if (m_d3dtex == m_d3dfinaltex) return; // for all cases, we need to get the surface of the render target - result = (*d3dintf->texture.get_surface_level)(texture->d3dfinaltex, 0, &surface); + result = (*d3dintf->texture.get_surface_level)(m_d3dfinaltex, 0, &surface); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during texture get_surface_level call\n", (int)result); // if we have an offscreen plain surface, we can just StretchRect to it - if (texture->type == TEXTURE_TYPE_SURFACE) + if (m_type == TEXTURE_TYPE_SURFACE) { - RECT source, dest; - - assert(texture->d3dsurface != NULL); + assert(m_d3dsurface != NULL); // set the source bounds + RECT source; source.left = source.top = 0; - source.right = texture->texinfo.width + 2 * texture->xborderpix; - source.bottom = texture->texinfo.height + 2 * texture->yborderpix; + source.right = m_texinfo->width + 2 * m_xborderpix; + source.bottom = m_texinfo->height + 2 * m_yborderpix; // set the target bounds + RECT dest; dest = source; - dest.right *= texture->xprescale; - dest.bottom *= texture->yprescale; + dest.right *= m_xprescale; + dest.bottom *= m_yprescale; // do the stretchrect - result = (*d3dintf->device.stretch_rect)(d3d->device, texture->d3dsurface, &source, surface, &dest, D3DTEXF_POINT); + result = (*d3dintf->device.stretch_rect)(m_d3d->device, m_d3dsurface, &source, surface, &dest, D3DTEXF_POINT); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device stretct_rect call\n", (int)result); } @@ -2532,77 +2568,77 @@ static void texture_prescale(d3d_info *d3d, d3d_texture_info *texture) { d3d_surface *backbuffer; - assert(texture->d3dtex != NULL); + assert(m_d3dtex != NULL); // first remember the original render target and set the new one - result = (*d3dintf->device.get_render_target)(d3d->device, 0, &backbuffer); + result = (*d3dintf->device.get_render_target)(m_d3d->device, 0, &backbuffer); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device get_render_target call\n", (int)result); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, surface); + result = (*d3dintf->device.set_render_target)(m_d3d->device, 0, surface); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 1\n", (int)result); - reset_render_states(d3d); + reset_render_states(m_d3d); // start the scene - result = (*d3dintf->device.begin_scene)(d3d->device); + result = (*d3dintf->device.begin_scene)(m_d3d->device); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device begin_scene call\n", (int)result); // configure the rendering pipeline - set_filter(d3d, FALSE); - set_blendmode(d3d, BLENDMODE_NONE); - result = (*d3dintf->device.set_texture)(d3d->device, 0, texture->d3dtex); + set_filter(m_d3d, FALSE); + set_blendmode(m_d3d, BLENDMODE_NONE); + result = (*d3dintf->device.set_texture)(m_d3d->device, 0, m_d3dtex); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture call\n", (int)result); // lock the vertex buffer - result = (*d3dintf->vertexbuf.lock)(d3d->vertexbuf, 0, 0, (VOID **)&d3d->lockedbuf, D3DLOCK_DISCARD); + result = (*d3dintf->vertexbuf.lock)(m_d3d->vertexbuf, 0, 0, (VOID **)&m_d3d->lockedbuf, D3DLOCK_DISCARD); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during vertex buffer lock call\n", (int)result); // configure the X/Y coordinates on the target surface - d3d->lockedbuf[0].x = -0.5f; - d3d->lockedbuf[0].y = -0.5f; - d3d->lockedbuf[1].x = (float)((texture->texinfo.width + 2 * texture->xborderpix) * texture->xprescale) - 0.5f; - d3d->lockedbuf[1].y = -0.5f; - d3d->lockedbuf[2].x = -0.5f; - d3d->lockedbuf[2].y = (float)((texture->texinfo.height + 2 * texture->yborderpix) * texture->yprescale) - 0.5f; - d3d->lockedbuf[3].x = (float)((texture->texinfo.width + 2 * texture->xborderpix) * texture->xprescale) - 0.5f; - d3d->lockedbuf[3].y = (float)((texture->texinfo.height + 2 * texture->yborderpix) * texture->yprescale) - 0.5f; + m_d3d->lockedbuf[0].x = -0.5f; + m_d3d->lockedbuf[0].y = -0.5f; + m_d3d->lockedbuf[1].x = (float)((m_texinfo->width + 2 * m_xborderpix) * m_xprescale) - 0.5f; + m_d3d->lockedbuf[1].y = -0.5f; + m_d3d->lockedbuf[2].x = -0.5f; + m_d3d->lockedbuf[2].y = (float)((m_texinfo->height + 2 * m_yborderpix) * m_yprescale) - 0.5f; + m_d3d->lockedbuf[3].x = (float)((m_texinfo->width + 2 * m_xborderpix) * m_xprescale) - 0.5f; + m_d3d->lockedbuf[3].y = (float)((m_texinfo->height + 2 * m_yborderpix) * m_yprescale) - 0.5f; // configure the U/V coordintes on the source texture - d3d->lockedbuf[0].u0 = 0.0f; - d3d->lockedbuf[0].v0 = 0.0f; - d3d->lockedbuf[1].u0 = (float)(texture->texinfo.width + 2 * texture->xborderpix) / (float)texture->rawwidth; - d3d->lockedbuf[1].v0 = 0.0f; - d3d->lockedbuf[2].u0 = 0.0f; - d3d->lockedbuf[2].v0 = (float)(texture->texinfo.height + 2 * texture->yborderpix) / (float)texture->rawheight; - d3d->lockedbuf[3].u0 = (float)(texture->texinfo.width + 2 * texture->xborderpix) / (float)texture->rawwidth; - d3d->lockedbuf[3].v0 = (float)(texture->texinfo.height + 2 * texture->yborderpix) / (float)texture->rawheight; + m_d3d->lockedbuf[0].u0 = 0.0f; + m_d3d->lockedbuf[0].v0 = 0.0f; + m_d3d->lockedbuf[1].u0 = (float)(m_texinfo->width + 2 * m_xborderpix) / (float)m_rawwidth; + m_d3d->lockedbuf[1].v0 = 0.0f; + m_d3d->lockedbuf[2].u0 = 0.0f; + m_d3d->lockedbuf[2].v0 = (float)(m_texinfo->height + 2 * m_yborderpix) / (float)m_rawheight; + m_d3d->lockedbuf[3].u0 = (float)(m_texinfo->width + 2 * m_xborderpix) / (float)m_rawwidth; + m_d3d->lockedbuf[3].v0 = (float)(m_texinfo->height + 2 * m_yborderpix) / (float)m_rawheight; // reset the remaining vertex parameters for (i = 0; i < 4; i++) { - d3d->lockedbuf[i].z = 0.0f; - d3d->lockedbuf[i].rhw = 1.0f; - d3d->lockedbuf[i].color = D3DCOLOR_ARGB(0xff,0xff,0xff,0xff); + m_d3d->lockedbuf[i].z = 0.0f; + m_d3d->lockedbuf[i].rhw = 1.0f; + m_d3d->lockedbuf[i].color = D3DCOLOR_ARGB(0xff,0xff,0xff,0xff); } // unlock the vertex buffer - result = (*d3dintf->vertexbuf.unlock)(d3d->vertexbuf); + result = (*d3dintf->vertexbuf.unlock)(m_d3d->vertexbuf); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during vertex buffer unlock call\n", (int)result); - d3d->lockedbuf = NULL; + m_d3d->lockedbuf = NULL; // set the stream and draw the triangle strip - result = (*d3dintf->device.set_stream_source)(d3d->device, 0, d3d->vertexbuf, sizeof(d3d_vertex)); + result = (*d3dintf->device.set_stream_source)(m_d3d->device, 0, m_d3d->vertexbuf, sizeof(d3d_vertex)); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_stream_source call\n", (int)result); - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLESTRIP, 0, 2); + result = (*d3dintf->device.draw_primitive)(m_d3d->device, D3DPT_TRIANGLESTRIP, 0, 2); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); // end the scene - result = (*d3dintf->device.end_scene)(d3d->device); + result = (*d3dintf->device.end_scene)(m_d3d->device); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device end_scene call\n", (int)result); // reset the render target and release our reference to the backbuffer - result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer); + result = (*d3dintf->device.set_render_target)(m_d3d->device, 0, backbuffer); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 2\n", (int)result); (*d3dintf->surface.release)(backbuffer); - reset_render_states(d3d); + reset_render_states(m_d3d); } // release our reference to the target surface @@ -2610,108 +2646,6 @@ static void texture_prescale(d3d_info *d3d, d3d_texture_info *texture) } - -//============================================================ -// texture_find -//============================================================ - -static d3d_texture_info *texture_find(d3d_info *d3d, const render_primitive *prim) -{ - UINT32 texhash = texture_compute_hash(&prim->texture, prim->flags); - d3d_texture_info *texture; - - // find a match - for (texture = d3d->texlist; texture != NULL; texture = texture->next) - { - UINT32 test_screen = (UINT32)texture->texinfo.osddata >> 1; - UINT32 test_page = (UINT32)texture->texinfo.osddata & 1; - UINT32 prim_screen = (UINT32)prim->texture.osddata >> 1; - UINT32 prim_page = (UINT32)prim->texture.osddata & 1; - if (test_screen != prim_screen || test_page != prim_page) - { - continue; - } - - if (texture->hash == texhash && - texture->texinfo.base == prim->texture.base && - texture->texinfo.width == prim->texture.width && - texture->texinfo.height == prim->texture.height && - ((texture->flags ^ prim->flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) == 0) - { - // Reject a texture if it belongs to an out-of-date render target, so as to cause the HLSL system to re-cache - if (d3d->hlsl->enabled() && prim->texture.width != 0 && prim->texture.height != 0 && (prim->flags & PRIMFLAG_SCREENTEX_MASK) != 0) - { - if (d3d->hlsl->find_render_target(texture) != NULL) - { - return texture; - } - } - else - { - return texture; - } - } - } - - // nothing found, check if we need to unregister something with hlsl - if (d3d->hlsl->enabled()) - { - if (prim->texture.width == 0 || prim->texture.height == 0) - { - return NULL; - } - - UINT32 prim_screen = (UINT32)prim->texture.osddata >> 1; - UINT32 prim_page = (UINT32)prim->texture.osddata & 1; - - for (texture = d3d->texlist; texture != NULL; texture = texture->next) - { - UINT32 test_screen = (UINT32)texture->texinfo.osddata >> 1; - UINT32 test_page = (UINT32)texture->texinfo.osddata & 1; - if (test_screen != prim_screen || test_page != prim_page) - { - continue; - } - - // Clear our old texture reference - if (texture->hash == texhash && - texture->texinfo.base == prim->texture.base && - ((texture->flags ^ prim->flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) == 0 && - (texture->texinfo.width != prim->texture.width || - texture->texinfo.height != prim->texture.height)) - { - d3d->hlsl->remove_render_target(texture); - break; - } - } - } - return NULL; -} - - -//============================================================ -// texture_update -//============================================================ - -static void texture_update(d3d_info *d3d, const render_primitive *prim) -{ - d3d_texture_info *texture = texture_find(d3d, prim); - - // if we didn't find one, create a new texture - if (texture == NULL) - { - texture = texture_create(d3d, &prim->texture, prim->flags); - } - - // if we found it, but with a different seqid, copy the data - if (texture->texinfo.seqid != prim->texture.seqid) - { - texture_set_data(d3d, texture, &prim->texture, prim->flags); - texture->texinfo.seqid = prim->texture.seqid; - } -} - - //============================================================ // d3d_cache_target::~d3d_cache_target //============================================================ diff --git a/src/osd/windows/drawd3d.h b/src/osd/windows/drawd3d.h index a4e3ef40c19..c08f2ff7814 100644 --- a/src/osd/windows/drawd3d.h +++ b/src/osd/windows/drawd3d.h @@ -145,7 +145,7 @@ struct d3d_info bool restarting; // if we're restarting - d3d_texture_info * texlist; // list of active textures + d3d::texture_info * texlist; // list of active textures int dynamic_supported; // are dynamic textures supported? int stretch_supported; // is StretchRect with point filtering supported? int mod2x_supported; // is D3DTOP_MODULATE2X supported? @@ -158,7 +158,7 @@ struct d3d_info DWORD texture_max_width; // texture maximum width DWORD texture_max_height; // texture maximum height - d3d_texture_info * last_texture; // previous texture + d3d::texture_info * last_texture; // previous texture UINT32 last_texture_flags; // previous texture flags int last_blendenable; // previous blendmode int last_blendop; // previous blendmode @@ -169,22 +169,13 @@ struct d3d_info DWORD last_modmode; // previous texture modulation bitmap_argb32 vector_bitmap; // experimental: bitmap for vectors - d3d_texture_info * vector_texture; // experimental: texture for vectors + d3d::texture_info * vector_texture; // experimental: texture for vectors bitmap_rgb32 default_bitmap; // experimental: default bitmap - d3d_texture_info * default_texture; // experimental: default texture + d3d::texture_info * default_texture; // experimental: default texture void * hlsl_buf; // HLSL vertex data hlsl_info * hlsl; // HLSL interface }; - - -//============================================================ -// PROTOTYPES -//============================================================ - -d3d_texture_info *texture_create(d3d_info *d3d, const render_texinfo *texsource, UINT32 flags); -void texture_destroy(d3d_info *d3d, d3d_texture_info *info); - #endif