gl_state: Keep track of texture target.
This commit is contained in:
		
							parent
							
								
									460ebc8187
								
							
						
					
					
						commit
						b56e5edafc
					
				@ -692,14 +692,14 @@ u32 RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, Shader& shader,
 | 
			
		||||
        const auto texture = maxwell3d.GetStageTexture(entry.GetStage(), entry.GetOffset());
 | 
			
		||||
 | 
			
		||||
        if (!texture.enabled) {
 | 
			
		||||
            state.texture_units[current_bindpoint].texture_2d = 0;
 | 
			
		||||
            state.texture_units[current_bindpoint].texture = 0;
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        texture_samplers[current_bindpoint].SyncWithConfig(texture.tsc);
 | 
			
		||||
        Surface surface = res_cache.GetTextureSurface(texture);
 | 
			
		||||
        if (surface != nullptr) {
 | 
			
		||||
            state.texture_units[current_bindpoint].texture_2d = surface->Texture().handle;
 | 
			
		||||
            state.texture_units[current_bindpoint].texture = surface->Texture().handle;
 | 
			
		||||
            state.texture_units[current_bindpoint].swizzle.r =
 | 
			
		||||
                MaxwellToGL::SwizzleSource(texture.tic.x_source);
 | 
			
		||||
            state.texture_units[current_bindpoint].swizzle.g =
 | 
			
		||||
@ -710,7 +710,7 @@ u32 RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, Shader& shader,
 | 
			
		||||
                MaxwellToGL::SwizzleSource(texture.tic.w_source);
 | 
			
		||||
        } else {
 | 
			
		||||
            // Can occur when texture addr is null or its memory is unmapped/invalid
 | 
			
		||||
            state.texture_units[current_bindpoint].texture_2d = 0;
 | 
			
		||||
            state.texture_units[current_bindpoint].texture = 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -363,8 +363,8 @@ static void AllocateSurfaceTexture(GLuint texture, const FormatTuple& format_tup
 | 
			
		||||
    OpenGLState cur_state = OpenGLState::GetCurState();
 | 
			
		||||
 | 
			
		||||
    // Keep track of previous texture bindings
 | 
			
		||||
    GLuint old_tex = cur_state.texture_units[0].texture_2d;
 | 
			
		||||
    cur_state.texture_units[0].texture_2d = texture;
 | 
			
		||||
    GLuint old_tex = cur_state.texture_units[0].texture;
 | 
			
		||||
    cur_state.texture_units[0].texture = texture;
 | 
			
		||||
    cur_state.Apply();
 | 
			
		||||
    glActiveTexture(GL_TEXTURE0);
 | 
			
		||||
 | 
			
		||||
@ -380,7 +380,7 @@ static void AllocateSurfaceTexture(GLuint texture, const FormatTuple& format_tup
 | 
			
		||||
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 | 
			
		||||
 | 
			
		||||
    // Restore previous texture bindings
 | 
			
		||||
    cur_state.texture_units[0].texture_2d = old_tex;
 | 
			
		||||
    cur_state.texture_units[0].texture = old_tex;
 | 
			
		||||
    cur_state.Apply();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -600,8 +600,8 @@ void CachedSurface::UploadGLTexture(GLuint read_fb_handle, GLuint draw_fb_handle
 | 
			
		||||
    GLuint target_tex = texture.handle;
 | 
			
		||||
    OpenGLState cur_state = OpenGLState::GetCurState();
 | 
			
		||||
 | 
			
		||||
    GLuint old_tex = cur_state.texture_units[0].texture_2d;
 | 
			
		||||
    cur_state.texture_units[0].texture_2d = target_tex;
 | 
			
		||||
    GLuint old_tex = cur_state.texture_units[0].texture;
 | 
			
		||||
    cur_state.texture_units[0].texture = target_tex;
 | 
			
		||||
    cur_state.Apply();
 | 
			
		||||
 | 
			
		||||
    // Ensure no bad interactions with GL_UNPACK_ALIGNMENT
 | 
			
		||||
@ -622,7 +622,7 @@ void CachedSurface::UploadGLTexture(GLuint read_fb_handle, GLuint draw_fb_handle
 | 
			
		||||
 | 
			
		||||
    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
 | 
			
		||||
 | 
			
		||||
    cur_state.texture_units[0].texture_2d = old_tex;
 | 
			
		||||
    cur_state.texture_units[0].texture = old_tex;
 | 
			
		||||
    cur_state.Apply();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -200,9 +200,9 @@ void OpenGLState::Apply() const {
 | 
			
		||||
        const auto& texture_unit = texture_units[i];
 | 
			
		||||
        const auto& cur_state_texture_unit = cur_state.texture_units[i];
 | 
			
		||||
 | 
			
		||||
        if (texture_unit.texture_2d != cur_state_texture_unit.texture_2d) {
 | 
			
		||||
        if (texture_unit.texture != cur_state_texture_unit.texture) {
 | 
			
		||||
            glActiveTexture(TextureUnits::MaxwellTexture(static_cast<int>(i)).Enum());
 | 
			
		||||
            glBindTexture(GL_TEXTURE_2D, texture_unit.texture_2d);
 | 
			
		||||
            glBindTexture(texture_unit.target, texture_unit.texture);
 | 
			
		||||
        }
 | 
			
		||||
        if (texture_unit.sampler != cur_state_texture_unit.sampler) {
 | 
			
		||||
            glBindSampler(static_cast<GLuint>(i), texture_unit.sampler);
 | 
			
		||||
@ -214,7 +214,7 @@ void OpenGLState::Apply() const {
 | 
			
		||||
            texture_unit.swizzle.a != cur_state_texture_unit.swizzle.a) {
 | 
			
		||||
            std::array<GLint, 4> mask = {texture_unit.swizzle.r, texture_unit.swizzle.g,
 | 
			
		||||
                                         texture_unit.swizzle.b, texture_unit.swizzle.a};
 | 
			
		||||
            glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask.data());
 | 
			
		||||
            glTexParameteriv(texture_unit.target, GL_TEXTURE_SWIZZLE_RGBA, mask.data());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -287,7 +287,7 @@ void OpenGLState::Apply() const {
 | 
			
		||||
 | 
			
		||||
OpenGLState& OpenGLState::UnbindTexture(GLuint handle) {
 | 
			
		||||
    for (auto& unit : texture_units) {
 | 
			
		||||
        if (unit.texture_2d == handle) {
 | 
			
		||||
        if (unit.texture == handle) {
 | 
			
		||||
            unit.Unbind();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -94,8 +94,9 @@ public:
 | 
			
		||||
 | 
			
		||||
    // 3 texture units - one for each that is used in PICA fragment shader emulation
 | 
			
		||||
    struct TextureUnit {
 | 
			
		||||
        GLuint texture_2d; // GL_TEXTURE_BINDING_2D
 | 
			
		||||
        GLuint sampler;    // GL_SAMPLER_BINDING
 | 
			
		||||
        GLuint texture; // GL_TEXTURE_BINDING_2D
 | 
			
		||||
        GLuint sampler; // GL_SAMPLER_BINDING
 | 
			
		||||
        GLenum target;
 | 
			
		||||
        struct {
 | 
			
		||||
            GLint r; // GL_TEXTURE_SWIZZLE_R
 | 
			
		||||
            GLint g; // GL_TEXTURE_SWIZZLE_G
 | 
			
		||||
@ -104,7 +105,7 @@ public:
 | 
			
		||||
        } swizzle;
 | 
			
		||||
 | 
			
		||||
        void Unbind() {
 | 
			
		||||
            texture_2d = 0;
 | 
			
		||||
            texture = 0;
 | 
			
		||||
            swizzle.r = GL_RED;
 | 
			
		||||
            swizzle.g = GL_GREEN;
 | 
			
		||||
            swizzle.b = GL_BLUE;
 | 
			
		||||
@ -114,6 +115,7 @@ public:
 | 
			
		||||
        void Reset() {
 | 
			
		||||
            Unbind();
 | 
			
		||||
            sampler = 0;
 | 
			
		||||
            target = GL_TEXTURE_2D;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    std::array<TextureUnit, 32> texture_units;
 | 
			
		||||
 | 
			
		||||
@ -177,7 +177,7 @@ void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuf
 | 
			
		||||
                                       Memory::GetPointer(framebuffer_addr),
 | 
			
		||||
                                       gl_framebuffer_data.data(), true);
 | 
			
		||||
 | 
			
		||||
        state.texture_units[0].texture_2d = screen_info.texture.resource.handle;
 | 
			
		||||
        state.texture_units[0].texture = screen_info.texture.resource.handle;
 | 
			
		||||
        state.Apply();
 | 
			
		||||
 | 
			
		||||
        glActiveTexture(GL_TEXTURE0);
 | 
			
		||||
@ -194,7 +194,7 @@ void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuf
 | 
			
		||||
 | 
			
		||||
        glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
 | 
			
		||||
 | 
			
		||||
        state.texture_units[0].texture_2d = 0;
 | 
			
		||||
        state.texture_units[0].texture = 0;
 | 
			
		||||
        state.Apply();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -205,7 +205,7 @@ void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuf
 | 
			
		||||
 */
 | 
			
		||||
void RendererOpenGL::LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color_b, u8 color_a,
 | 
			
		||||
                                                const TextureInfo& texture) {
 | 
			
		||||
    state.texture_units[0].texture_2d = texture.resource.handle;
 | 
			
		||||
    state.texture_units[0].texture = texture.resource.handle;
 | 
			
		||||
    state.Apply();
 | 
			
		||||
 | 
			
		||||
    glActiveTexture(GL_TEXTURE0);
 | 
			
		||||
@ -214,7 +214,7 @@ void RendererOpenGL::LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color
 | 
			
		||||
    // Update existing texture
 | 
			
		||||
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, framebuffer_data);
 | 
			
		||||
 | 
			
		||||
    state.texture_units[0].texture_2d = 0;
 | 
			
		||||
    state.texture_units[0].texture = 0;
 | 
			
		||||
    state.Apply();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -260,7 +260,7 @@ void RendererOpenGL::InitOpenGLObjects() {
 | 
			
		||||
    // Allocation of storage is deferred until the first frame, when we
 | 
			
		||||
    // know the framebuffer size.
 | 
			
		||||
 | 
			
		||||
    state.texture_units[0].texture_2d = screen_info.texture.resource.handle;
 | 
			
		||||
    state.texture_units[0].texture = screen_info.texture.resource.handle;
 | 
			
		||||
    state.Apply();
 | 
			
		||||
 | 
			
		||||
    glActiveTexture(GL_TEXTURE0);
 | 
			
		||||
@ -272,7 +272,7 @@ void RendererOpenGL::InitOpenGLObjects() {
 | 
			
		||||
 | 
			
		||||
    screen_info.display_texture = screen_info.texture.resource.handle;
 | 
			
		||||
 | 
			
		||||
    state.texture_units[0].texture_2d = 0;
 | 
			
		||||
    state.texture_units[0].texture = 0;
 | 
			
		||||
    state.Apply();
 | 
			
		||||
 | 
			
		||||
    // Clear screen to black
 | 
			
		||||
@ -305,14 +305,14 @@ void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture,
 | 
			
		||||
        UNREACHABLE();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    state.texture_units[0].texture_2d = texture.resource.handle;
 | 
			
		||||
    state.texture_units[0].texture = texture.resource.handle;
 | 
			
		||||
    state.Apply();
 | 
			
		||||
 | 
			
		||||
    glActiveTexture(GL_TEXTURE0);
 | 
			
		||||
    glTexImage2D(GL_TEXTURE_2D, 0, internal_format, texture.width, texture.height, 0,
 | 
			
		||||
                 texture.gl_format, texture.gl_type, nullptr);
 | 
			
		||||
 | 
			
		||||
    state.texture_units[0].texture_2d = 0;
 | 
			
		||||
    state.texture_units[0].texture = 0;
 | 
			
		||||
    state.Apply();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -354,14 +354,14 @@ void RendererOpenGL::DrawScreenTriangles(const ScreenInfo& screen_info, float x,
 | 
			
		||||
        ScreenRectVertex(x + w, y + h, texcoords.bottom * scale_u, right * scale_v),
 | 
			
		||||
    }};
 | 
			
		||||
 | 
			
		||||
    state.texture_units[0].texture_2d = screen_info.display_texture;
 | 
			
		||||
    state.texture_units[0].texture = screen_info.display_texture;
 | 
			
		||||
    state.texture_units[0].swizzle = {GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA};
 | 
			
		||||
    state.Apply();
 | 
			
		||||
 | 
			
		||||
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices.data());
 | 
			
		||||
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 | 
			
		||||
 | 
			
		||||
    state.texture_units[0].texture_2d = 0;
 | 
			
		||||
    state.texture_units[0].texture = 0;
 | 
			
		||||
    state.Apply();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user