|
@@ -238,6 +238,12 @@ OGLTexture CreateTexture(const SurfaceParams& params, GLenum target, GLenum inte
|
|
|
return texture;
|
|
return texture;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+constexpr u32 EncodeSwizzle(SwizzleSource x_source, SwizzleSource y_source, SwizzleSource z_source,
|
|
|
|
|
+ SwizzleSource w_source) {
|
|
|
|
|
+ return (static_cast<u32>(x_source) << 24) | (static_cast<u32>(y_source) << 16) |
|
|
|
|
|
+ (static_cast<u32>(z_source) << 8) | static_cast<u32>(w_source);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
} // Anonymous namespace
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
CachedSurface::CachedSurface(const GPUVAddr gpu_addr, const SurfaceParams& params,
|
|
CachedSurface::CachedSurface(const GPUVAddr gpu_addr, const SurfaceParams& params,
|
|
@@ -404,7 +410,8 @@ CachedSurfaceView::CachedSurfaceView(CachedSurface& surface, const ViewParams& p
|
|
|
if (!is_proxy) {
|
|
if (!is_proxy) {
|
|
|
texture_view = CreateTextureView();
|
|
texture_view = CreateTextureView();
|
|
|
}
|
|
}
|
|
|
- swizzle = EncodeSwizzle(SwizzleSource::R, SwizzleSource::G, SwizzleSource::B, SwizzleSource::A);
|
|
|
|
|
|
|
+ current_swizzle =
|
|
|
|
|
+ EncodeSwizzle(SwizzleSource::R, SwizzleSource::G, SwizzleSource::B, SwizzleSource::A);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
CachedSurfaceView::~CachedSurfaceView() = default;
|
|
CachedSurfaceView::~CachedSurfaceView() = default;
|
|
@@ -449,25 +456,35 @@ void CachedSurfaceView::Attach(GLenum attachment, GLenum target) const {
|
|
|
|
|
|
|
|
void CachedSurfaceView::ApplySwizzle(SwizzleSource x_source, SwizzleSource y_source,
|
|
void CachedSurfaceView::ApplySwizzle(SwizzleSource x_source, SwizzleSource y_source,
|
|
|
SwizzleSource z_source, SwizzleSource w_source) {
|
|
SwizzleSource z_source, SwizzleSource w_source) {
|
|
|
- u32 new_swizzle = EncodeSwizzle(x_source, y_source, z_source, w_source);
|
|
|
|
|
- if (new_swizzle == swizzle)
|
|
|
|
|
|
|
+ const u32 new_swizzle = EncodeSwizzle(x_source, y_source, z_source, w_source);
|
|
|
|
|
+ if (current_swizzle == new_swizzle) {
|
|
|
return;
|
|
return;
|
|
|
- swizzle = new_swizzle;
|
|
|
|
|
- const std::array gl_swizzle = {GetSwizzleSource(x_source), GetSwizzleSource(y_source),
|
|
|
|
|
- GetSwizzleSource(z_source), GetSwizzleSource(w_source)};
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ current_swizzle = new_swizzle;
|
|
|
|
|
+
|
|
|
|
|
+ std::array swizzle{x_source, y_source, z_source, w_source};
|
|
|
|
|
+
|
|
|
const GLuint handle = GetTexture();
|
|
const GLuint handle = GetTexture();
|
|
|
- const PixelFormat format = surface.GetSurfaceParams().pixel_format;
|
|
|
|
|
- switch (format) {
|
|
|
|
|
|
|
+ switch (const PixelFormat format = surface.GetSurfaceParams().pixel_format) {
|
|
|
|
|
+ case PixelFormat::S8Z24:
|
|
|
case PixelFormat::Z24S8:
|
|
case PixelFormat::Z24S8:
|
|
|
case PixelFormat::Z32FS8:
|
|
case PixelFormat::Z32FS8:
|
|
|
- case PixelFormat::S8Z24:
|
|
|
|
|
|
|
+ UNIMPLEMENTED_IF(x_source != SwizzleSource::R && x_source != SwizzleSource::G);
|
|
|
glTextureParameteri(handle, GL_DEPTH_STENCIL_TEXTURE_MODE,
|
|
glTextureParameteri(handle, GL_DEPTH_STENCIL_TEXTURE_MODE,
|
|
|
GetComponent(format, x_source == SwizzleSource::R));
|
|
GetComponent(format, x_source == SwizzleSource::R));
|
|
|
- break;
|
|
|
|
|
- default:
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // Make sure we sample the first component
|
|
|
|
|
+ std::transform(swizzle.begin(), swizzle.end(), swizzle.begin(), [](SwizzleSource value) {
|
|
|
|
|
+ return value == SwizzleSource::G ? SwizzleSource::R : value;
|
|
|
|
|
+ });
|
|
|
|
|
+ [[fallthrough]];
|
|
|
|
|
+ default: {
|
|
|
|
|
+ const std::array gl_swizzle = {GetSwizzleSource(swizzle[0]), GetSwizzleSource(swizzle[1]),
|
|
|
|
|
+ GetSwizzleSource(swizzle[2]), GetSwizzleSource(swizzle[3])};
|
|
|
glTextureParameteriv(handle, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle.data());
|
|
glTextureParameteriv(handle, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle.data());
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
OGLTextureView CachedSurfaceView::CreateTextureView() const {
|
|
OGLTextureView CachedSurfaceView::CreateTextureView() const {
|