mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 05:21:25 +12:00
109 lines
3.3 KiB
C++
109 lines
3.3 KiB
C++
#include "stdafx.h"
|
|
#include "rsx_utils.h"
|
|
#include "rsx_methods.h"
|
|
#include "Emu/RSX/GCM.h"
|
|
#include "Common/BufferUtils.h"
|
|
#include "Overlays/overlays.h"
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma warning(push, 0)
|
|
#else
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic ignored "-Wall"
|
|
#pragma GCC diagnostic ignored "-Wextra"
|
|
#pragma GCC diagnostic ignored "-Wold-style-cast"
|
|
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
|
#endif
|
|
extern "C"
|
|
{
|
|
#include "libswscale/swscale.h"
|
|
}
|
|
#ifdef _MSC_VER
|
|
#pragma warning(pop)
|
|
#else
|
|
#pragma GCC diagnostic pop
|
|
#endif
|
|
|
|
#include "util/sysinfo.hpp"
|
|
|
|
namespace rsx
|
|
{
|
|
atomic_t<u64> g_rsx_shared_tag{ 0 };
|
|
|
|
void convert_scale_image(u8 *dst, AVPixelFormat dst_format, int dst_width, int dst_height, int dst_pitch,
|
|
const u8 *src, AVPixelFormat src_format, int src_width, int src_height, int src_pitch, int src_slice_h, bool bilinear)
|
|
{
|
|
std::unique_ptr<SwsContext, void(*)(SwsContext*)> sws(sws_getContext(src_width, src_height, src_format,
|
|
dst_width, dst_height, dst_format, bilinear ? SWS_FAST_BILINEAR : SWS_POINT, NULL, NULL, NULL), sws_freeContext);
|
|
|
|
sws_scale(sws.get(), &src, &src_pitch, 0, src_slice_h, &dst, &dst_pitch);
|
|
}
|
|
|
|
void clip_image(u8 *dst, const u8 *src, int clip_x, int clip_y, int clip_w, int clip_h, int bpp, int src_pitch, int dst_pitch)
|
|
{
|
|
const u8* pixels_src = src + clip_y * src_pitch + clip_x * bpp;
|
|
u8 *pixels_dst = dst;
|
|
const u32 row_length = clip_w * bpp;
|
|
|
|
for (int y = 0; y < clip_h; ++y)
|
|
{
|
|
std::memcpy(pixels_dst, pixels_src, row_length);
|
|
pixels_src += src_pitch;
|
|
pixels_dst += dst_pitch;
|
|
}
|
|
}
|
|
|
|
void clip_image_may_overlap(u8 *dst, const u8 *src, int clip_x, int clip_y, int clip_w, int clip_h, int bpp, int src_pitch, int dst_pitch, u8 *buffer)
|
|
{
|
|
src += clip_y * src_pitch + clip_x * bpp;
|
|
|
|
const u32 buffer_pitch = bpp * clip_w;
|
|
u8* buf = buffer;
|
|
|
|
// Read the whole buffer from source
|
|
for (int y = 0; y < clip_h; ++y)
|
|
{
|
|
std::memcpy(buf, src, buffer_pitch);
|
|
src += src_pitch;
|
|
buf += buffer_pitch;
|
|
}
|
|
|
|
buf = buffer;
|
|
|
|
// Write to destination
|
|
for (int y = 0; y < clip_h; ++y)
|
|
{
|
|
std::memcpy(dst, buf, buffer_pitch);
|
|
dst += dst_pitch;
|
|
buf += buffer_pitch;
|
|
}
|
|
}
|
|
|
|
//Convert decoded integer values for CONSTANT_BLEND_FACTOR into f32 array in 0-1 range
|
|
std::array<float, 4> get_constant_blend_colors()
|
|
{
|
|
//TODO: check another color formats (probably all integer formats with > 8-bits wide channels)
|
|
if (rsx::method_registers.surface_color() == rsx::surface_color_format::w16z16y16x16)
|
|
{
|
|
u16 blend_color_r = rsx::method_registers.blend_color_16b_r();
|
|
u16 blend_color_g = rsx::method_registers.blend_color_16b_g();
|
|
u16 blend_color_b = rsx::method_registers.blend_color_16b_b();
|
|
u16 blend_color_a = rsx::method_registers.blend_color_16b_a();
|
|
|
|
return { blend_color_r / 65535.f, blend_color_g / 65535.f, blend_color_b / 65535.f, blend_color_a / 65535.f };
|
|
}
|
|
else
|
|
{
|
|
u8 blend_color_r = rsx::method_registers.blend_color_8b_r();
|
|
u8 blend_color_g = rsx::method_registers.blend_color_8b_g();
|
|
u8 blend_color_b = rsx::method_registers.blend_color_8b_b();
|
|
u8 blend_color_a = rsx::method_registers.blend_color_8b_a();
|
|
|
|
return { blend_color_r / 255.f, blend_color_g / 255.f, blend_color_b / 255.f, blend_color_a / 255.f };
|
|
}
|
|
}
|
|
|
|
#ifdef TEXTURE_CACHE_DEBUG
|
|
tex_cache_checker_t tex_cache_checker = {};
|
|
#endif
|
|
}
|