summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2018-03-27 04:46:11 +0200
committerJames Rowe <jroweboy@gmail.com>2018-04-07 04:40:24 +0200
commitb305646c44385833edccb067456e3a0ba4fd3161 (patch)
tree2f2d85c700a5d993157f6535a9729f81cac8c900
parentGL: Create the sampler objects when starting up the GL rasterizer. (diff)
downloadyuzu-b305646c44385833edccb067456e3a0ba4fd3161.tar
yuzu-b305646c44385833edccb067456e3a0ba4fd3161.tar.gz
yuzu-b305646c44385833edccb067456e3a0ba4fd3161.tar.bz2
yuzu-b305646c44385833edccb067456e3a0ba4fd3161.tar.lz
yuzu-b305646c44385833edccb067456e3a0ba4fd3161.tar.xz
yuzu-b305646c44385833edccb067456e3a0ba4fd3161.tar.zst
yuzu-b305646c44385833edccb067456e3a0ba4fd3161.zip
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp14
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h89
2 files changed, 32 insertions, 71 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index 4fd7cdf6a..cfe06391a 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -92,19 +92,9 @@ static void MortonCopyTile(u32 stride, u8* tile_buffer, u8* gl_buffer) {
u8* tile_ptr = tile_buffer + VideoCore::MortonInterleave(x, y) * bytes_per_pixel;
u8* gl_ptr = gl_buffer + ((7 - y) * stride + x) * gl_bytes_per_pixel;
if (morton_to_gl) {
- if (format == PixelFormat::D24S8) {
- gl_ptr[0] = tile_ptr[3];
- std::memcpy(gl_ptr + 1, tile_ptr, 3);
- } else {
- std::memcpy(gl_ptr, tile_ptr, bytes_per_pixel);
- }
+ std::memcpy(gl_ptr, tile_ptr, bytes_per_pixel);
} else {
- if (format == PixelFormat::D24S8) {
- std::memcpy(tile_ptr, gl_ptr + 1, 3);
- tile_ptr[3] = gl_ptr[0];
- } else {
- std::memcpy(tile_ptr, gl_ptr, bytes_per_pixel);
- }
+ std::memcpy(tile_ptr, gl_ptr, bytes_per_pixel);
}
}
}
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
index 37b1dae80..06524fc59 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
@@ -24,6 +24,7 @@
#include "common/math_util.h"
#include "video_core/gpu.h"
#include "video_core/renderer_opengl/gl_resource_manager.h"
+#include "video_core/textures/texture.h"
struct CachedSurface;
using Surface = std::shared_ptr<CachedSurface>;
@@ -51,30 +52,8 @@ enum class ScaleMatch {
struct SurfaceParams {
enum class PixelFormat {
- // First 5 formats are shared between textures and color buffers
RGBA8 = 0,
- RGB8 = 1,
- RGB5A1 = 2,
- RGB565 = 3,
- RGBA4 = 4,
-
- // Texture-only formats
- IA8 = 5,
- RG8 = 6,
- I8 = 7,
- A8 = 8,
- IA4 = 9,
- I4 = 10,
- A4 = 11,
- ETC1 = 12,
- ETC1A4 = 13,
-
- // Depth buffer-only formats
- D16 = 14,
- // gap
- D24 = 16,
- D24S8 = 17,
-
+ DXT1 = 1,
Invalid = 255,
};
@@ -88,28 +67,15 @@ struct SurfaceParams {
};
static constexpr unsigned int GetFormatBpp(PixelFormat format) {
- constexpr std::array<unsigned int, 18> bpp_table = {
+ if (format == PixelFormat::Invalid)
+ return 0;
+
+ constexpr std::array<unsigned int, 2> bpp_table = {
32, // RGBA8
- 24, // RGB8
- 16, // RGB5A1
- 16, // RGB565
- 16, // RGBA4
- 16, // IA8
- 16, // RG8
- 8, // I8
- 8, // A8
- 8, // IA4
- 4, // I4
- 4, // A4
- 4, // ETC1
- 8, // ETC1A4
- 16, // D16
- 0,
- 24, // D24
- 32, // D24S8
+ 64, // DXT1
};
- assert(static_cast<size_t>(format) < bpp_table.size());
+ ASSERT(static_cast<size_t>(format) < bpp_table.size());
return bpp_table[static_cast<size_t>(format)];
}
unsigned int GetFormatBpp() const {
@@ -134,6 +100,18 @@ struct SurfaceParams {
}
}
+ static PixelFormat PixelFormatFromTextureFormat(Tegra::Texture::TextureFormat format) {
+ // TODO(Subv): Properly implement this
+ switch (format) {
+ case Tegra::Texture::TextureFormat::A8R8G8B8:
+ return PixelFormat::RGBA8;
+ case Tegra::Texture::TextureFormat::DXT1:
+ return PixelFormat::DXT1;
+ default:
+ UNREACHABLE();
+ }
+ }
+
static bool CheckFormatsBlittable(PixelFormat pixel_format_a, PixelFormat pixel_format_b) {
SurfaceType a_type = GetFormatType(pixel_format_a);
SurfaceType b_type = GetFormatType(pixel_format_b);
@@ -154,22 +132,17 @@ struct SurfaceParams {
return false;
}
- static constexpr SurfaceType GetFormatType(PixelFormat pixel_format) {
- if ((unsigned int)pixel_format < 5) {
+ static SurfaceType GetFormatType(PixelFormat pixel_format) {
+ if ((unsigned int)pixel_format <= static_cast<unsigned int>(PixelFormat::RGBA8)) {
return SurfaceType::Color;
}
- if ((unsigned int)pixel_format < 14) {
+ if ((unsigned int)pixel_format <= static_cast<unsigned int>(PixelFormat::DXT1)) {
return SurfaceType::Texture;
}
- if (pixel_format == PixelFormat::D16 || pixel_format == PixelFormat::D24) {
- return SurfaceType::Depth;
- }
-
- if (pixel_format == PixelFormat::D24S8) {
- return SurfaceType::DepthStencil;
- }
+ // TODO(Subv): Implement the other formats
+ ASSERT(false);
return SurfaceType::Invalid;
}
@@ -265,12 +238,10 @@ struct CachedSurface : SurfaceParams {
OGLTexture texture;
static constexpr unsigned int GetGLBytesPerPixel(PixelFormat format) {
- // OpenGL needs 4 bpp alignment for D24 since using GL_UNSIGNED_INT as type
- return format == PixelFormat::Invalid
- ? 0
- : (format == PixelFormat::D24 || GetFormatType(format) == SurfaceType::Texture)
- ? 4
- : SurfaceParams::GetFormatBpp(format) / 8;
+ if (format == PixelFormat::Invalid)
+ return 0;
+
+ return SurfaceParams::GetFormatBpp(format) / 8;
}
std::unique_ptr<u8[]> gl_buffer;
@@ -313,7 +284,7 @@ public:
bool load_if_create);
/// Get a surface based on the texture configuration
- Surface GetTextureSurface(const void* config);
+ Surface GetTextureSurface(const Tegra::Texture::FullTextureInfo& config);
/// Get the color and depth surfaces based on the framebuffer configuration
SurfaceSurfaceRect_Tuple GetFramebufferSurfaces(bool using_color_fb, bool using_depth_fb,