gl_rasterizer: Implement flushing.
This commit is contained in:
		
							parent
							
								
									b4e29ccb81
								
							
						
					
					
						commit
						3afdfd7bfa
					
				@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user