gl_rasterizer: Implement AccelerateDisplay method from Citra.
This commit is contained in:
parent
f61b9f7338
commit
a0b1235f82
2 changed files with 44 additions and 2 deletions
|
@ -229,7 +229,39 @@ bool RasterizerOpenGL::AccelerateFill(const void* config) {
|
||||||
bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& framebuffer,
|
bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& framebuffer,
|
||||||
VAddr framebuffer_addr, u32 pixel_stride,
|
VAddr framebuffer_addr, u32 pixel_stride,
|
||||||
ScreenInfo& screen_info) {
|
ScreenInfo& screen_info) {
|
||||||
ASSERT_MSG(false, "Unimplemented");
|
if (framebuffer_addr == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
MICROPROFILE_SCOPE(OpenGL_CacheManagement);
|
||||||
|
|
||||||
|
SurfaceParams src_params;
|
||||||
|
src_params.addr = framebuffer_addr;
|
||||||
|
src_params.width = std::min(framebuffer.width, pixel_stride);
|
||||||
|
src_params.height = framebuffer.height;
|
||||||
|
src_params.stride = pixel_stride;
|
||||||
|
src_params.is_tiled = false;
|
||||||
|
src_params.pixel_format =
|
||||||
|
SurfaceParams::PixelFormatFromGPUPixelFormat(framebuffer.pixel_format);
|
||||||
|
src_params.UpdateParams();
|
||||||
|
|
||||||
|
MathUtil::Rectangle<u32> src_rect;
|
||||||
|
Surface src_surface;
|
||||||
|
std::tie(src_surface, src_rect) =
|
||||||
|
res_cache.GetSurfaceSubRect(src_params, ScaleMatch::Ignore, true);
|
||||||
|
|
||||||
|
if (src_surface == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 scaled_width = src_surface->GetScaledWidth();
|
||||||
|
u32 scaled_height = src_surface->GetScaledHeight();
|
||||||
|
|
||||||
|
screen_info.display_texcoords = MathUtil::Rectangle<float>(
|
||||||
|
(float)src_rect.bottom / (float)scaled_height, (float)src_rect.left / (float)scaled_width,
|
||||||
|
(float)src_rect.top / (float)scaled_height, (float)src_rect.right / (float)scaled_width);
|
||||||
|
|
||||||
|
screen_info.display_texture = src_surface->texture.handle;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/math_util.h"
|
#include "common/math_util.h"
|
||||||
|
#include "video_core/gpu.h"
|
||||||
#include "video_core/renderer_opengl/gl_resource_manager.h"
|
#include "video_core/renderer_opengl/gl_resource_manager.h"
|
||||||
|
|
||||||
struct CachedSurface;
|
struct CachedSurface;
|
||||||
|
@ -115,6 +116,15 @@ struct SurfaceParams {
|
||||||
return GetFormatBpp(pixel_format);
|
return GetFormatBpp(pixel_format);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PixelFormat PixelFormatFromGPUPixelFormat(Tegra::FramebufferConfig::PixelFormat format) {
|
||||||
|
switch (format) {
|
||||||
|
case Tegra::FramebufferConfig::PixelFormat::ABGR8:
|
||||||
|
return PixelFormat::RGBA8;
|
||||||
|
default:
|
||||||
|
UNREACHABLE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool CheckFormatsBlittable(PixelFormat pixel_format_a, PixelFormat pixel_format_b) {
|
static bool CheckFormatsBlittable(PixelFormat pixel_format_a, PixelFormat pixel_format_b) {
|
||||||
SurfaceType a_type = GetFormatType(pixel_format_a);
|
SurfaceType a_type = GetFormatType(pixel_format_a);
|
||||||
SurfaceType b_type = GetFormatType(pixel_format_b);
|
SurfaceType b_type = GetFormatType(pixel_format_b);
|
||||||
|
@ -257,7 +267,7 @@ struct CachedSurface : SurfaceParams {
|
||||||
std::unique_ptr<u8[]> gl_buffer;
|
std::unique_ptr<u8[]> gl_buffer;
|
||||||
size_t gl_buffer_size = 0;
|
size_t gl_buffer_size = 0;
|
||||||
|
|
||||||
// Read/Write data in 3DS memory to/from gl_buffer
|
// Read/Write data in Switch memory to/from gl_buffer
|
||||||
void LoadGLBuffer(VAddr load_start, VAddr load_end);
|
void LoadGLBuffer(VAddr load_start, VAddr load_end);
|
||||||
void FlushGLBuffer(VAddr flush_start, VAddr flush_end);
|
void FlushGLBuffer(VAddr flush_start, VAddr flush_end);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue