mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Remove read_framebuffer_handle and draw_framebuffer_handle from CachedSurface
This commit is contained in:
		
							parent
							
								
									1c4d1d1ace
								
							
						
					
					
						commit
						1591fa8d3d
					
				
					 2 changed files with 22 additions and 24 deletions
				
			
		|  | @ -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; | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue