Remove read_framebuffer_handle and draw_framebuffer_handle from CachedSurface
This commit is contained in:
parent
1c4d1d1ace
commit
1591fa8d3d
|
@ -233,7 +233,7 @@ static void AllocateSurfaceTexture(GLuint texture, const FormatTuple& format_tup
|
||||||
|
|
||||||
static bool BlitTextures(GLuint src_tex, const MathUtil::Rectangle<u32>& src_rect, GLuint dst_tex,
|
static bool BlitTextures(GLuint src_tex, const MathUtil::Rectangle<u32>& src_rect, GLuint dst_tex,
|
||||||
const MathUtil::Rectangle<u32>& dst_rect, SurfaceType type,
|
const MathUtil::Rectangle<u32>& dst_rect, SurfaceType type,
|
||||||
GLuint read_handle, GLuint draw_handle) {
|
GLuint read_fb_handle, GLuint draw_fb_handle) {
|
||||||
OpenGLState state = OpenGLState::GetCurState();
|
OpenGLState state = OpenGLState::GetCurState();
|
||||||
|
|
||||||
OpenGLState prev_state = state;
|
OpenGLState prev_state = state;
|
||||||
|
@ -245,8 +245,8 @@ static bool BlitTextures(GLuint src_tex, const MathUtil::Rectangle<u32>& src_rec
|
||||||
state.ResetTexture(dst_tex);
|
state.ResetTexture(dst_tex);
|
||||||
|
|
||||||
// Keep track of previous framebuffer bindings
|
// Keep track of previous framebuffer bindings
|
||||||
state.draw.read_framebuffer = read_handle;
|
state.draw.read_framebuffer = read_fb_handle;
|
||||||
state.draw.draw_framebuffer = draw_handle;
|
state.draw.draw_framebuffer = draw_fb_handle;
|
||||||
state.Apply();
|
state.Apply();
|
||||||
|
|
||||||
u32 buffers = 0;
|
u32 buffers = 0;
|
||||||
|
@ -293,7 +293,7 @@ static bool BlitTextures(GLuint src_tex, const MathUtil::Rectangle<u32>& src_rec
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool FillSurface(const Surface& surface, const u8* fill_data,
|
static bool FillSurface(const Surface& surface, const u8* fill_data,
|
||||||
const MathUtil::Rectangle<u32>& fill_rect, GLuint draw_handle) {
|
const MathUtil::Rectangle<u32>& fill_rect, GLuint draw_fb_handle) {
|
||||||
OpenGLState state = OpenGLState::GetCurState();
|
OpenGLState state = OpenGLState::GetCurState();
|
||||||
|
|
||||||
OpenGLState prev_state = state;
|
OpenGLState prev_state = state;
|
||||||
|
@ -307,7 +307,7 @@ static bool FillSurface(const Surface& surface, const u8* fill_data,
|
||||||
state.scissor.width = static_cast<GLsizei>(fill_rect.GetWidth());
|
state.scissor.width = static_cast<GLsizei>(fill_rect.GetWidth());
|
||||||
state.scissor.height = static_cast<GLsizei>(fill_rect.GetHeight());
|
state.scissor.height = static_cast<GLsizei>(fill_rect.GetHeight());
|
||||||
|
|
||||||
state.draw.draw_framebuffer = draw_handle;
|
state.draw.draw_framebuffer = draw_fb_handle;
|
||||||
state.Apply();
|
state.Apply();
|
||||||
|
|
||||||
if (surface->type == SurfaceType::Color || surface->type == SurfaceType::Texture) {
|
if (surface->type == SurfaceType::Color || surface->type == SurfaceType::Texture) {
|
||||||
|
@ -723,7 +723,8 @@ void CachedSurface::FlushGLBuffer(PAddr flush_start, PAddr flush_end) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CachedSurface::UploadGLTexture(const MathUtil::Rectangle<u32>& rect) {
|
void CachedSurface::UploadGLTexture(const MathUtil::Rectangle<u32>& rect, GLuint read_fb_handle,
|
||||||
|
GLuint draw_fb_handle) {
|
||||||
if (type == SurfaceType::Fill)
|
if (type == SurfaceType::Fill)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -777,11 +778,12 @@ void CachedSurface::UploadGLTexture(const MathUtil::Rectangle<u32>& rect) {
|
||||||
scaled_rect.bottom *= res_scale;
|
scaled_rect.bottom *= res_scale;
|
||||||
|
|
||||||
BlitTextures(unscaled_tex.handle, {0, rect.GetHeight(), rect.GetWidth(), 0}, texture.handle,
|
BlitTextures(unscaled_tex.handle, {0, rect.GetHeight(), rect.GetWidth(), 0}, texture.handle,
|
||||||
scaled_rect, type, read_framebuffer_handle, draw_framebuffer_handle);
|
scaled_rect, type, read_fb_handle, draw_fb_handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CachedSurface::DownloadGLTexture(const MathUtil::Rectangle<u32>& rect) {
|
void CachedSurface::DownloadGLTexture(const MathUtil::Rectangle<u32>& rect, GLuint read_fb_handle,
|
||||||
|
GLuint draw_fb_handle) {
|
||||||
if (type == SurfaceType::Fill)
|
if (type == SurfaceType::Fill)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -815,7 +817,7 @@ void CachedSurface::DownloadGLTexture(const MathUtil::Rectangle<u32>& rect) {
|
||||||
MathUtil::Rectangle<u32> unscaled_tex_rect{0, rect.GetHeight(), rect.GetWidth(), 0};
|
MathUtil::Rectangle<u32> unscaled_tex_rect{0, rect.GetHeight(), rect.GetWidth(), 0};
|
||||||
AllocateSurfaceTexture(unscaled_tex.handle, tuple, rect.GetWidth(), rect.GetHeight());
|
AllocateSurfaceTexture(unscaled_tex.handle, tuple, rect.GetWidth(), rect.GetHeight());
|
||||||
BlitTextures(texture.handle, scaled_rect, unscaled_tex.handle, unscaled_tex_rect, type,
|
BlitTextures(texture.handle, scaled_rect, unscaled_tex.handle, unscaled_tex_rect, type,
|
||||||
read_framebuffer_handle, draw_framebuffer_handle);
|
read_fb_handle, draw_fb_handle);
|
||||||
|
|
||||||
state.texture_units[0].texture_2d = unscaled_tex.handle;
|
state.texture_units[0].texture_2d = unscaled_tex.handle;
|
||||||
state.Apply();
|
state.Apply();
|
||||||
|
@ -824,7 +826,7 @@ void CachedSurface::DownloadGLTexture(const MathUtil::Rectangle<u32>& rect) {
|
||||||
glGetTexImage(GL_TEXTURE_2D, 0, tuple.format, tuple.type, &gl_buffer[buffer_offset]);
|
glGetTexImage(GL_TEXTURE_2D, 0, tuple.format, tuple.type, &gl_buffer[buffer_offset]);
|
||||||
} else {
|
} else {
|
||||||
state.ResetTexture(texture.handle);
|
state.ResetTexture(texture.handle);
|
||||||
state.draw.read_framebuffer = read_framebuffer_handle;
|
state.draw.read_framebuffer = read_fb_handle;
|
||||||
state.Apply();
|
state.Apply();
|
||||||
|
|
||||||
if (type == SurfaceType::Color || type == SurfaceType::Texture) {
|
if (type == SurfaceType::Color || type == SurfaceType::Texture) {
|
||||||
|
@ -961,8 +963,6 @@ RasterizerCacheOpenGL::~RasterizerCacheOpenGL() {
|
||||||
FlushAll();
|
FlushAll();
|
||||||
while (!surface_cache.empty())
|
while (!surface_cache.empty())
|
||||||
UnregisterSurface(*surface_cache.begin()->second.begin());
|
UnregisterSurface(*surface_cache.begin()->second.begin());
|
||||||
read_framebuffer.Release();
|
|
||||||
draw_framebuffer.Release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RasterizerCacheOpenGL::BlitSurfaces(const Surface& src_surface,
|
bool RasterizerCacheOpenGL::BlitSurfaces(const Surface& src_surface,
|
||||||
|
@ -1205,8 +1205,6 @@ Surface RasterizerCacheOpenGL::GetFillSurface(const GPU::Regs::MemoryFillConfig&
|
||||||
new_surface->size = new_surface->end - new_surface->addr;
|
new_surface->size = new_surface->end - new_surface->addr;
|
||||||
new_surface->type = SurfaceType::Fill;
|
new_surface->type = SurfaceType::Fill;
|
||||||
new_surface->res_scale = std::numeric_limits<u16>::max();
|
new_surface->res_scale = std::numeric_limits<u16>::max();
|
||||||
new_surface->read_framebuffer_handle = read_framebuffer.handle;
|
|
||||||
new_surface->draw_framebuffer_handle = draw_framebuffer.handle;
|
|
||||||
|
|
||||||
std::memcpy(&new_surface->fill_data[0], &config.value_32bit, 4);
|
std::memcpy(&new_surface->fill_data[0], &config.value_32bit, 4);
|
||||||
if (config.fill_32bit) {
|
if (config.fill_32bit) {
|
||||||
|
@ -1300,7 +1298,8 @@ void RasterizerCacheOpenGL::ValidateSurface(const Surface& surface, PAddr addr,
|
||||||
// Load data from 3DS memory
|
// Load data from 3DS memory
|
||||||
FlushRegion(params.addr, params.size);
|
FlushRegion(params.addr, params.size);
|
||||||
surface->LoadGLBuffer(params.addr, params.end);
|
surface->LoadGLBuffer(params.addr, params.end);
|
||||||
surface->UploadGLTexture(surface->GetSubRect(params));
|
surface->UploadGLTexture(surface->GetSubRect(params), read_framebuffer.handle,
|
||||||
|
draw_framebuffer.handle);
|
||||||
surface->invalid_regions.erase(params.GetInterval());
|
surface->invalid_regions.erase(params.GetInterval());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1327,7 +1326,8 @@ void RasterizerCacheOpenGL::FlushRegion(PAddr addr, u32 size, Surface flush_surf
|
||||||
|
|
||||||
if (surface->type != SurfaceType::Fill) {
|
if (surface->type != SurfaceType::Fill) {
|
||||||
SurfaceParams params = surface->FromInterval(interval);
|
SurfaceParams params = surface->FromInterval(interval);
|
||||||
surface->DownloadGLTexture(surface->GetSubRect(params));
|
surface->DownloadGLTexture(surface->GetSubRect(params), read_framebuffer.handle,
|
||||||
|
draw_framebuffer.handle);
|
||||||
}
|
}
|
||||||
surface->FlushGLBuffer(boost::icl::first(interval), boost::icl::last_next(interval));
|
surface->FlushGLBuffer(boost::icl::first(interval), boost::icl::last_next(interval));
|
||||||
flushed_intervals += interval;
|
flushed_intervals += interval;
|
||||||
|
@ -1404,8 +1404,6 @@ void RasterizerCacheOpenGL::InvalidateRegion(PAddr addr, u32 size, const Surface
|
||||||
Surface RasterizerCacheOpenGL::CreateSurface(const SurfaceParams& params) {
|
Surface RasterizerCacheOpenGL::CreateSurface(const SurfaceParams& params) {
|
||||||
Surface surface = std::make_shared<CachedSurface>();
|
Surface surface = std::make_shared<CachedSurface>();
|
||||||
static_cast<SurfaceParams&>(*surface) = params;
|
static_cast<SurfaceParams&>(*surface) = params;
|
||||||
surface->read_framebuffer_handle = read_framebuffer.handle;
|
|
||||||
surface->draw_framebuffer_handle = draw_framebuffer.handle;
|
|
||||||
|
|
||||||
surface->texture.Create();
|
surface->texture.Create();
|
||||||
|
|
||||||
|
|
|
@ -284,16 +284,15 @@ 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;
|
||||||
|
|
||||||
GLuint read_framebuffer_handle;
|
|
||||||
GLuint draw_framebuffer_handle;
|
|
||||||
|
|
||||||
// Read/Write data in 3DS memory to/from gl_buffer
|
// Read/Write data in 3DS memory to/from gl_buffer
|
||||||
void LoadGLBuffer(PAddr load_start, PAddr load_end);
|
void LoadGLBuffer(PAddr load_start, PAddr load_end);
|
||||||
void FlushGLBuffer(PAddr flush_start, PAddr flush_end);
|
void FlushGLBuffer(PAddr flush_start, PAddr flush_end);
|
||||||
|
|
||||||
// Upload/Download data in gl_buffer in/to this surface's texture
|
// Upload/Download data in gl_buffer in/to this surface's texture
|
||||||
void UploadGLTexture(const MathUtil::Rectangle<u32>& rect);
|
void UploadGLTexture(const MathUtil::Rectangle<u32>& rect, GLuint read_fb_handle,
|
||||||
void DownloadGLTexture(const MathUtil::Rectangle<u32>& rect);
|
GLuint draw_fb_handle);
|
||||||
|
void DownloadGLTexture(const MathUtil::Rectangle<u32>& rect, GLuint read_fb_handle,
|
||||||
|
GLuint draw_fb_handle);
|
||||||
};
|
};
|
||||||
|
|
||||||
class RasterizerCacheOpenGL : NonCopyable {
|
class RasterizerCacheOpenGL : NonCopyable {
|
||||||
|
@ -359,9 +358,10 @@ private:
|
||||||
void UpdatePagesCachedCount(PAddr addr, u32 size, int delta);
|
void UpdatePagesCachedCount(PAddr addr, u32 size, int delta);
|
||||||
|
|
||||||
SurfaceCache surface_cache;
|
SurfaceCache surface_cache;
|
||||||
SurfaceMap dirty_regions;
|
|
||||||
PageMap cached_pages;
|
PageMap cached_pages;
|
||||||
|
SurfaceMap dirty_regions;
|
||||||
SurfaceSet remove_surfaces;
|
SurfaceSet remove_surfaces;
|
||||||
|
|
||||||
OGLFramebuffer read_framebuffer;
|
OGLFramebuffer read_framebuffer;
|
||||||
OGLFramebuffer draw_framebuffer;
|
OGLFramebuffer draw_framebuffer;
|
||||||
};
|
};
|
||||||
|
|
Reference in New Issue