mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 08:59:03 -06:00 
			
		
		
		
	gl_state: Remove image tracking
This commit is contained in:
		@@ -633,7 +633,6 @@ void RasterizerOpenGL::DispatchCompute(GPUVAddr code_addr) {
 | 
			
		||||
    bind_ubo_pushbuffer.Bind();
 | 
			
		||||
    bind_ssbo_pushbuffer.Bind();
 | 
			
		||||
 | 
			
		||||
    state.ApplyImages();
 | 
			
		||||
    state.ApplyShaderProgram();
 | 
			
		||||
    state.ApplyProgramPipeline();
 | 
			
		||||
 | 
			
		||||
@@ -899,7 +898,7 @@ void RasterizerOpenGL::SetupImage(u32 binding, const Tegra::Texture::TICEntry& t
 | 
			
		||||
                                  const GLShader::ImageEntry& entry) {
 | 
			
		||||
    const auto view = texture_cache.GetImageSurface(tic, entry);
 | 
			
		||||
    if (!view) {
 | 
			
		||||
        state.images[binding] = 0;
 | 
			
		||||
        glBindImageTexture(binding, 0, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R8);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    if (!tic.IsBuffer()) {
 | 
			
		||||
@@ -908,7 +907,8 @@ void RasterizerOpenGL::SetupImage(u32 binding, const Tegra::Texture::TICEntry& t
 | 
			
		||||
    if (entry.IsWritten()) {
 | 
			
		||||
        view->MarkAsModified(texture_cache.Tick());
 | 
			
		||||
    }
 | 
			
		||||
    state.images[binding] = view->GetTexture();
 | 
			
		||||
    glBindImageTexture(binding, view->GetTexture(), 0, GL_TRUE, 0, GL_READ_WRITE,
 | 
			
		||||
                       view->GetFormat());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerOpenGL::SyncViewport() {
 | 
			
		||||
 
 | 
			
		||||
@@ -113,18 +113,11 @@ void OpenGLState::ApplyRenderBuffer() {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGLState::ApplyImages() {
 | 
			
		||||
    if (const auto update = UpdateArray(cur_state.images, images)) {
 | 
			
		||||
        glBindImageTextures(update->first, update->second, images.data() + update->first);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGLState::Apply() {
 | 
			
		||||
    MICROPROFILE_SCOPE(OpenGL_State);
 | 
			
		||||
    ApplyFramebufferState();
 | 
			
		||||
    ApplyShaderProgram();
 | 
			
		||||
    ApplyProgramPipeline();
 | 
			
		||||
    ApplyImages();
 | 
			
		||||
    ApplyRenderBuffer();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,9 +13,6 @@ namespace OpenGL {
 | 
			
		||||
 | 
			
		||||
class OpenGLState {
 | 
			
		||||
public:
 | 
			
		||||
    static constexpr std::size_t NumImages = 8 * 5;
 | 
			
		||||
    std::array<GLuint, NumImages> images = {};
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        GLuint read_framebuffer = 0; // GL_READ_FRAMEBUFFER_BINDING
 | 
			
		||||
        GLuint draw_framebuffer = 0; // GL_DRAW_FRAMEBUFFER_BINDING
 | 
			
		||||
@@ -38,7 +35,6 @@ public:
 | 
			
		||||
    void ApplyFramebufferState();
 | 
			
		||||
    void ApplyShaderProgram();
 | 
			
		||||
    void ApplyProgramPipeline();
 | 
			
		||||
    void ApplyImages();
 | 
			
		||||
    void ApplyRenderBuffer();
 | 
			
		||||
 | 
			
		||||
    /// Resets any references to the given resource
 | 
			
		||||
 
 | 
			
		||||
@@ -397,6 +397,7 @@ CachedSurfaceView::CachedSurfaceView(CachedSurface& surface, const ViewParams& p
 | 
			
		||||
                                     const bool is_proxy)
 | 
			
		||||
    : VideoCommon::ViewBase(params), surface{surface}, is_proxy{is_proxy} {
 | 
			
		||||
    target = GetTextureTarget(params.target);
 | 
			
		||||
    format = GetFormatTuple(surface.GetSurfaceParams().pixel_format).internal_format;
 | 
			
		||||
    if (!is_proxy) {
 | 
			
		||||
        texture_view = CreateTextureView();
 | 
			
		||||
    }
 | 
			
		||||
@@ -467,17 +468,12 @@ void CachedSurfaceView::ApplySwizzle(SwizzleSource x_source, SwizzleSource y_sou
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
OGLTextureView CachedSurfaceView::CreateTextureView() const {
 | 
			
		||||
    const auto& owner_params = surface.GetSurfaceParams();
 | 
			
		||||
    OGLTextureView texture_view;
 | 
			
		||||
    texture_view.Create();
 | 
			
		||||
 | 
			
		||||
    const GLuint handle{texture_view.handle};
 | 
			
		||||
    const FormatTuple& tuple{GetFormatTuple(owner_params.pixel_format)};
 | 
			
		||||
 | 
			
		||||
    glTextureView(handle, target, surface.texture.handle, tuple.internal_format, params.base_level,
 | 
			
		||||
    glTextureView(texture_view.handle, target, surface.texture.handle, format, params.base_level,
 | 
			
		||||
                  params.num_levels, params.base_layer, params.num_layers);
 | 
			
		||||
 | 
			
		||||
    ApplyTextureDefaults(owner_params, handle);
 | 
			
		||||
    ApplyTextureDefaults(surface.GetSurfaceParams(), texture_view.handle);
 | 
			
		||||
 | 
			
		||||
    return texture_view;
 | 
			
		||||
}
 | 
			
		||||
@@ -521,9 +517,7 @@ void TextureCacheOpenGL::ImageBlit(View& src_view, View& dst_view,
 | 
			
		||||
    const auto& dst_params{dst_view->GetSurfaceParams()};
 | 
			
		||||
 | 
			
		||||
    OpenGLState prev_state{OpenGLState::GetCurState()};
 | 
			
		||||
    SCOPE_EXIT({
 | 
			
		||||
        prev_state.Apply();
 | 
			
		||||
    });
 | 
			
		||||
    SCOPE_EXIT({ prev_state.Apply(); });
 | 
			
		||||
 | 
			
		||||
    OpenGLState state;
 | 
			
		||||
    state.draw.read_framebuffer = src_framebuffer.handle;
 | 
			
		||||
 
 | 
			
		||||
@@ -96,6 +96,10 @@ public:
 | 
			
		||||
        return texture_view.handle;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    GLenum GetFormat() const {
 | 
			
		||||
        return format;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const SurfaceParams& GetSurfaceParams() const {
 | 
			
		||||
        return surface.GetSurfaceParams();
 | 
			
		||||
    }
 | 
			
		||||
@@ -113,6 +117,7 @@ private:
 | 
			
		||||
 | 
			
		||||
    CachedSurface& surface;
 | 
			
		||||
    GLenum target{};
 | 
			
		||||
    GLenum format{};
 | 
			
		||||
 | 
			
		||||
    OGLTextureView texture_view;
 | 
			
		||||
    u32 swizzle{};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user