summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Software/TextureSampler.cpp
diff options
context:
space:
mode:
authorPierre Bourdon <delroth@gmail.com>2016-06-24 10:43:46 +0200
committerPierre Bourdon <delroth@gmail.com>2016-06-24 10:43:46 +0200
commit3570c7f03a2aa90aa634f96c0af1969af610f14d (patch)
tree4252e03c0e853ba7cffe022937698c854ad0eaa9 /Source/Core/VideoBackends/Software/TextureSampler.cpp
parent2115e8a4a6814e32107b5205ff5c95bbd3c6e99c (diff)
Reformat all the things. Have fun with merge conflicts.
Diffstat (limited to 'Source/Core/VideoBackends/Software/TextureSampler.cpp')
-rw-r--r--Source/Core/VideoBackends/Software/TextureSampler.cpp412
1 files changed, 210 insertions, 202 deletions
diff --git a/Source/Core/VideoBackends/Software/TextureSampler.cpp b/Source/Core/VideoBackends/Software/TextureSampler.cpp
index b5049cb6a3..648dd7446b 100644
--- a/Source/Core/VideoBackends/Software/TextureSampler.cpp
+++ b/Source/Core/VideoBackends/Software/TextureSampler.cpp
@@ -17,224 +17,232 @@
namespace TextureSampler
{
-
static inline void WrapCoord(int* coordp, int wrapMode, int imageSize)
{
- int coord = *coordp;
- switch (wrapMode)
- {
- case 0: // clamp
- coord = (coord>imageSize)?imageSize:(coord<0)?0:coord;
- break;
- case 1: // wrap
- coord = coord % (imageSize + 1);
- coord = (coord<0)?imageSize+coord:coord;
- break;
- case 2: // mirror
- {
- int sizePlus1 = imageSize + 1;
- int div = coord / sizePlus1;
- coord = coord - (div * sizePlus1);
- coord = (coord<0)?-coord:coord;
- coord = (div&1)?imageSize - coord:coord;
- }
- break;
- }
- *coordp = coord;
+ int coord = *coordp;
+ switch (wrapMode)
+ {
+ case 0: // clamp
+ coord = (coord > imageSize) ? imageSize : (coord < 0) ? 0 : coord;
+ break;
+ case 1: // wrap
+ coord = coord % (imageSize + 1);
+ coord = (coord < 0) ? imageSize + coord : coord;
+ break;
+ case 2: // mirror
+ {
+ int sizePlus1 = imageSize + 1;
+ int div = coord / sizePlus1;
+ coord = coord - (div * sizePlus1);
+ coord = (coord < 0) ? -coord : coord;
+ coord = (div & 1) ? imageSize - coord : coord;
+ }
+ break;
+ }
+ *coordp = coord;
}
-static inline void SetTexel(u8 *inTexel, u32 *outTexel, u32 fract)
+static inline void SetTexel(u8* inTexel, u32* outTexel, u32 fract)
{
- outTexel[0] = inTexel[0] * fract;
- outTexel[1] = inTexel[1] * fract;
- outTexel[2] = inTexel[2] * fract;
- outTexel[3] = inTexel[3] * fract;
+ outTexel[0] = inTexel[0] * fract;
+ outTexel[1] = inTexel[1] * fract;
+ outTexel[2] = inTexel[2] * fract;
+ outTexel[3] = inTexel[3] * fract;
}
-static inline void AddTexel(u8 *inTexel, u32 *outTexel, u32 fract)
+static inline void AddTexel(u8* inTexel, u32* outTexel, u32 fract)
{
- outTexel[0] += inTexel[0] * fract;
- outTexel[1] += inTexel[1] * fract;
- outTexel[2] += inTexel[2] * fract;
- outTexel[3] += inTexel[3] * fract;
+ outTexel[0] += inTexel[0] * fract;
+ outTexel[1] += inTexel[1] * fract;
+ outTexel[2] += inTexel[2] * fract;
+ outTexel[3] += inTexel[3] * fract;
}
-void Sample(s32 s, s32 t, s32 lod, bool linear, u8 texmap, u8 *sample)
+void Sample(s32 s, s32 t, s32 lod, bool linear, u8 texmap, u8* sample)
{
- int baseMip = 0;
- bool mipLinear = false;
+ int baseMip = 0;
+ bool mipLinear = false;
#if (ALLOW_MIPMAP)
- FourTexUnits& texUnit = bpmem.tex[(texmap >> 2) & 1];
- TexMode0& tm0 = texUnit.texMode0[texmap & 3];
-
- s32 lodFract = lod & 0xf;
-
- if (lod > 0 && SamplerCommon::AreBpTexMode0MipmapsEnabled(tm0))
- {
- // use mipmap
- baseMip = lod >> 4;
- mipLinear = (lodFract && tm0.min_filter & TexMode0::TEXF_LINEAR);
-
- // if using nearest mip filter and lodFract >= 0.5 round up to next mip
- baseMip += (lodFract >> 3) & (tm0.min_filter & TexMode0::TEXF_POINT);
- }
-
- if (mipLinear)
- {
- u8 sampledTex[4];
- u32 texel[4];
-
- SampleMip(s, t, baseMip, linear, texmap, sampledTex);
- SetTexel(sampledTex, texel, (16 - lodFract));
-
- SampleMip(s, t, baseMip + 1, linear, texmap, sampledTex);
- AddTexel(sampledTex, texel, lodFract);
-
- sample[0] = (u8)(texel[0] >> 4);
- sample[1] = (u8)(texel[1] >> 4);
- sample[2] = (u8)(texel[2] >> 4);
- sample[3] = (u8)(texel[3] >> 4);
- }
- else
+ FourTexUnits& texUnit = bpmem.tex[(texmap >> 2) & 1];
+ TexMode0& tm0 = texUnit.texMode0[texmap & 3];
+
+ s32 lodFract = lod & 0xf;
+
+ if (lod > 0 && SamplerCommon::AreBpTexMode0MipmapsEnabled(tm0))
+ {
+ // use mipmap
+ baseMip = lod >> 4;
+ mipLinear = (lodFract && tm0.min_filter & TexMode0::TEXF_LINEAR);
+
+ // if using nearest mip filter and lodFract >= 0.5 round up to next mip
+ baseMip += (lodFract >> 3) & (tm0.min_filter & TexMode0::TEXF_POINT);
+ }
+
+ if (mipLinear)
+ {
+ u8 sampledTex[4];
+ u32 texel[4];
+
+ SampleMip(s, t, baseMip, linear, texmap, sampledTex);
+ SetTexel(sampledTex, texel, (16 - lodFract));
+
+ SampleMip(s, t, baseMip + 1, linear, texmap, sampledTex);
+ AddTexel(sampledTex, texel, lodFract);
+
+ sample[0] = (u8)(texel[0] >> 4);
+ sample[1] = (u8)(texel[1] >> 4);
+ sample[2] = (u8)(texel[2] >> 4);
+ sample[3] = (u8)(texel[3] >> 4);
+ }
+ else
#endif
- {
- SampleMip(s, t, baseMip, linear, texmap, sample);
- }
+ {
+ SampleMip(s, t, baseMip, linear, texmap, sample);
+ }
}
-void SampleMip(s32 s, s32 t, s32 mip, bool linear, u8 texmap, u8 *sample)
+void SampleMip(s32 s, s32 t, s32 mip, bool linear, u8 texmap, u8* sample)
{
- FourTexUnits& texUnit = bpmem.tex[(texmap >> 2) & 1];
- u8 subTexmap = texmap & 3;
-
- TexMode0& tm0 = texUnit.texMode0[subTexmap];
- TexImage0& ti0 = texUnit.texImage0[subTexmap];
- TexTLUT& texTlut = texUnit.texTlut[subTexmap];
- TlutFormat tlutfmt = (TlutFormat) texTlut.tlut_format;
-
- u8 *imageSrc, *imageSrcOdd = nullptr;
- if (texUnit.texImage1[subTexmap].image_type)
- {
- imageSrc = &texMem[texUnit.texImage1[subTexmap].tmem_even * TMEM_LINE_SIZE];
- if (ti0.format == GX_TF_RGBA8)
- imageSrcOdd = &texMem[texUnit.texImage2[subTexmap].tmem_odd * TMEM_LINE_SIZE];
- }
- else
- {
- u32 imageBase = texUnit.texImage3[subTexmap].image_base << 5;
- imageSrc = Memory::GetPointer(imageBase);
- }
-
- int imageWidth = ti0.width;
- int imageHeight = ti0.height;
-
- int tlutAddress = texTlut.tmem_offset << 9;
- const u8* tlut = &texMem[tlutAddress];
-
- // reduce sample location and texture size to mip level
- // move texture pointer to mip location
- if (mip)
- {
- int mipWidth = imageWidth + 1;
- int mipHeight = imageHeight + 1;
-
- int fmtWidth = TexDecoder_GetBlockWidthInTexels(ti0.format);
- int fmtHeight = TexDecoder_GetBlockHeightInTexels(ti0.format);
- int fmtDepth = TexDecoder_GetTexelSizeInNibbles(ti0.format);
-
- imageWidth >>= mip;
- imageHeight >>= mip;
- s >>= mip;
- t >>= mip;
-
- while (mip)
- {
- mipWidth = std::max(mipWidth, fmtWidth);
- mipHeight = std::max(mipHeight, fmtHeight);
- u32 size = (mipWidth * mipHeight * fmtDepth) >> 1;
-
- imageSrc += size;
- mipWidth >>= 1;
- mipHeight >>= 1;
- mip--;
- }
- }
-
- if (linear)
- {
- // offset linear sampling
- s -= 64;
- t -= 64;
-
- // integer part of sample location
- int imageS = s >> 7;
- int imageT = t >> 7;
-
- // linear sampling
- int imageSPlus1 = imageS + 1;
- int fractS = s & 0x7f;
-
- int imageTPlus1 = imageT + 1;
- int fractT = t & 0x7f;
-
- u8 sampledTex[4];
- u32 texel[4];
-
- WrapCoord(&imageS, tm0.wrap_s, imageWidth);
- WrapCoord(&imageT, tm0.wrap_t, imageHeight);
- WrapCoord(&imageSPlus1, tm0.wrap_s, imageWidth);
- WrapCoord(&imageTPlus1, tm0.wrap_t, imageHeight);
-
- if (!(ti0.format == GX_TF_RGBA8 && texUnit.texImage1[subTexmap].image_type))
- {
- TexDecoder_DecodeTexel(sampledTex, imageSrc, imageS, imageT, imageWidth, ti0.format, tlut, tlutfmt);
- SetTexel(sampledTex, texel, (128 - fractS) * (128 - fractT));
-
- TexDecoder_DecodeTexel(sampledTex, imageSrc, imageSPlus1, imageT, imageWidth, ti0.format, tlut, tlutfmt);
- AddTexel(sampledTex, texel, (fractS) * (128 - fractT));
-
- TexDecoder_DecodeTexel(sampledTex, imageSrc, imageS, imageTPlus1, imageWidth, ti0.format, tlut, tlutfmt);
- AddTexel(sampledTex, texel, (128 - fractS) * (fractT));
-
- TexDecoder_DecodeTexel(sampledTex, imageSrc, imageSPlus1, imageTPlus1, imageWidth, ti0.format, tlut, tlutfmt);
- AddTexel(sampledTex, texel, (fractS) * (fractT));
- }
- else
- {
- TexDecoder_DecodeTexelRGBA8FromTmem(sampledTex, imageSrc, imageSrcOdd, imageS, imageT, imageWidth);
- SetTexel(sampledTex, texel, (128 - fractS) * (128 - fractT));
-
- TexDecoder_DecodeTexelRGBA8FromTmem(sampledTex, imageSrc, imageSrcOdd, imageSPlus1, imageT, imageWidth);
- AddTexel(sampledTex, texel, (fractS) * (128 - fractT));
-
- TexDecoder_DecodeTexelRGBA8FromTmem(sampledTex, imageSrc, imageSrcOdd, imageS, imageTPlus1, imageWidth);
- AddTexel(sampledTex, texel, (128 - fractS) * (fractT));
-
- TexDecoder_DecodeTexelRGBA8FromTmem(sampledTex, imageSrc, imageSrcOdd, imageSPlus1, imageTPlus1, imageWidth);
- AddTexel(sampledTex, texel, (fractS) * (fractT));
- }
-
- sample[0] = (u8)(texel[0] >> 14);
- sample[1] = (u8)(texel[1] >> 14);
- sample[2] = (u8)(texel[2] >> 14);
- sample[3] = (u8)(texel[3] >> 14);
- }
- else
- {
- // integer part of sample location
- int imageS = s >> 7;
- int imageT = t >> 7;
-
- // nearest neighbor sampling
- WrapCoord(&imageS, tm0.wrap_s, imageWidth);
- WrapCoord(&imageT, tm0.wrap_t, imageHeight);
-
- if (!(ti0.format == GX_TF_RGBA8 && texUnit.texImage1[subTexmap].image_type))
- TexDecoder_DecodeTexel(sample, imageSrc, imageS, imageT, imageWidth, ti0.format, tlut, tlutfmt);
- else
- TexDecoder_DecodeTexelRGBA8FromTmem(sample, imageSrc, imageSrcOdd, imageS, imageT, imageWidth);
- }
+ FourTexUnits& texUnit = bpmem.tex[(texmap >> 2) & 1];
+ u8 subTexmap = texmap & 3;
+
+ TexMode0& tm0 = texUnit.texMode0[subTexmap];
+ TexImage0& ti0 = texUnit.texImage0[subTexmap];
+ TexTLUT& texTlut = texUnit.texTlut[subTexmap];
+ TlutFormat tlutfmt = (TlutFormat)texTlut.tlut_format;
+
+ u8 *imageSrc, *imageSrcOdd = nullptr;
+ if (texUnit.texImage1[subTexmap].image_type)
+ {
+ imageSrc = &texMem[texUnit.texImage1[subTexmap].tmem_even * TMEM_LINE_SIZE];
+ if (ti0.format == GX_TF_RGBA8)
+ imageSrcOdd = &texMem[texUnit.texImage2[subTexmap].tmem_odd * TMEM_LINE_SIZE];
+ }
+ else
+ {
+ u32 imageBase = texUnit.texImage3[subTexmap].image_base << 5;
+ imageSrc = Memory::GetPointer(imageBase);
+ }
+
+ int imageWidth = ti0.width;
+ int imageHeight = ti0.height;
+
+ int tlutAddress = texTlut.tmem_offset << 9;
+ const u8* tlut = &texMem[tlutAddress];
+
+ // reduce sample location and texture size to mip level
+ // move texture pointer to mip location
+ if (mip)
+ {
+ int mipWidth = imageWidth + 1;
+ int mipHeight = imageHeight + 1;
+
+ int fmtWidth = TexDecoder_GetBlockWidthInTexels(ti0.format);
+ int fmtHeight = TexDecoder_GetBlockHeightInTexels(ti0.format);
+ int fmtDepth = TexDecoder_GetTexelSizeInNibbles(ti0.format);
+
+ imageWidth >>= mip;
+ imageHeight >>= mip;
+ s >>= mip;
+ t >>= mip;
+
+ while (mip)
+ {
+ mipWidth = std::max(mipWidth, fmtWidth);
+ mipHeight = std::max(mipHeight, fmtHeight);
+ u32 size = (mipWidth * mipHeight * fmtDepth) >> 1;
+
+ imageSrc += size;
+ mipWidth >>= 1;
+ mipHeight >>= 1;
+ mip--;
+ }
+ }
+
+ if (linear)
+ {
+ // offset linear sampling
+ s -= 64;
+ t -= 64;
+
+ // integer part of sample location
+ int imageS = s >> 7;
+ int imageT = t >> 7;
+
+ // linear sampling
+ int imageSPlus1 = imageS + 1;
+ int fractS = s & 0x7f;
+
+ int imageTPlus1 = imageT + 1;
+ int fractT = t & 0x7f;
+
+ u8 sampledTex[4];
+ u32 texel[4];
+
+ WrapCoord(&imageS, tm0.wrap_s, imageWidth);
+ WrapCoord(&imageT, tm0.wrap_t, imageHeight);
+ WrapCoord(&imageSPlus1, tm0.wrap_s, imageWidth);
+ WrapCoord(&imageTPlus1, tm0.wrap_t, imageHeight);
+
+ if (!(ti0.format == GX_TF_RGBA8 && texUnit.texImage1[subTexmap].image_type))
+ {
+ TexDecoder_DecodeTexel(sampledTex, imageSrc, imageS, imageT, imageWidth, ti0.format, tlut,
+ tlutfmt);
+ SetTexel(sampledTex, texel, (128 - fractS) * (128 - fractT));
+
+ TexDecoder_DecodeTexel(sampledTex, imageSrc, imageSPlus1, imageT, imageWidth, ti0.format,
+ tlut, tlutfmt);
+ AddTexel(sampledTex, texel, (fractS) * (128 - fractT));
+
+ TexDecoder_DecodeTexel(sampledTex, imageSrc, imageS, imageTPlus1, imageWidth, ti0.format,
+ tlut, tlutfmt);
+ AddTexel(sampledTex, texel, (128 - fractS) * (fractT));
+
+ TexDecoder_DecodeTexel(sampledTex, imageSrc, imageSPlus1, imageTPlus1, imageWidth, ti0.format,
+ tlut, tlutfmt);
+ AddTexel(sampledTex, texel, (fractS) * (fractT));
+ }
+ else
+ {
+ TexDecoder_DecodeTexelRGBA8FromTmem(sampledTex, imageSrc, imageSrcOdd, imageS, imageT,
+ imageWidth);
+ SetTexel(sampledTex, texel, (128 - fractS) * (128 - fractT));
+
+ TexDecoder_DecodeTexelRGBA8FromTmem(sampledTex, imageSrc, imageSrcOdd, imageSPlus1, imageT,
+ imageWidth);
+ AddTexel(sampledTex, texel, (fractS) * (128 - fractT));
+
+ TexDecoder_DecodeTexelRGBA8FromTmem(sampledTex, imageSrc, imageSrcOdd, imageS, imageTPlus1,
+ imageWidth);
+ AddTexel(sampledTex, texel, (128 - fractS) * (fractT));
+
+ TexDecoder_DecodeTexelRGBA8FromTmem(sampledTex, imageSrc, imageSrcOdd, imageSPlus1,
+ imageTPlus1, imageWidth);
+ AddTexel(sampledTex, texel, (fractS) * (fractT));
+ }
+
+ sample[0] = (u8)(texel[0] >> 14);
+ sample[1] = (u8)(texel[1] >> 14);
+ sample[2] = (u8)(texel[2] >> 14);
+ sample[3] = (u8)(texel[3] >> 14);
+ }
+ else
+ {
+ // integer part of sample location
+ int imageS = s >> 7;
+ int imageT = t >> 7;
+
+ // nearest neighbor sampling
+ WrapCoord(&imageS, tm0.wrap_s, imageWidth);
+ WrapCoord(&imageT, tm0.wrap_t, imageHeight);
+
+ if (!(ti0.format == GX_TF_RGBA8 && texUnit.texImage1[subTexmap].image_type))
+ TexDecoder_DecodeTexel(sample, imageSrc, imageS, imageT, imageWidth, ti0.format, tlut,
+ tlutfmt);
+ else
+ TexDecoder_DecodeTexelRGBA8FromTmem(sample, imageSrc, imageSrcOdd, imageS, imageT,
+ imageWidth);
+ }
}
-
}