texture_info::texture_info(renderer_sdl2 *renderer, const render_texinfo &texsource, const quad_setup_data &setup, UINT32 flags) { // fill in the core data m_renderer = renderer; m_hash = texture_compute_hash(texsource, flags); m_flags = flags; m_texinfo = texsource; m_texinfo.seqid = -1; // force set data m_is_rotated = false; m_setup = setup; m_sdl_blendmode = map_blendmode(PRIMFLAG_GET_BLENDMODE(flags)); m_pitch = 0; switch (PRIMFLAG_GET_TEXFORMAT(flags)) { case TEXFORMAT_ARGB32: m_format = SDL_TEXFORMAT_ARGB32; break; case TEXFORMAT_RGB32: m_format = texsource.palette ? SDL_TEXFORMAT_RGB32_PALETTED : SDL_TEXFORMAT_RGB32; break; case TEXFORMAT_PALETTE16: m_format = SDL_TEXFORMAT_PALETTE16; break; case TEXFORMAT_PALETTEA16: m_format = SDL_TEXFORMAT_PALETTE16A; break; case TEXFORMAT_YUY16: m_format = texsource.palette ? SDL_TEXFORMAT_YUY16_PALETTED : SDL_TEXFORMAT_YUY16; break; default: osd_printf_error("Unknown textureformat %d\n", PRIMFLAG_GET_TEXFORMAT(flags)); } if (setup.rotwidth != m_texinfo.width || setup.rotheight != m_texinfo.height || setup.dudx < 0 || setup.dvdy < 0 || (PRIMFLAG_GET_TEXORIENT(flags) != 0)) m_is_rotated = true; else m_is_rotated = false; //m_sdl_access = SDL_TEXTUREACCESS_STATIC; m_sdl_access = SDL_TEXTUREACCESS_STREAMING; // Watch out for 0x0 textures ... if (!m_setup.rotwidth || !m_setup.rotheight) osd_printf_warning("Trying to create texture with zero dim\n"); // set copy_info m_copyinfo = compute_size_type(); m_texture_id = SDL_CreateTexture(m_renderer->m_sdl_renderer, m_copyinfo->dst_fmt, m_sdl_access, m_setup.rotwidth, m_setup.rotheight); if (!m_texture_id) osd_printf_error("Error creating texture: %d x %d, pixelformat %s error: %s\n", m_setup.rotwidth, m_setup.rotheight, m_copyinfo->dstname, SDL_GetError()); if (m_sdl_access == SDL_TEXTUREACCESS_STATIC) { if (m_copyinfo->blitter->m_is_passthrough) m_pixels = nullptr; else m_pixels = malloc(m_setup.rotwidth * m_setup.rotheight * m_copyinfo->blitter->m_dest_bpp); } m_last_access = osd_ticks(); }
void renderer_bgfx::put_packed_quad(render_primitive *prim, UINT32 hash, ScreenVertex* vertex) { rectangle_packer::packed_rectangle& rect = m_hash_to_entry[hash]; float u0 = float(rect.x()) / float(CACHE_SIZE); float v0 = float(rect.y()) / float(CACHE_SIZE); float u1 = u0 + float(rect.width()) / float(CACHE_SIZE); float v1 = v0 + float(rect.height()) / float(CACHE_SIZE); u1 -= 0.5f / float(CACHE_SIZE); v1 -= 0.5f / float(CACHE_SIZE); u0 += 0.5f / float(CACHE_SIZE); v0 += 0.5f / float(CACHE_SIZE); UINT32 rgba = u32Color(prim->color.r * 255, prim->color.g * 255, prim->color.b * 255, prim->color.a * 255); float x[4] = { prim->bounds.x0, prim->bounds.x1, prim->bounds.x0, prim->bounds.x1 }; float y[4] = { prim->bounds.y0, prim->bounds.y0, prim->bounds.y1, prim->bounds.y1 }; float u[4] = { u0, u1, u0, u1 }; float v[4] = { v0, v0, v1, v1 }; if (PRIMFLAG_GET_TEXORIENT(prim->flags) & ORIENTATION_SWAP_XY) { std::swap(u[1], u[2]); std::swap(v[1], v[2]); } if (PRIMFLAG_GET_TEXORIENT(prim->flags) & ORIENTATION_FLIP_X) { std::swap(u[0], u[1]); std::swap(v[0], v[1]); std::swap(u[2], u[3]); std::swap(v[2], v[3]); } if (PRIMFLAG_GET_TEXORIENT(prim->flags) & ORIENTATION_FLIP_Y) { std::swap(u[0], u[2]); std::swap(v[0], v[2]); std::swap(u[1], u[3]); std::swap(v[1], v[3]); } vertex[0].m_x = x[0]; // 0 vertex[0].m_y = y[0]; vertex[0].m_z = 0; vertex[0].m_rgba = rgba; vertex[0].m_u = u[0]; vertex[0].m_v = v[0]; vertex[1].m_x = x[1]; // 1 vertex[1].m_y = y[1]; vertex[1].m_z = 0; vertex[1].m_rgba = rgba; vertex[1].m_u = u[1]; vertex[1].m_v = v[1]; vertex[2].m_x = x[3]; // 3 vertex[2].m_y = y[3]; vertex[2].m_z = 0; vertex[2].m_rgba = rgba; vertex[2].m_u = u[3]; vertex[2].m_v = v[3]; vertex[3].m_x = x[3]; // 3 vertex[3].m_y = y[3]; vertex[3].m_z = 0; vertex[3].m_rgba = rgba; vertex[3].m_u = u[3]; vertex[3].m_v = v[3]; vertex[4].m_x = x[2]; // 2 vertex[4].m_y = y[2]; vertex[4].m_z = 0; vertex[4].m_rgba = rgba; vertex[4].m_u = u[2]; vertex[4].m_v = v[2]; vertex[5].m_x = x[0]; // 0 vertex[5].m_y = y[0]; vertex[5].m_z = 0; vertex[5].m_rgba = rgba; vertex[5].m_u = u[0]; vertex[5].m_v = v[0]; }