Skip to content

Commit 185ca5c

Browse files
Fix the single channel extraction, TODO optimize the register usage somehow for monochrome blends.
1 parent b931bba commit 185ca5c

File tree

6 files changed

+86
-98
lines changed

6 files changed

+86
-98
lines changed

include/nbl/asset/IImageView.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ class IImageView : public IDescriptor
6262
E_SWIZZLE b = ES_B;
6363
E_SWIZZLE a = ES_A;
6464

65+
E_SWIZZLE& operator[](const uint32_t ix)
66+
{
67+
assert(ix<4u);
68+
return (&r)[ix];
69+
}
70+
6571
bool operator==(const SComponentMapping& rhs) const
6672
{
6773
return r == rhs.r && g == rhs.g && b == rhs.b && a == rhs.a;

include/nbl/ext/MitsubaLoader/CMitsubaLoader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class CMitsubaLoader : public asset::IRenderpassIndependentPipelineLoader
7474
core::vector<SContext::shape_ass_type> loadShapeGroup(SContext& ctx, uint32_t hierarchyLevel, const CElementShape::ShapeGroup* shapegroup, const core::matrix3x4SIMD& relTform);
7575
SContext::shape_ass_type loadBasicShape(SContext& ctx, uint32_t hierarchyLevel, CElementShape* shape, const core::matrix3x4SIMD& relTform);
7676

77-
void cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const CElementTexture* texture, const SContext::E_IMAGE_VIEW_SEMANTIC semantic);
77+
void cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const CElementTexture* texture, const CMitsubaMaterialCompilerFrontend::E_IMAGE_VIEW_SEMANTIC semantic);
7878

7979
SContext::bsdf_type getBSDFtreeTraversal(SContext& ctx, const CElementBSDF* bsdf);
8080
SContext::bsdf_type genBSDFtreeTraversal(SContext& ctx, const CElementBSDF* bsdf);

include/nbl/ext/MitsubaLoader/CMitsubaMaterialCompilerFrontend.h

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
#ifndef __C_MITSUBA_MATERIAL_COMPILER_FRONTEND_H_INCLUDED__
66
#define __C_MITSUBA_MATERIAL_COMPILER_FRONTEND_H_INCLUDED__
77

8+
#include "nbl/core/Types.h"
9+
10+
#include "nbl/asset/material_compiler/IR.h"
11+
812
#include "nbl/ext/MitsubaLoader/CElementBSDF.h"
9-
#include <nbl/asset/material_compiler/IR.h>
1013

1114
namespace nbl::ext::MitsubaLoader
1215
{
@@ -15,24 +18,17 @@ struct SContext;
1518

1619
class CMitsubaMaterialCompilerFrontend
1720
{
21+
public:
1822
using IRNode = asset::material_compiler::IR::INode;
19-
using tex_ass_type = std::tuple<core::smart_refctd_ptr<asset::ICPUImageView>,core::smart_refctd_ptr<asset::ICPUSampler>,float>;
20-
21-
const SContext* m_loaderContext;
22-
23-
std::pair<const CElementTexture*,float> unwindTextureScale(const CElementTexture* _element) const;
24-
25-
tex_ass_type getDerivMap(const CElementBSDF::BumpMap& _bump) const;
26-
tex_ass_type getBlendWeightTex(const CElementTexture* _element) const;
27-
tex_ass_type getTexture(const CElementTexture* _element) const;
28-
29-
tex_ass_type getTexture(const std::string& _viewKey, const CElementTexture::Bitmap& _bitmap, float _scale) const;
30-
31-
tex_ass_type getErrorTexture() const;
32-
33-
IRNode* createIRNode(asset::material_compiler::IR* ir, const CElementBSDF* _bsdf);
23+
enum E_IMAGE_VIEW_SEMANTIC : uint8_t
24+
{
25+
EIVS_IDENTITIY,
26+
EIVS_BLEND_WEIGHT,
27+
EIVS_NORMAL_MAP,
28+
EIVS_BUMP_MAP,
29+
EIVS_COUNT
30+
};
3431

35-
public:
3632
struct front_and_back_t
3733
{
3834
IRNode* front;
@@ -42,6 +38,19 @@ class CMitsubaMaterialCompilerFrontend
4238
explicit CMitsubaMaterialCompilerFrontend(const SContext* _ctx) : m_loaderContext(_ctx) {}
4339

4440
front_and_back_t compileToIRTree(asset::material_compiler::IR* ir, const CElementBSDF* _bsdf);
41+
42+
private:
43+
using tex_ass_type = std::tuple<core::smart_refctd_ptr<asset::ICPUImageView>,core::smart_refctd_ptr<asset::ICPUSampler>,float>;
44+
45+
const SContext* m_loaderContext;
46+
47+
std::pair<const CElementTexture*,float> unwindTextureScale(const CElementTexture* _element) const;
48+
49+
tex_ass_type getTexture(const CElementTexture* _element, const E_IMAGE_VIEW_SEMANTIC semantic=EIVS_IDENTITIY) const;
50+
51+
tex_ass_type getErrorTexture() const;
52+
53+
IRNode* createIRNode(asset::material_compiler::IR* ir, const CElementBSDF* _bsdf);
4554
};
4655

4756
}

include/nbl/ext/MitsubaLoader/SContext.h

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
#include "nbl/asset/utils/IGeometryCreator.h"
1111
#include "nbl/asset/material_compiler/CMaterialCompilerGLSLRasterBackend.h"
1212

13-
#include "../../ext/MitsubaLoader/CMitsubaMaterialCompilerFrontend.h"
14-
#include "../../ext/MitsubaLoader/CElementShape.h"
13+
#include "nbl/ext/MitsubaLoader/CMitsubaMaterialCompilerFrontend.h"
14+
#include "nbl/ext/MitsubaLoader/CElementShape.h"
1515

1616
namespace nbl
1717
{
@@ -53,15 +53,7 @@ namespace MitsubaLoader
5353
core::map<core::smart_refctd_ptr<asset::ICPUImage>,float> derivMapCache;
5454

5555
//
56-
enum E_IMAGE_VIEW_SEMANTIC : uint8_t
57-
{
58-
EIVS_IDENTITIY,
59-
EIVS_BLEND_WEIGHT,
60-
EIVS_NORMAL_MAP,
61-
EIVS_BUMP_MAP,
62-
EIVS_COUNT
63-
};
64-
static std::string imageViewCacheKey(const CElementTexture::Bitmap& bitmap, const E_IMAGE_VIEW_SEMANTIC semantic)
56+
static std::string imageViewCacheKey(const CElementTexture::Bitmap& bitmap, const CMitsubaMaterialCompilerFrontend::E_IMAGE_VIEW_SEMANTIC semantic)
6557
{
6658
std::string key = bitmap.filename.svalue;
6759
switch (bitmap.channel)
@@ -83,13 +75,13 @@ namespace MitsubaLoader
8375
}
8476
switch (semantic)
8577
{
86-
case EIVS_BLEND_WEIGHT:
78+
case CMitsubaMaterialCompilerFrontend::EIVS_BLEND_WEIGHT:
8779
key += "?blend";
8880
break;
89-
case EIVS_NORMAL_MAP:
81+
case CMitsubaMaterialCompilerFrontend::EIVS_NORMAL_MAP:
9082
key += "?deriv?n";
9183
break;
92-
case EIVS_BUMP_MAP:
84+
case CMitsubaMaterialCompilerFrontend::EIVS_BUMP_MAP:
9385
key += "?deriv?h";
9486
{
9587
static const char* wrap[5]

src/nbl/ext/MitsubaLoader/CMitsubaLoader.cpp

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -294,30 +294,30 @@ static core::smart_refctd_ptr<asset::ICPUImage> createDerivMap(SContext& ctx, as
294294

295295
return derivmap_img;
296296
}
297-
static core::smart_refctd_ptr<asset::ICPUImage> createSingleChannelImage(const asset::ICPUImage* _img, const asset::ICPUImageView::SComponentMapping::E_SWIZZLE srcChannel, bool expandChannels)
297+
static core::smart_refctd_ptr<asset::ICPUImage> createSingleChannelImage(const asset::ICPUImage* _img, const asset::ICPUImageView::SComponentMapping::E_SWIZZLE srcChannel)
298298
{
299299
auto outParams = _img->getCreationParameters();
300+
const auto inFormat = outParams.format;
300301

301302
asset::ICPUImage::SBufferCopy region;
302303
// pick format
303304
{
304-
const auto inFormat = outParams.format;
305305
// TODO: redo the format selection when @Erfan's format promotor is operational
306306
if (isSRGBFormat(inFormat))
307-
outParams.format = expandChannels ? asset::EF_B8G8R8A8_SRGB:asset::EF_R16_UNORM;
307+
outParams.format = asset::EF_B8G8R8A8_SRGB;
308308
else
309309
{
310310
const double prec = asset::getFormatPrecision(inFormat,srcChannel,0.0);
311311
if (prec<=FLT_MIN)
312-
outParams.format = expandChannels ? asset::EF_R32G32B32A32_SFLOAT:asset::EF_R32_SFLOAT;
312+
outParams.format = asset::EF_R32G32B32A32_SFLOAT;
313313
else if (prec<=1.0/65535.0)
314-
outParams.format = expandChannels ? asset::EF_R16G16B16A16_UNORM:asset::EF_R16_UNORM;
314+
outParams.format = asset::EF_R16G16B16A16_UNORM;
315315
else if (prec<=exp2f(-14.f))
316-
outParams.format = expandChannels ? asset::EF_R16G16B16A16_SFLOAT:asset::EF_R16_SFLOAT;
316+
outParams.format = asset::EF_R16G16B16A16_SFLOAT;
317317
else if (prec<=1.0/1023.0)
318-
outParams.format = expandChannels ? asset::EF_A2B10G10R10_UNORM_PACK32:asset::EF_R16_UNORM;
318+
outParams.format = asset::EF_A2B10G10R10_UNORM_PACK32;
319319
else
320-
outParams.format = expandChannels ? asset::EF_R8G8B8A8_UNORM:asset::EF_R8_UNORM;
320+
outParams.format = asset::EF_R8G8B8A8_UNORM;
321321
}
322322
}
323323
const size_t texelBytesz = asset::getTexelOrBlockBytesize(outParams.format);
@@ -345,7 +345,14 @@ static core::smart_refctd_ptr<asset::ICPUImage> createSingleChannelImage(const a
345345
conv.outOffset = { 0u,0u,0u };
346346
conv.inImage = _img;
347347
conv.outImage = outImg.get();
348-
conv.swizzle = {srcChannel,srcChannel,srcChannel,srcChannel};
348+
if (srcChannel!=asset::ICPUImageView::SComponentMapping::E_SWIZZLE::ES_IDENTITY)
349+
conv.swizzle = {srcChannel,srcChannel,srcChannel,srcChannel};
350+
else
351+
{
352+
conv.swizzle = {};
353+
for (auto i=asset::getFormatChannelCount(inFormat); i<4; i++)
354+
conv.swizzle[i] = asset::ICPUImageView::SComponentMapping::E_SWIZZLE::ES_R;
355+
}
349356

350357
if (!convert_filter_t::execute(std::execution::par_unseq,&conv))
351358
{
@@ -929,7 +936,7 @@ SContext::shape_ass_type CMitsubaLoader::loadBasicShape(SContext& ctx, uint32_t
929936
return mesh;
930937
}
931938

932-
void CMitsubaLoader::cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const CElementTexture* tex, const SContext::E_IMAGE_VIEW_SEMANTIC semantic)
939+
void CMitsubaLoader::cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const CElementTexture* tex, const CMitsubaMaterialCompilerFrontend::E_IMAGE_VIEW_SEMANTIC semantic)
933940
{
934941
if (!tex)
935942
return;
@@ -952,7 +959,7 @@ void CMitsubaLoader::cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const
952959
{
953960
auto loadParams = ctx.inner.params;
954961
// always restore, the only reason we haven't found a view is because either the image wasnt loaded yet, or its going to be processed with channel extraction or derivative mapping
955-
const uint32_t restoreLevels = semantic==SContext::EIVS_IDENTITIY&&tex->bitmap.channel==CElementTexture::Bitmap::CHANNEL::INVALID ? 0u:2u; // all the way to the buffer providing the pixels
962+
const uint32_t restoreLevels = semantic==CMitsubaMaterialCompilerFrontend::EIVS_IDENTITIY&&tex->bitmap.channel==CElementTexture::Bitmap::CHANNEL::INVALID ? 0u:2u; // all the way to the buffer providing the pixels
956963
loadParams.restoreLevels = std::max(loadParams.restoreLevels,hierarchyLevel+restoreLevels);
957964
// load using the actual filename, not the cache key
958965
asset::SAssetBundle bundle = interm_getAssetInHierarchy(m_assetMgr,tex->bitmap.filename.svalue,loadParams,hierarchyLevel,ctx.override_);
@@ -974,24 +981,23 @@ void CMitsubaLoader::cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const
974981
}
975982
switch (semantic)
976983
{
977-
case SContext::EIVS_IDENTITIY:
978-
case SContext::EIVS_BLEND_WEIGHT:
984+
case CMitsubaMaterialCompilerFrontend::EIVS_IDENTITIY:
985+
case CMitsubaMaterialCompilerFrontend::EIVS_BLEND_WEIGHT:
979986
{
980-
const bool isBlendWeight = semantic==SContext::EIVS_BLEND_WEIGHT;
981987
switch (tex->bitmap.channel)
982988
{
983989
// no GL_R8_SRGB support yet
984990
case CElementTexture::Bitmap::CHANNEL::R:
985-
viewParams.image = createSingleChannelImage(viewParams.image.get(),asset::ICPUImageView::SComponentMapping::ES_R,isBlendWeight);
991+
viewParams.image = createSingleChannelImage(viewParams.image.get(),asset::ICPUImageView::SComponentMapping::ES_R);
986992
break;
987993
case CElementTexture::Bitmap::CHANNEL::G:
988-
viewParams.image = createSingleChannelImage(viewParams.image.get(),asset::ICPUImageView::SComponentMapping::ES_G,isBlendWeight);
994+
viewParams.image = createSingleChannelImage(viewParams.image.get(),asset::ICPUImageView::SComponentMapping::ES_G);
989995
break;
990996
case CElementTexture::Bitmap::CHANNEL::B:
991-
viewParams.image = createSingleChannelImage(viewParams.image.get(),asset::ICPUImageView::SComponentMapping::ES_B,isBlendWeight);
997+
viewParams.image = createSingleChannelImage(viewParams.image.get(),asset::ICPUImageView::SComponentMapping::ES_B);
992998
break;
993999
case CElementTexture::Bitmap::CHANNEL::A:
994-
viewParams.image = createSingleChannelImage(viewParams.image.get(),asset::ICPUImageView::SComponentMapping::ES_A,isBlendWeight);
1000+
viewParams.image = createSingleChannelImage(viewParams.image.get(),asset::ICPUImageView::SComponentMapping::ES_A);
9951001
break;
9961002
/* special conversions needed to CIE space
9971003
case CElementTexture::Bitmap::CHANNEL::X:
@@ -1000,16 +1006,16 @@ void CMitsubaLoader::cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const
10001006
case CElementTexture::Bitmap::CHANNEL::INVALID:
10011007
[[fallthrough]];
10021008
default:
1003-
if (isBlendWeight && asset::getFormatChannelCount(viewParams.image->getCreationParameters().format)<3u)
1004-
viewParams.image = createSingleChannelImage(viewParams.image.get(),asset::ICPUImageView::SComponentMapping::ES_R,true);
1009+
if (semantic==CMitsubaMaterialCompilerFrontend::EIVS_BLEND_WEIGHT && asset::getFormatChannelCount(viewParams.image->getCreationParameters().format)<3u)
1010+
viewParams.image = createSingleChannelImage(viewParams.image.get(),asset::ICPUImageView::SComponentMapping::ES_IDENTITY);
10051011
break;
10061012
}
10071013
}
10081014
break;
1009-
case SContext::EIVS_NORMAL_MAP:
1015+
case CMitsubaMaterialCompilerFrontend::EIVS_NORMAL_MAP:
10101016
viewParams.image = createDerivMap(ctx,viewParams.image.get(),samplerParams,true);
10111017
break;
1012-
case SContext::EIVS_BUMP_MAP:
1018+
case CMitsubaMaterialCompilerFrontend::EIVS_BUMP_MAP:
10131019
viewParams.image = createDerivMap(ctx,viewParams.image.get(),samplerParams,false);
10141020
break;
10151021
default:
@@ -1075,7 +1081,7 @@ auto CMitsubaLoader::getBSDFtreeTraversal(SContext& ctx, const CElementBSDF* bsd
10751081
auto CMitsubaLoader::genBSDFtreeTraversal(SContext& ctx, const CElementBSDF* _bsdf) -> SContext::bsdf_type
10761082
{
10771083
{
1078-
auto cachePropertyTexture = [&](const auto& const_or_tex, const SContext::E_IMAGE_VIEW_SEMANTIC semantic=SContext::EIVS_IDENTITIY) -> void
1084+
auto cachePropertyTexture = [&](const auto& const_or_tex, const CMitsubaMaterialCompilerFrontend::E_IMAGE_VIEW_SEMANTIC semantic=CMitsubaMaterialCompilerFrontend::EIVS_IDENTITIY) -> void
10791085
{
10801086
if (const_or_tex.value.type==SPropertyElementData::INVALID)
10811087
cacheTexture(ctx,0u,const_or_tex.texture,semantic);
@@ -1143,13 +1149,13 @@ auto CMitsubaLoader::genBSDFtreeTraversal(SContext& ctx, const CElementBSDF* _bs
11431149
cachePropertyTexture(bsdf->plastic.alphaV);
11441150
break;
11451151
case CElementBSDF::BUMPMAP:
1146-
cacheTexture(ctx,0u,bsdf->bumpmap.texture,bsdf->bumpmap.wasNormal ? SContext::EIVS_NORMAL_MAP:SContext::EIVS_BUMP_MAP);
1152+
cacheTexture(ctx,0u,bsdf->bumpmap.texture,bsdf->bumpmap.wasNormal ? CMitsubaMaterialCompilerFrontend::EIVS_NORMAL_MAP:CMitsubaMaterialCompilerFrontend::EIVS_BUMP_MAP);
11471153
break;
11481154
case CElementBSDF::BLEND_BSDF:
1149-
cachePropertyTexture(bsdf->blendbsdf.weight,SContext::EIVS_BLEND_WEIGHT);
1155+
cachePropertyTexture(bsdf->blendbsdf.weight,CMitsubaMaterialCompilerFrontend::EIVS_BLEND_WEIGHT);
11501156
break;
11511157
case CElementBSDF::MASK:
1152-
cachePropertyTexture(bsdf->mask.opacity);
1158+
cachePropertyTexture(bsdf->mask.opacity,CMitsubaMaterialCompilerFrontend::EIVS_BLEND_WEIGHT);
11531159
break;
11541160
default: break;
11551161
}

0 commit comments

Comments
 (0)