hwr2: use palette manager in twodee

This commit is contained in:
Eidolon 2023-02-12 11:46:00 -06:00
parent e875c8e20d
commit 0a9e9bbbae
3 changed files with 8 additions and 27 deletions

View file

@ -58,7 +58,6 @@ struct Atlas
struct srb2::hwr2::TwodeePassData struct srb2::hwr2::TwodeePassData
{ {
Handle<Texture> default_tex; Handle<Texture> default_tex;
Handle<Texture> palette_tex;
Handle<Texture> default_colormap_tex; Handle<Texture> default_colormap_tex;
std::vector<Atlas> patch_atlases; std::vector<Atlas> patch_atlases;
std::unordered_map<const patch_t*, size_t> patch_lookup; std::unordered_map<const patch_t*, size_t> patch_lookup;
@ -482,10 +481,6 @@ void TwodeePass::prepass(Rhi& rhi)
data_->default_tex = rhi.create_texture({TextureFormat::kLuminanceAlpha, 2, 1}); data_->default_tex = rhi.create_texture({TextureFormat::kLuminanceAlpha, 2, 1});
data_->upload_default_tex = true; data_->upload_default_tex = true;
} }
if (!data_->palette_tex)
{
data_->palette_tex = rhi.create_texture({TextureFormat::kRGBA, 256, 1});
}
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});
@ -772,24 +767,6 @@ void TwodeePass::transfer(Rhi& rhi, Handle<TransferContext> ctx)
data_->upload_default_tex = false; data_->upload_default_tex = false;
} }
{
// TODO share palette tex with software pass
// Unfortunately, pMasterPalette must be swizzled to get a linear layout.
// Maybe some adjustments to palette storage can make this a straight upload.
std::array<byteColor_t, 256> palette_32;
for (size_t i = 0; i < 256; i++)
{
palette_32[i] = pMasterPalette[i].s;
}
rhi.update_texture(
ctx,
data_->palette_tex,
{0, 0, 256, 1},
rhi::PixelFormat::kRGBA8,
tcb::as_bytes(tcb::span(palette_32))
);
}
for (auto colormap : data_->colormaps_to_upload) for (auto colormap : data_->colormaps_to_upload)
{ {
rhi.update_texture( rhi.update_texture(
@ -821,6 +798,8 @@ void TwodeePass::transfer(Rhi& rhi, Handle<TransferContext> ctx)
} }
data_->patches_to_upload.clear(); data_->patches_to_upload.clear();
Handle<Texture> palette_tex = palette_manager_->palette();
// Update the buffers for each list // Update the buffers for each list
auto ctx_list_itr = ctx_->begin(); auto ctx_list_itr = ctx_->begin();
for (size_t i = 0; i < cmd_lists_.size() && ctx_list_itr != ctx_->end(); i++) for (size_t i = 0; i < cmd_lists_.size() && ctx_list_itr != ctx_->end(); i++)
@ -843,14 +822,14 @@ void TwodeePass::transfer(Rhi& rhi, Handle<TransferContext> ctx)
{ {
Atlas& atlas = data_->patch_atlases[atlas_index]; Atlas& atlas = data_->patch_atlases[atlas_index];
tx[0] = {SamplerName::kSampler0, atlas.tex}; tx[0] = {SamplerName::kSampler0, atlas.tex};
tx[1] = {SamplerName::kSampler1, data_->palette_tex}; tx[1] = {SamplerName::kSampler1, palette_tex};
}, },
[&](const MergedTwodeeCommandFlatTexture& tex) [&](const MergedTwodeeCommandFlatTexture& tex)
{ {
Handle<Texture> th = flat_manager_->find_indexed(tex.lump); Handle<Texture> th = flat_manager_->find_indexed(tex.lump);
SRB2_ASSERT(th != kNullHandle); SRB2_ASSERT(th != kNullHandle);
tx[0] = {SamplerName::kSampler0, th}; tx[0] = {SamplerName::kSampler0, th};
tx[1] = {SamplerName::kSampler1, data_->palette_tex}; tx[1] = {SamplerName::kSampler1, palette_tex};
}}; }};
if (mcmd.texture) if (mcmd.texture)
{ {
@ -859,7 +838,7 @@ void TwodeePass::transfer(Rhi& rhi, Handle<TransferContext> ctx)
else else
{ {
tx[0] = {SamplerName::kSampler0, data_->default_tex}; tx[0] = {SamplerName::kSampler0, data_->default_tex};
tx[1] = {SamplerName::kSampler1, data_->palette_tex}; tx[1] = {SamplerName::kSampler1, palette_tex};
} }
const uint8_t* colormap = mcmd.colormap; const uint8_t* colormap = mcmd.colormap;

View file

@ -76,6 +76,7 @@ struct TwodeePass final : public Pass
std::variant<rhi::Handle<rhi::Texture>, rhi::Handle<rhi::Renderbuffer>> out_color_; std::variant<rhi::Handle<rhi::Texture>, rhi::Handle<rhi::Renderbuffer>> out_color_;
std::shared_ptr<TwodeePassData> data_; std::shared_ptr<TwodeePassData> data_;
std::shared_ptr<MainPaletteManager> palette_manager_;
std::shared_ptr<FlatTextureManager> flat_manager_; std::shared_ptr<FlatTextureManager> flat_manager_;
rhi::Handle<rhi::UniformSet> us_1; rhi::Handle<rhi::UniformSet> us_1;
rhi::Handle<rhi::UniformSet> us_2; rhi::Handle<rhi::UniformSet> us_2;

View file

@ -158,9 +158,10 @@ static std::shared_ptr<PassManager> build_pass_manager()
manager->insert( manager->insert(
"2d_prepare", "2d_prepare",
[twodee, framebuffer_manager](PassManager& mgr, Rhi&) [twodee, framebuffer_manager, palette_manager](PassManager& mgr, Rhi&)
{ {
twodee->output_ = framebuffer_manager->current_main_color(); twodee->output_ = framebuffer_manager->current_main_color();
twodee->palette_manager_ = palette_manager;
twodee->output_width_ = vid.width; twodee->output_width_ = vid.width;
twodee->output_height_ = vid.height; twodee->output_height_ = vid.height;
} }