void quad_setup_data::compute(const render_primitive &prim, const int prescale) { const render_quad_texuv *texcoords = &prim.texcoords; int texwidth = prim.texture.width; int texheight = prim.texture.height; float fdudx, fdvdx, fdudy, fdvdy; float width, height; float fscale; /* determine U/V deltas */ if ((PRIMFLAG_GET_SCREENTEX(prim.flags))) fscale = (float) prescale; else fscale = 1.0f; fdudx = (texcoords->tr.u - texcoords->tl.u); // a a11 fdvdx = (texcoords->tr.v - texcoords->tl.v); // c a21 fdudy = (texcoords->bl.u - texcoords->tl.u); // b a12 fdvdy = (texcoords->bl.v - texcoords->tl.v); // d a22 width = fabsf(( fdudx * (float) (texwidth) + fdvdx * (float) (texheight)) ) * fscale; height = fabsf((fdudy * (float) (texwidth) + fdvdy * (float) (texheight)) ) * fscale; fdudx = signf(fdudx) / fscale; fdvdy = signf(fdvdy) / fscale; fdvdx = signf(fdvdx) / fscale; fdudy = signf(fdudy) / fscale; #if 0 printf("tl.u %f tl.v %f\n", texcoords->tl.u, texcoords->tl.v); printf("tr.u %f tr.v %f\n", texcoords->tr.u, texcoords->tr.v); printf("bl.u %f bl.v %f\n", texcoords->bl.u, texcoords->bl.v); printf("br.u %f br.v %f\n", texcoords->br.u, texcoords->br.v); /* compute start and delta U,V coordinates now */ #endif dudx = round_nearest(65536.0f * fdudx); dvdx = round_nearest(65536.0f * fdvdx); dudy = round_nearest(65536.0f * fdudy); dvdy = round_nearest(65536.0f * fdvdy); startu = round_nearest(65536.0f * (float) texwidth * texcoords->tl.u); startv = round_nearest(65536.0f * (float) texheight * texcoords->tl.v); /* clamp to integers */ rotwidth = round_nearest(width); rotheight = round_nearest(height); //printf("%d %d rot %d %d\n", texwidth, texheight, rotwidth, rotheight); startu += (dudx + dudy) / 2; startv += (dvdx + dvdy) / 2; }
INLINE void render_quad(sdl_info *sdl, texture_info *texture, render_primitive *prim, int x, int y) { SDL_Texture *texture_id; SDL_Rect target_rect; target_rect.x = x; target_rect.y = y; target_rect.w = round_nearest(prim->bounds.x1 - prim->bounds.x0); target_rect.h = round_nearest(prim->bounds.y1 - prim->bounds.y0); if (texture) { texture_id = texture->texture_id; texture->copyinfo->time -= osd_ticks(); #if 0 if ((PRIMFLAG_GET_SCREENTEX(prim->flags)) && video_config.filter) { SDL_SetTextureScaleMode(texture->texture_id, DRAW2_SCALEMODE_BEST); } else { SDL_SetTextureScaleMode(texture->texture_id, DRAW2_SCALEMODE_NEAREST); } #endif SDL_SetTextureBlendMode(texture_id, texture->sdl_blendmode); set_coloralphamode(texture_id, &prim->color); SDL_RenderCopy(sdl->sdl_renderer, texture_id, NULL, &target_rect); texture->copyinfo->time += osd_ticks(); texture->copyinfo->pixel_count += MAX(STAT_PIXEL_THRESHOLD , (texture->rawwidth * texture->rawheight)); if (sdl->last_blit_pixels) { texture->copyinfo->time += (sdl->last_blit_time * (INT64) (texture->rawwidth * texture->rawheight)) / (INT64) sdl->last_blit_pixels; } texture->copyinfo->samples++; texture->copyinfo->perf = ( texture->copyinfo->pixel_count * (osd_ticks_per_second()/1000)) / texture->copyinfo->time; } else { UINT32 sr = (UINT32)(255.0f * prim->color.r); UINT32 sg = (UINT32)(255.0f * prim->color.g); UINT32 sb = (UINT32)(255.0f * prim->color.b); UINT32 sa = (UINT32)(255.0f * prim->color.a); SDL_SetRenderDrawBlendMode(sdl->sdl_renderer, map_blendmode(PRIMFLAG_GET_BLENDMODE(prim->flags))); SDL_SetRenderDrawColor(sdl->sdl_renderer, sr, sg, sb, sa); SDL_RenderFillRect(sdl->sdl_renderer, &target_rect); } }
static void compute_setup(sdl_info *sdl, const render_primitive *prim, quad_setup_data *setup, int flags) { const render_quad_texuv *texcoords = &prim->texcoords; int texwidth = prim->texture.width; int texheight = prim->texture.height; float fdudx, fdvdx, fdudy, fdvdy; float width, height; float fscale; /* determine U/V deltas */ if ((PRIMFLAG_GET_SCREENTEX(flags))) fscale = (float) video_config.prescale; else fscale = 1.0f; fdudx = (texcoords->tr.u - texcoords->tl.u) / fscale; // a a11 fdvdx = (texcoords->tr.v - texcoords->tl.v) / fscale; // c a21 fdudy = (texcoords->bl.u - texcoords->tl.u) / fscale; // b a12 fdvdy = (texcoords->bl.v - texcoords->tl.v) / fscale; // d a22 /* compute start and delta U,V coordinates now */ setup->dudx = round_nearest(65536.0f * fdudx); setup->dvdx = round_nearest(65536.0f * fdvdx); setup->dudy = round_nearest(65536.0f * fdudy); setup->dvdy = round_nearest(65536.0f * fdvdy); setup->startu = round_nearest(65536.0f * (float) texwidth * texcoords->tl.u); setup->startv = round_nearest(65536.0f * (float) texheight * texcoords->tl.v); /* clamp to integers */ width = fabs((fdudx * (float) (texwidth) + fdvdx * (float) (texheight)) * fscale * fscale); height = fabs((fdudy * (float)(texwidth) + fdvdy * (float) (texheight)) * fscale * fscale); setup->rotwidth = width; setup->rotheight = height; setup->startu += (setup->dudx + setup->dudy) / 2; setup->startv += (setup->dvdx + setup->dvdy) / 2; }
void renderer_bgfx::render_textured_quad(int view, render_primitive* prim, bgfx::TransientVertexBuffer* buffer) { ScreenVertex* vertex = (ScreenVertex*)buffer->data; UINT32 rgba = u32Color(prim->color.r * 255, prim->color.g * 255, prim->color.b * 255, prim->color.a * 255); vertex[0].m_x = prim->bounds.x0; vertex[0].m_y = prim->bounds.y0; vertex[0].m_z = 0; vertex[0].m_rgba = rgba; vertex[0].m_u = prim->texcoords.tl.u; vertex[0].m_v = prim->texcoords.tl.v; vertex[1].m_x = prim->bounds.x1; vertex[1].m_y = prim->bounds.y0; vertex[1].m_z = 0; vertex[1].m_rgba = rgba; vertex[1].m_u = prim->texcoords.tr.u; vertex[1].m_v = prim->texcoords.tr.v; vertex[2].m_x = prim->bounds.x1; vertex[2].m_y = prim->bounds.y1; vertex[2].m_z = 0; vertex[2].m_rgba = rgba; vertex[2].m_u = prim->texcoords.br.u; vertex[2].m_v = prim->texcoords.br.v; vertex[3].m_x = prim->bounds.x1; vertex[3].m_y = prim->bounds.y1; vertex[3].m_z = 0; vertex[3].m_rgba = rgba; vertex[3].m_u = prim->texcoords.br.u; vertex[3].m_v = prim->texcoords.br.v; vertex[4].m_x = prim->bounds.x0; vertex[4].m_y = prim->bounds.y1; vertex[4].m_z = 0; vertex[4].m_rgba = rgba; vertex[4].m_u = prim->texcoords.bl.u; vertex[4].m_v = prim->texcoords.bl.v; vertex[5].m_x = prim->bounds.x0; vertex[5].m_y = prim->bounds.y0; vertex[5].m_z = 0; vertex[5].m_rgba = rgba; vertex[5].m_u = prim->texcoords.tl.u; vertex[5].m_v = prim->texcoords.tl.v; bgfx::setVertexBuffer(buffer); uint32_t texture_flags = BGFX_TEXTURE_U_CLAMP | BGFX_TEXTURE_V_CLAMP; if (video_config.filter == 0) { texture_flags |= BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MAG_POINT | BGFX_TEXTURE_MIP_POINT; } const bgfx::Memory* mem = mame_texture_data_to_bgfx_texture_data(prim->flags & PRIMFLAG_TEXFORMAT_MASK, prim->texture.width, prim->texture.height, prim->texture.rowpixels, prim->texture.palette, prim->texture.base); bgfx::TextureHandle texture = bgfx::createTexture2D((uint16_t)prim->texture.width, (uint16_t)prim->texture.height, 1, bgfx::TextureFormat::RGBA8, texture_flags, mem); bgfx_effect** effects = PRIMFLAG_GET_SCREENTEX(prim->flags) ? m_screen_effect : m_gui_effect; UINT32 blend = PRIMFLAG_GET_BLENDMODE(prim->flags); bgfx::setTexture(0, effects[blend]->uniform("s_tex")->handle(), texture); effects[blend]->submit(view); bgfx::destroyTexture(texture); }