gl_texture_runtime: Resolve shadow map comment
This commit is contained in:
@@ -127,7 +127,7 @@ target_include_directories(video_core PRIVATE ${HOST_SHADERS_INCLUDE})
|
|||||||
|
|
||||||
create_target_directory_groups(video_core)
|
create_target_directory_groups(video_core)
|
||||||
|
|
||||||
target_link_libraries(video_core PUBLIC citra_common core)
|
target_link_libraries(video_core PUBLIC citra_common citra_core)
|
||||||
target_link_libraries(video_core PRIVATE glad tsl::robin_map json-headers dds-ktx nihstro-headers Boost::serialization)
|
target_link_libraries(video_core PRIVATE glad tsl::robin_map json-headers dds-ktx nihstro-headers Boost::serialization)
|
||||||
set_target_properties(video_core PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO})
|
set_target_properties(video_core PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO})
|
||||||
|
|
||||||
|
@@ -18,6 +18,7 @@ enum class SurfaceFlagBits : u32 {
|
|||||||
Picked = 1 << 1, ///< Surface has been picked when searching for a match.
|
Picked = 1 << 1, ///< Surface has been picked when searching for a match.
|
||||||
Tracked = 1 << 2, ///< Surface is part of a texture cube and should be tracked.
|
Tracked = 1 << 2, ///< Surface is part of a texture cube and should be tracked.
|
||||||
Custom = 1 << 3, ///< Surface texture has been replaced with a custom texture.
|
Custom = 1 << 3, ///< Surface texture has been replaced with a custom texture.
|
||||||
|
ShadowMap = 1 << 4, ///< Surface is used during shadow rendering.
|
||||||
};
|
};
|
||||||
DECLARE_ENUM_FLAG_OPERATORS(SurfaceFlagBits);
|
DECLARE_ENUM_FLAG_OPERATORS(SurfaceFlagBits);
|
||||||
|
|
||||||
|
@@ -510,6 +510,7 @@ void RasterizerOpenGL::SyncTextureUnits(const Framebuffer& framebuffer) {
|
|||||||
switch (texture.config.type.Value()) {
|
switch (texture.config.type.Value()) {
|
||||||
case TextureType::Shadow2D: {
|
case TextureType::Shadow2D: {
|
||||||
Surface& surface = res_cache.GetTextureSurface(texture);
|
Surface& surface = res_cache.GetTextureSurface(texture);
|
||||||
|
surface.flags |= VideoCore::SurfaceFlagBits::ShadowMap;
|
||||||
state.image_shadow_texture_px = surface.Handle();
|
state.image_shadow_texture_px = surface.Handle();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -553,6 +554,7 @@ void RasterizerOpenGL::BindShadowCube(const Pica::TexturingRegs::FullTextureConf
|
|||||||
|
|
||||||
VideoCore::SurfaceId surface_id = res_cache.GetTextureSurface(info);
|
VideoCore::SurfaceId surface_id = res_cache.GetTextureSurface(info);
|
||||||
Surface& surface = res_cache.GetSurface(surface_id);
|
Surface& surface = res_cache.GetSurface(surface_id);
|
||||||
|
surface.flags |= VideoCore::SurfaceFlagBits::ShadowMap;
|
||||||
state.image_shadow_texture[binding] = surface.Handle();
|
state.image_shadow_texture[binding] = surface.Handle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,7 @@ namespace {
|
|||||||
|
|
||||||
using VideoCore::MapType;
|
using VideoCore::MapType;
|
||||||
using VideoCore::PixelFormat;
|
using VideoCore::PixelFormat;
|
||||||
|
using VideoCore::SurfaceFlagBits;
|
||||||
using VideoCore::SurfaceType;
|
using VideoCore::SurfaceType;
|
||||||
using VideoCore::TextureType;
|
using VideoCore::TextureType;
|
||||||
|
|
||||||
@@ -339,13 +340,12 @@ bool TextureRuntime::BlitTextures(Surface& source, Surface& dest,
|
|||||||
source.Attach(GL_READ_FRAMEBUFFER, blit.src_level, blit.src_layer);
|
source.Attach(GL_READ_FRAMEBUFFER, blit.src_level, blit.src_layer);
|
||||||
dest.Attach(GL_DRAW_FRAMEBUFFER, blit.dst_level, blit.dst_layer);
|
dest.Attach(GL_DRAW_FRAMEBUFFER, blit.dst_level, blit.dst_layer);
|
||||||
|
|
||||||
// TODO (wwylele): use GL_NEAREST for shadow map texture
|
|
||||||
// Note: shadow map is treated as RGBA8 format in PICA, as well as in the rasterizer cache, but
|
// Note: shadow map is treated as RGBA8 format in PICA, as well as in the rasterizer cache, but
|
||||||
// doing linear intepolation componentwise would cause incorrect value. However, for a
|
// doing linear intepolation componentwise would cause incorrect value.
|
||||||
// well-programmed game this code path should be rarely executed for shadow map with
|
|
||||||
// inconsistent scale.
|
|
||||||
const GLbitfield buffer_mask = MakeBufferMask(source.type);
|
const GLbitfield buffer_mask = MakeBufferMask(source.type);
|
||||||
const GLenum filter = buffer_mask == GL_COLOR_BUFFER_BIT ? GL_LINEAR : GL_NEAREST;
|
const bool is_shadow_map = True(source.flags & SurfaceFlagBits::ShadowMap);
|
||||||
|
const GLenum filter =
|
||||||
|
buffer_mask == GL_COLOR_BUFFER_BIT && !is_shadow_map ? GL_LINEAR : GL_NEAREST;
|
||||||
glBlitFramebuffer(blit.src_rect.left, blit.src_rect.bottom, blit.src_rect.right,
|
glBlitFramebuffer(blit.src_rect.left, blit.src_rect.bottom, blit.src_rect.right,
|
||||||
blit.src_rect.top, blit.dst_rect.left, blit.dst_rect.bottom,
|
blit.src_rect.top, blit.dst_rect.left, blit.dst_rect.bottom,
|
||||||
blit.dst_rect.right, blit.dst_rect.top, buffer_mask, filter);
|
blit.dst_rect.right, blit.dst_rect.top, buffer_mask, filter);
|
||||||
|
Reference in New Issue
Block a user