gl_rasterizer: Implement flushing.
This commit is contained in:
		| @@ -424,6 +424,13 @@ void RasterizerOpenGL::ConfigureFramebuffers(bool using_color_fb, bool using_dep | ||||
|             // Used when just a single color attachment is enabled, e.g. for clearing a color buffer | ||||
|             Surface color_surface = | ||||
|                 res_cache.GetColorBufferSurface(*single_color_target, preserve_contents); | ||||
|  | ||||
|             if (color_surface) { | ||||
|                 // Assume that a surface will be written to if it is used as a framebuffer, even if | ||||
|                 // the shader doesn't actually write to it. | ||||
|                 color_surface->MarkAsDirty(); | ||||
|             } | ||||
|  | ||||
|             glFramebufferTexture2D( | ||||
|                 GL_DRAW_FRAMEBUFFER, | ||||
|                 GL_COLOR_ATTACHMENT0 + static_cast<GLenum>(*single_color_target), GL_TEXTURE_2D, | ||||
| @@ -434,6 +441,13 @@ void RasterizerOpenGL::ConfigureFramebuffers(bool using_color_fb, bool using_dep | ||||
|             std::array<GLenum, Maxwell::NumRenderTargets> buffers; | ||||
|             for (std::size_t index = 0; index < Maxwell::NumRenderTargets; ++index) { | ||||
|                 Surface color_surface = res_cache.GetColorBufferSurface(index, preserve_contents); | ||||
|  | ||||
|                 if (color_surface) { | ||||
|                     // Assume that a surface will be written to if it is used as a framebuffer, even | ||||
|                     // if the shader doesn't actually write to it. | ||||
|                     color_surface->MarkAsDirty(); | ||||
|                 } | ||||
|  | ||||
|                 buffers[index] = GL_COLOR_ATTACHMENT0 + regs.rt_control.GetMap(index); | ||||
|                 glFramebufferTexture2D( | ||||
|                     GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + static_cast<GLenum>(index), | ||||
| @@ -453,6 +467,10 @@ void RasterizerOpenGL::ConfigureFramebuffers(bool using_color_fb, bool using_dep | ||||
|     } | ||||
|  | ||||
|     if (depth_surface) { | ||||
|         // Assume that a surface will be written to if it is used as a framebuffer, even if | ||||
|         // the shader doesn't actually write to it. | ||||
|         depth_surface->MarkAsDirty(); | ||||
|  | ||||
|         if (regs.stencil_enable) { | ||||
|             // Attach both depth and stencil | ||||
|             glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, | ||||
| @@ -617,7 +635,12 @@ void RasterizerOpenGL::DrawArrays() { | ||||
|  | ||||
| void RasterizerOpenGL::FlushAll() {} | ||||
|  | ||||
| void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) {} | ||||
| void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) { | ||||
|     MICROPROFILE_SCOPE(OpenGL_CacheManagement); | ||||
|     res_cache.FlushRegion(addr, size); | ||||
|     shader_cache.FlushRegion(addr, size); | ||||
|     buffer_cache.FlushRegion(addr, size); | ||||
| } | ||||
|  | ||||
| void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size) { | ||||
|     MICROPROFILE_SCOPE(OpenGL_CacheManagement); | ||||
| @@ -627,6 +650,7 @@ void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size) { | ||||
| } | ||||
|  | ||||
| void RasterizerOpenGL::FlushAndInvalidateRegion(VAddr addr, u64 size) { | ||||
|     FlushRegion(addr, size); | ||||
|     InvalidateRegion(addr, size); | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei