mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-11-04 12:34:39 +08:00 
			
		
		
		
	gl_backend: Align Pixel Storage
This commit makes sure GL reads on the correct pack size for the respective texture buffer.
This commit is contained in:
		
							parent
							
								
									f14328bf0a
								
							
						
					
					
						commit
						9f16833097
					
				@ -661,8 +661,8 @@ void CachedSurface::FlushGLBuffer() {
 | 
				
			|||||||
    gl_buffer[0].resize(GetSizeInBytes());
 | 
					    gl_buffer[0].resize(GetSizeInBytes());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const FormatTuple& tuple = GetFormatTuple(params.pixel_format, params.component_type);
 | 
					    const FormatTuple& tuple = GetFormatTuple(params.pixel_format, params.component_type);
 | 
				
			||||||
    // Ensure no bad interactions with GL_UNPACK_ALIGNMENT
 | 
					    const u32 align = std::clamp(params.RowAlign(0), 1U, 8U);
 | 
				
			||||||
    ASSERT(params.width * GetBytesPerPixel(params.pixel_format) % 4 == 0);
 | 
					    glPixelStorei(GL_PACK_ALIGNMENT, align);
 | 
				
			||||||
    glPixelStorei(GL_PACK_ROW_LENGTH, static_cast<GLint>(params.width));
 | 
					    glPixelStorei(GL_PACK_ROW_LENGTH, static_cast<GLint>(params.width));
 | 
				
			||||||
    ASSERT(!tuple.compressed);
 | 
					    ASSERT(!tuple.compressed);
 | 
				
			||||||
    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
 | 
					    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
 | 
				
			||||||
@ -707,8 +707,8 @@ void CachedSurface::UploadGLMipmapTexture(u32 mip_map, GLuint read_fb_handle,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    const FormatTuple& tuple = GetFormatTuple(params.pixel_format, params.component_type);
 | 
					    const FormatTuple& tuple = GetFormatTuple(params.pixel_format, params.component_type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Ensure no bad interactions with GL_UNPACK_ALIGNMENT
 | 
					    const u32 align = std::clamp(params.RowAlign(mip_map), 1U, 8U);
 | 
				
			||||||
    ASSERT(params.MipWidth(mip_map) * GetBytesPerPixel(params.pixel_format) % 4 == 0);
 | 
					    glPixelStorei(GL_UNPACK_ALIGNMENT, align);
 | 
				
			||||||
    glPixelStorei(GL_UNPACK_ROW_LENGTH, static_cast<GLint>(params.MipWidth(mip_map)));
 | 
					    glPixelStorei(GL_UNPACK_ROW_LENGTH, static_cast<GLint>(params.MipWidth(mip_map)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const auto image_size = static_cast<GLsizei>(params.GetMipmapSizeGL(mip_map, false));
 | 
					    const auto image_size = static_cast<GLsizei>(params.GetMipmapSizeGL(mip_map, false));
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,7 @@
 | 
				
			|||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "common/alignment.h"
 | 
					#include "common/alignment.h"
 | 
				
			||||||
 | 
					#include "common/bit_util.h"
 | 
				
			||||||
#include "common/common_types.h"
 | 
					#include "common/common_types.h"
 | 
				
			||||||
#include "common/hash.h"
 | 
					#include "common/hash.h"
 | 
				
			||||||
#include "common/math_util.h"
 | 
					#include "common/math_util.h"
 | 
				
			||||||
@ -205,6 +206,13 @@ struct SurfaceParams {
 | 
				
			|||||||
        return bd;
 | 
					        return bd;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    u32 RowAlign(u32 mip_level) const {
 | 
				
			||||||
 | 
					        const u32 m_width = MipWidth(mip_level);
 | 
				
			||||||
 | 
					        const u32 bytes_per_pixel = GetBytesPerPixel(pixel_format);
 | 
				
			||||||
 | 
					        const u32 l2 = Common::CountTrailingZeroes32(m_width * bytes_per_pixel);
 | 
				
			||||||
 | 
					        return (1U << l2);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Creates SurfaceParams from a texture configuration
 | 
					    /// Creates SurfaceParams from a texture configuration
 | 
				
			||||||
    static SurfaceParams CreateForTexture(const Tegra::Texture::FullTextureInfo& config,
 | 
					    static SurfaceParams CreateForTexture(const Tegra::Texture::FullTextureInfo& config,
 | 
				
			||||||
                                          const GLShader::SamplerEntry& entry);
 | 
					                                          const GLShader::SamplerEntry& entry);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user