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