diff options
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/maxwell_to_gl.h | 21 | ||||
| -rw-r--r-- | src/video_core/textures/texture.h | 16 |
3 files changed, 45 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index b23b8fb29..2e90ebcf4 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -681,6 +681,14 @@ u32 RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, GLuint program, | |||
| 681 | Surface surface = res_cache.GetTextureSurface(texture); | 681 | Surface surface = res_cache.GetTextureSurface(texture); |
| 682 | if (surface != nullptr) { | 682 | if (surface != nullptr) { |
| 683 | state.texture_units[current_bindpoint].texture_2d = surface->texture.handle; | 683 | state.texture_units[current_bindpoint].texture_2d = surface->texture.handle; |
| 684 | state.texture_units[current_bindpoint].swizzle.r = | ||
| 685 | MaxwellToGL::SwizzleSource(texture.tic.x_source); | ||
| 686 | state.texture_units[current_bindpoint].swizzle.g = | ||
| 687 | MaxwellToGL::SwizzleSource(texture.tic.y_source); | ||
| 688 | state.texture_units[current_bindpoint].swizzle.b = | ||
| 689 | MaxwellToGL::SwizzleSource(texture.tic.z_source); | ||
| 690 | state.texture_units[current_bindpoint].swizzle.a = | ||
| 691 | MaxwellToGL::SwizzleSource(texture.tic.w_source); | ||
| 684 | } else { | 692 | } else { |
| 685 | // Can occur when texture addr is null or its memory is unmapped/invalid | 693 | // Can occur when texture addr is null or its memory is unmapped/invalid |
| 686 | state.texture_units[current_bindpoint].texture_2d = 0; | 694 | state.texture_units[current_bindpoint].texture_2d = 0; |
diff --git a/src/video_core/renderer_opengl/maxwell_to_gl.h b/src/video_core/renderer_opengl/maxwell_to_gl.h index cf11983cf..2155fb019 100644 --- a/src/video_core/renderer_opengl/maxwell_to_gl.h +++ b/src/video_core/renderer_opengl/maxwell_to_gl.h | |||
| @@ -180,4 +180,25 @@ inline GLenum BlendFunc(Maxwell::Blend::Factor factor) { | |||
| 180 | return {}; | 180 | return {}; |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | inline GLenum SwizzleSource(Tegra::Texture::SwizzleSource source) { | ||
| 184 | switch (source) { | ||
| 185 | case Tegra::Texture::SwizzleSource::Zero: | ||
| 186 | return GL_ZERO; | ||
| 187 | case Tegra::Texture::SwizzleSource::R: | ||
| 188 | return GL_RED; | ||
| 189 | case Tegra::Texture::SwizzleSource::G: | ||
| 190 | return GL_GREEN; | ||
| 191 | case Tegra::Texture::SwizzleSource::B: | ||
| 192 | return GL_BLUE; | ||
| 193 | case Tegra::Texture::SwizzleSource::A: | ||
| 194 | return GL_ALPHA; | ||
| 195 | case Tegra::Texture::SwizzleSource::OneInt: | ||
| 196 | case Tegra::Texture::SwizzleSource::OneFloat: | ||
| 197 | return GL_ONE; | ||
| 198 | } | ||
| 199 | NGLOG_CRITICAL(Render_OpenGL, "Unimplemented swizzle source={}", static_cast<u32>(source)); | ||
| 200 | UNREACHABLE(); | ||
| 201 | return {}; | ||
| 202 | } | ||
| 203 | |||
| 183 | } // namespace MaxwellToGL | 204 | } // namespace MaxwellToGL |
diff --git a/src/video_core/textures/texture.h b/src/video_core/textures/texture.h index f48ca30b8..a17eaf19d 100644 --- a/src/video_core/textures/texture.h +++ b/src/video_core/textures/texture.h | |||
| @@ -122,6 +122,17 @@ enum class ComponentType : u32 { | |||
| 122 | FLOAT = 7 | 122 | FLOAT = 7 |
| 123 | }; | 123 | }; |
| 124 | 124 | ||
| 125 | enum class SwizzleSource : u32 { | ||
| 126 | Zero = 0, | ||
| 127 | |||
| 128 | R = 2, | ||
| 129 | G = 3, | ||
| 130 | B = 4, | ||
| 131 | A = 5, | ||
| 132 | OneInt = 6, | ||
| 133 | OneFloat = 7, | ||
| 134 | }; | ||
| 135 | |||
| 125 | union TextureHandle { | 136 | union TextureHandle { |
| 126 | u32 raw; | 137 | u32 raw; |
| 127 | BitField<0, 20, u32> tic_id; | 138 | BitField<0, 20, u32> tic_id; |
| @@ -139,6 +150,11 @@ struct TICEntry { | |||
| 139 | BitField<10, 3, ComponentType> g_type; | 150 | BitField<10, 3, ComponentType> g_type; |
| 140 | BitField<13, 3, ComponentType> b_type; | 151 | BitField<13, 3, ComponentType> b_type; |
| 141 | BitField<16, 3, ComponentType> a_type; | 152 | BitField<16, 3, ComponentType> a_type; |
| 153 | |||
| 154 | BitField<19, 3, SwizzleSource> x_source; | ||
| 155 | BitField<22, 3, SwizzleSource> y_source; | ||
| 156 | BitField<25, 3, SwizzleSource> z_source; | ||
| 157 | BitField<28, 3, SwizzleSource> w_source; | ||
| 142 | }; | 158 | }; |
| 143 | u32 address_low; | 159 | u32 address_low; |
| 144 | union { | 160 | union { |