mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-05-10 19:01:50 +00:00
rhi: Add texture wrap modes
They cannot be changed after creation, for simplicity.
This commit is contained in:
parent
70c375f9db
commit
8cc6e9a4f0
8 changed files with 121 additions and 19 deletions
|
|
@ -165,7 +165,7 @@ void BlitRectPass::transfer(Rhi& rhi, Handle<TransferContext> ctx)
|
||||||
glm::mat3(
|
glm::mat3(
|
||||||
glm::vec3(1.f, 0.f, 0.f),
|
glm::vec3(1.f, 0.f, 0.f),
|
||||||
glm::vec3(0.f, output_flip_ ? -1.f : 1.f, 0.f),
|
glm::vec3(0.f, output_flip_ ? -1.f : 1.f, 0.f),
|
||||||
glm::vec3(0.f, 0.f, 1.f)
|
glm::vec3(0.f, output_flip_ ? 1.f : 0.f, 1.f)
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,13 @@ void ImguiPass::prepass(Rhi& rhi)
|
||||||
uint32_t uwidth = static_cast<uint32_t>(width);
|
uint32_t uwidth = static_cast<uint32_t>(width);
|
||||||
uint32_t uheight = static_cast<uint32_t>(height);
|
uint32_t uheight = static_cast<uint32_t>(height);
|
||||||
|
|
||||||
font_atlas_ = rhi.create_texture({TextureFormat::kRGBA, uwidth, uheight});
|
font_atlas_ = rhi.create_texture({
|
||||||
|
TextureFormat::kRGBA,
|
||||||
|
uwidth,
|
||||||
|
uheight,
|
||||||
|
TextureWrapMode::kRepeat,
|
||||||
|
TextureWrapMode::kRepeat
|
||||||
|
});
|
||||||
io.Fonts->SetTexID(font_atlas_);
|
io.Fonts->SetTexID(font_atlas_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -166,7 +166,13 @@ void PostprocessWipePass::prepass(Rhi& rhi)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wipe_tex_ = rhi.create_texture({TextureFormat::kLuminance, mask_w_, mask_h_});
|
wipe_tex_ = rhi.create_texture({
|
||||||
|
TextureFormat::kLuminance,
|
||||||
|
mask_w_,
|
||||||
|
mask_h_,
|
||||||
|
TextureWrapMode::kClamp,
|
||||||
|
TextureWrapMode::kClamp
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void PostprocessWipePass::transfer(Rhi& rhi, Handle<TransferContext> ctx)
|
void PostprocessWipePass::transfer(Rhi& rhi, Handle<TransferContext> ctx)
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,13 @@ void FramebufferManager::prepass(Rhi& rhi)
|
||||||
// Recreate the framebuffer textures
|
// Recreate the framebuffer textures
|
||||||
if (main_color_ == kNullHandle)
|
if (main_color_ == kNullHandle)
|
||||||
{
|
{
|
||||||
main_color_ = rhi.create_texture({TextureFormat::kRGBA, current_width, current_height});
|
main_color_ = rhi.create_texture({
|
||||||
|
TextureFormat::kRGBA,
|
||||||
|
current_width,
|
||||||
|
current_height,
|
||||||
|
TextureWrapMode::kClamp,
|
||||||
|
TextureWrapMode::kClamp
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (main_depth_ == kNullHandle)
|
if (main_depth_ == kNullHandle)
|
||||||
{
|
{
|
||||||
|
|
@ -80,20 +86,44 @@ void FramebufferManager::prepass(Rhi& rhi)
|
||||||
|
|
||||||
if (post_colors_[0] == kNullHandle)
|
if (post_colors_[0] == kNullHandle)
|
||||||
{
|
{
|
||||||
post_colors_[0] = rhi.create_texture({TextureFormat::kRGBA, current_width, current_height});
|
post_colors_[0] = rhi.create_texture({
|
||||||
|
TextureFormat::kRGBA,
|
||||||
|
current_width,
|
||||||
|
current_height,
|
||||||
|
TextureWrapMode::kClamp,
|
||||||
|
TextureWrapMode::kClamp
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (post_colors_[1] == kNullHandle)
|
if (post_colors_[1] == kNullHandle)
|
||||||
{
|
{
|
||||||
post_colors_[1] = rhi.create_texture({TextureFormat::kRGBA, current_width, current_height});
|
post_colors_[1] = rhi.create_texture({
|
||||||
|
TextureFormat::kRGBA,
|
||||||
|
current_width,
|
||||||
|
current_height,
|
||||||
|
TextureWrapMode::kClamp,
|
||||||
|
TextureWrapMode::kClamp
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wipe_start_color_ == kNullHandle)
|
if (wipe_start_color_ == kNullHandle)
|
||||||
{
|
{
|
||||||
wipe_start_color_ = rhi.create_texture({TextureFormat::kRGBA, current_width, current_height});
|
wipe_start_color_ = rhi.create_texture({
|
||||||
|
TextureFormat::kRGBA,
|
||||||
|
current_width,
|
||||||
|
current_height,
|
||||||
|
TextureWrapMode::kClamp,
|
||||||
|
TextureWrapMode::kClamp
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (wipe_end_color_ == kNullHandle)
|
if (wipe_end_color_ == kNullHandle)
|
||||||
{
|
{
|
||||||
wipe_end_color_ = rhi.create_texture({TextureFormat::kRGBA, current_width, current_height});
|
wipe_end_color_ = rhi.create_texture({
|
||||||
|
TextureFormat::kRGBA,
|
||||||
|
current_width,
|
||||||
|
current_height,
|
||||||
|
TextureWrapMode::kClamp,
|
||||||
|
TextureWrapMode::kClamp
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -119,7 +149,7 @@ void MainPaletteManager::prepass(Rhi& rhi)
|
||||||
{
|
{
|
||||||
if (!palette_)
|
if (!palette_)
|
||||||
{
|
{
|
||||||
palette_ = rhi.create_texture({TextureFormat::kRGBA, 256, 1});
|
palette_ = rhi.create_texture({TextureFormat::kRGBA, 256, 1, TextureWrapMode::kClamp, TextureWrapMode::kClamp});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -148,9 +178,15 @@ void CommonResourcesManager::prepass(Rhi& rhi)
|
||||||
{
|
{
|
||||||
if (!init_)
|
if (!init_)
|
||||||
{
|
{
|
||||||
black_ = rhi.create_texture({TextureFormat::kRGBA, 1, 1});
|
black_ = rhi.create_texture({TextureFormat::kRGBA, 1, 1, TextureWrapMode::kClamp, TextureWrapMode::kClamp});
|
||||||
white_ = rhi.create_texture({TextureFormat::kRGBA, 1, 1});
|
white_ = rhi.create_texture({TextureFormat::kRGBA, 1, 1, TextureWrapMode::kClamp, TextureWrapMode::kClamp});
|
||||||
transparent_ = rhi.create_texture({TextureFormat::kRGBA, 1, 1});
|
transparent_ = rhi.create_texture({
|
||||||
|
TextureFormat::kRGBA,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
TextureWrapMode::kClamp,
|
||||||
|
TextureWrapMode::kClamp
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -266,7 +302,13 @@ Handle<Texture> FlatTextureManager::find_or_create_indexed(Rhi& rhi, lumpnum_t l
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t flat_size = get_flat_size(lump);
|
uint32_t flat_size = get_flat_size(lump);
|
||||||
Handle<Texture> new_tex = rhi.create_texture({TextureFormat::kLuminanceAlpha, flat_size, flat_size});
|
Handle<Texture> new_tex = rhi.create_texture({
|
||||||
|
TextureFormat::kLuminanceAlpha,
|
||||||
|
flat_size,
|
||||||
|
flat_size,
|
||||||
|
TextureWrapMode::kRepeat,
|
||||||
|
TextureWrapMode::kRepeat
|
||||||
|
});
|
||||||
flats_.insert({lump, new_tex});
|
flats_.insert({lump, new_tex});
|
||||||
to_upload_.push_back(lump);
|
to_upload_.push_back(lump);
|
||||||
return new_tex;
|
return new_tex;
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,13 @@ void SoftwarePass::prepass(Rhi& rhi)
|
||||||
|
|
||||||
if (!screen_texture_)
|
if (!screen_texture_)
|
||||||
{
|
{
|
||||||
screen_texture_ = rhi.create_texture({TextureFormat::kLuminance, width_, height_});
|
screen_texture_ = rhi.create_texture({
|
||||||
|
TextureFormat::kLuminance,
|
||||||
|
width_,
|
||||||
|
height_,
|
||||||
|
TextureWrapMode::kClamp,
|
||||||
|
TextureWrapMode::kClamp
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the screen width won't fit the unpack alignment, we need to copy the screen.
|
// If the screen width won't fit the unpack alignment, we need to copy the screen.
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,13 @@ static Rect trimmed_patch_dim(const patch_t* patch);
|
||||||
static void create_atlas(Rhi& rhi, TwodeePassData& pass_data)
|
static void create_atlas(Rhi& rhi, TwodeePassData& pass_data)
|
||||||
{
|
{
|
||||||
Atlas new_atlas;
|
Atlas new_atlas;
|
||||||
new_atlas.tex = rhi.create_texture({TextureFormat::kLuminanceAlpha, 2048, 2048});
|
new_atlas.tex = rhi.create_texture({
|
||||||
|
TextureFormat::kLuminanceAlpha,
|
||||||
|
2048,
|
||||||
|
2048,
|
||||||
|
TextureWrapMode::kClamp,
|
||||||
|
TextureWrapMode::kClamp
|
||||||
|
});
|
||||||
new_atlas.tex_width = 2048;
|
new_atlas.tex_width = 2048;
|
||||||
new_atlas.tex_height = 2048;
|
new_atlas.tex_height = 2048;
|
||||||
new_atlas.rp_ctx = std::make_unique<stbrp_context>();
|
new_atlas.rp_ctx = std::make_unique<stbrp_context>();
|
||||||
|
|
@ -501,12 +507,24 @@ void TwodeePass::prepass(Rhi& rhi)
|
||||||
|
|
||||||
if (!data_->default_tex)
|
if (!data_->default_tex)
|
||||||
{
|
{
|
||||||
data_->default_tex = rhi.create_texture({TextureFormat::kLuminanceAlpha, 2, 1});
|
data_->default_tex = rhi.create_texture({
|
||||||
|
TextureFormat::kLuminanceAlpha,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
TextureWrapMode::kClamp,
|
||||||
|
TextureWrapMode::kClamp
|
||||||
|
});
|
||||||
data_->upload_default_tex = true;
|
data_->upload_default_tex = true;
|
||||||
}
|
}
|
||||||
if (!data_->default_colormap_tex)
|
if (!data_->default_colormap_tex)
|
||||||
{
|
{
|
||||||
data_->default_colormap_tex = rhi.create_texture({TextureFormat::kLuminance, 256, 1});
|
data_->default_colormap_tex = rhi.create_texture({
|
||||||
|
TextureFormat::kLuminance,
|
||||||
|
256,
|
||||||
|
1,
|
||||||
|
TextureWrapMode::kClamp,
|
||||||
|
TextureWrapMode::kClamp
|
||||||
|
});
|
||||||
data_->upload_default_tex = true;
|
data_->upload_default_tex = true;
|
||||||
}
|
}
|
||||||
if (!render_pass_)
|
if (!render_pass_)
|
||||||
|
|
|
||||||
|
|
@ -110,6 +110,21 @@ constexpr GLenum map_texture_format(rhi::TextureFormat format)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constexpr GLenum map_texture_wrap(rhi::TextureWrapMode wrap)
|
||||||
|
{
|
||||||
|
switch (wrap)
|
||||||
|
{
|
||||||
|
case rhi::TextureWrapMode::kClamp:
|
||||||
|
return GL_CLAMP_TO_EDGE;
|
||||||
|
case rhi::TextureWrapMode::kRepeat:
|
||||||
|
return GL_REPEAT;
|
||||||
|
case rhi::TextureWrapMode::kMirroredRepeat:
|
||||||
|
return GL_MIRRORED_REPEAT;
|
||||||
|
default:
|
||||||
|
return GL_NEAREST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
constexpr GLenum map_internal_texture_format(rhi::TextureFormat format)
|
constexpr GLenum map_internal_texture_format(rhi::TextureFormat format)
|
||||||
{
|
{
|
||||||
switch (format)
|
switch (format)
|
||||||
|
|
@ -527,9 +542,9 @@ rhi::Handle<rhi::Texture> GlCoreRhi::create_texture(const rhi::TextureDesc& desc
|
||||||
GL_ASSERT;
|
GL_ASSERT;
|
||||||
gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
GL_ASSERT;
|
GL_ASSERT;
|
||||||
gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, map_texture_wrap(desc.u_wrap));
|
||||||
GL_ASSERT;
|
GL_ASSERT;
|
||||||
gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, map_texture_wrap(desc.v_wrap));
|
||||||
GL_ASSERT;
|
GL_ASSERT;
|
||||||
gl_->TexImage2D(GL_TEXTURE_2D, 0, internal_format, desc.width, desc.height, 0, format, GL_UNSIGNED_BYTE, nullptr);
|
gl_->TexImage2D(GL_TEXTURE_2D, 0, internal_format, desc.width, desc.height, 0, format, GL_UNSIGNED_BYTE, nullptr);
|
||||||
GL_ASSERT;
|
GL_ASSERT;
|
||||||
|
|
|
||||||
|
|
@ -432,11 +432,20 @@ struct RenderbufferDesc
|
||||||
uint32_t height;
|
uint32_t height;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class TextureWrapMode
|
||||||
|
{
|
||||||
|
kRepeat,
|
||||||
|
kMirroredRepeat,
|
||||||
|
kClamp
|
||||||
|
};
|
||||||
|
|
||||||
struct TextureDesc
|
struct TextureDesc
|
||||||
{
|
{
|
||||||
TextureFormat format;
|
TextureFormat format;
|
||||||
uint32_t width;
|
uint32_t width;
|
||||||
uint32_t height;
|
uint32_t height;
|
||||||
|
TextureWrapMode u_wrap;
|
||||||
|
TextureWrapMode v_wrap;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BufferDesc
|
struct BufferDesc
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue