Commit d3a2d3d7 by Alexis Hetu Committed by Alexis Hétu

New read/write cases for integer types

Added new read/write functionality for integer types. Also added cases for integer types in some utility functions. Change-Id: I5efc7c4957d3a1591b47a5df888a9534776033be Reviewed-on: https://swiftshader-review.googlesource.com/4114Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 506ef481
...@@ -209,49 +209,103 @@ namespace sw ...@@ -209,49 +209,103 @@ namespace sw
template<const int n> template<const int n>
inline unsigned int unorm(float x) inline unsigned int unorm(float x)
{ {
const unsigned int max = 0xFFFFFFFF >> (32 - n); static const unsigned int max = 0xFFFFFFFF >> (32 - n);
static const float maxf = static_cast<float>(max);
if(x > 1) if(x >= 1.0f)
{ {
return max; return max;
} }
else if(x < 0) else if(x <= 0.0f)
{ {
return 0; return 0;
} }
else else
{ {
return (unsigned int)(max * x + 0.5f); return static_cast<unsigned int>(maxf * x + 0.5f);
} }
} }
template<const int n> template<const int n>
inline int snorm(float x) inline int snorm(float x)
{ {
const unsigned int min = 0x80000000 >> (32 - n); static const unsigned int min = 0x80000000 >> (32 - n);
const unsigned int max = 0xFFFFFFFF >> (32 - n + 1); static const unsigned int max = 0xFFFFFFFF >> (32 - n + 1);
const unsigned int range = 0xFFFFFFFF >> (32 - n); static const float maxf = static_cast<float>(max);
static const unsigned int range = 0xFFFFFFFF >> (32 - n);
if(x > 0) if(x >= 0.0f)
{ {
if(x > 1) if(x >= 1.0f)
{ {
return max; return max;
} }
else else
{ {
return (int)(max * x + 0.5f); return static_cast<int>(maxf * x + 0.5f);
} }
} }
else else
{ {
if(x < -1) if(x <= -1.0f)
{ {
return min; return min;
} }
else else
{ {
return (int)(max * x - 0.5f) & range; return static_cast<int>(maxf * x - 0.5f) & range;
}
}
}
template<const int n>
inline unsigned int ucast(float x)
{
static const unsigned int max = 0xFFFFFFFF >> (32 - n);
static const float maxf = static_cast<float>(max);
if(x >= maxf)
{
return max;
}
else if(x <= 0.0f)
{
return 0;
}
else
{
return static_cast<unsigned int>(x + 0.5f);
}
}
template<const int n>
inline int scast(float x)
{
static const unsigned int min = 0x80000000 >> (32 - n);
static const unsigned int max = 0xFFFFFFFF >> (32 - n + 1);
static const float maxf = static_cast<float>(max);
static const unsigned int range = 0xFFFFFFFF >> (32 - n);
if(x > 0.0f)
{
if(x >= maxf)
{
return max;
}
else
{
return static_cast<int>(maxf * x + 0.5f);
}
}
else
{
if(x <= -1.0f)
{
return min;
}
else
{
return static_cast<int>(maxf * x - 0.5f) & range;
} }
} }
} }
......
...@@ -66,9 +66,30 @@ namespace sw ...@@ -66,9 +66,30 @@ namespace sw
case FORMAT_A8: case FORMAT_A8:
*(unsigned char*)element = unorm<8>(color.a); *(unsigned char*)element = unorm<8>(color.a);
break; break;
case FORMAT_R8I_SNORM:
*(char*)element = snorm<8>(color.r);
break;
case FORMAT_R8: case FORMAT_R8:
*(unsigned char*)element = unorm<8>(color.r); *(unsigned char*)element = unorm<8>(color.r);
break; break;
case FORMAT_R8I:
*(char*)element = scast<8>(color.r);
break;
case FORMAT_R8UI:
*(unsigned char*)element = ucast<8>(color.r);
break;
case FORMAT_R16I:
*(short*)element = scast<16>(color.r);
break;
case FORMAT_R16UI:
*(unsigned short*)element = ucast<16>(color.r);
break;
case FORMAT_R32I:
*(int*)element = static_cast<int>(color.r);
break;
case FORMAT_R32UI:
*(unsigned int*)element = static_cast<unsigned int>(color.r);
break;
case FORMAT_R3G3B2: case FORMAT_R3G3B2:
*(unsigned char*)element = (unorm<3>(color.r) << 5) | (unorm<3>(color.g) << 2) | (unorm<2>(color.b) << 0); *(unsigned char*)element = (unorm<3>(color.r) << 5) | (unorm<3>(color.g) << 2) | (unorm<2>(color.b) << 0);
break; break;
...@@ -102,30 +123,117 @@ namespace sw ...@@ -102,30 +123,117 @@ namespace sw
case FORMAT_X8R8G8B8: case FORMAT_X8R8G8B8:
*(unsigned int*)element = 0xFF000000 | (unorm<8>(color.r) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.b) << 0); *(unsigned int*)element = 0xFF000000 | (unorm<8>(color.r) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.b) << 0);
break; break;
case FORMAT_A8B8G8R8I_SNORM:
*(unsigned int*)element = (static_cast<unsigned int>(snorm<8>(color.a)) << 24) |
(static_cast<unsigned int>(snorm<8>(color.b)) << 16) |
(static_cast<unsigned int>(snorm<8>(color.g)) << 8) |
(static_cast<unsigned int>(snorm<8>(color.r)) << 0);
break;
case FORMAT_A8B8G8R8: case FORMAT_A8B8G8R8:
*(unsigned int*)element = (unorm<8>(color.a) << 24) | (unorm<8>(color.b) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0); *(unsigned int*)element = (unorm<8>(color.a) << 24) | (unorm<8>(color.b) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0);
break; break;
case FORMAT_A8B8G8R8I:
*(unsigned int*)element = (static_cast<unsigned int>(scast<8>(color.a)) << 24) |
(static_cast<unsigned int>(scast<8>(color.b)) << 16) |
(static_cast<unsigned int>(scast<8>(color.g)) << 8) |
(static_cast<unsigned int>(scast<8>(color.r)) << 0);
break;
case FORMAT_A8B8G8R8UI:
*(unsigned int*)element = (ucast<8>(color.a) << 24) | (ucast<8>(color.b) << 16) | (ucast<8>(color.g) << 8) | (ucast<8>(color.r) << 0);
break;
case FORMAT_X8B8G8R8I_SNORM:
*(unsigned int*)element = 0x7F000000 |
(static_cast<unsigned int>(snorm<8>(color.b)) << 16) |
(static_cast<unsigned int>(snorm<8>(color.g)) << 8) |
(static_cast<unsigned int>(snorm<8>(color.r)) << 0);
break;
case FORMAT_X8B8G8R8: case FORMAT_X8B8G8R8:
*(unsigned int*)element = 0xFF000000 | (unorm<8>(color.b) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0); *(unsigned int*)element = 0xFF000000 | (unorm<8>(color.b) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0);
break; break;
case FORMAT_X8B8G8R8I:
*(unsigned int*)element = 0x7F000000 |
(static_cast<unsigned int>(scast<8>(color.b)) << 16) |
(static_cast<unsigned int>(scast<8>(color.g)) << 8) |
(static_cast<unsigned int>(scast<8>(color.r)) << 0);
case FORMAT_X8B8G8R8UI:
*(unsigned int*)element = 0xFF000000 | (ucast<8>(color.b) << 16) | (ucast<8>(color.g) << 8) | (ucast<8>(color.r) << 0);
break;
case FORMAT_A2R10G10B10: case FORMAT_A2R10G10B10:
*(unsigned int*)element = (unorm<2>(color.a) << 30) | (unorm<10>(color.r) << 20) | (unorm<10>(color.g) << 10) | (unorm<10>(color.b) << 0); *(unsigned int*)element = (unorm<2>(color.a) << 30) | (unorm<10>(color.r) << 20) | (unorm<10>(color.g) << 10) | (unorm<10>(color.b) << 0);
break; break;
case FORMAT_A2B10G10R10: case FORMAT_A2B10G10R10:
*(unsigned int*)element = (unorm<2>(color.a) << 30) | (unorm<10>(color.b) << 20) | (unorm<10>(color.g) << 10) | (unorm<10>(color.r) << 0); *(unsigned int*)element = (unorm<2>(color.a) << 30) | (unorm<10>(color.b) << 20) | (unorm<10>(color.g) << 10) | (unorm<10>(color.r) << 0);
break; break;
case FORMAT_G8R8I_SNORM:
*(unsigned short*)element = (static_cast<unsigned short>(snorm<8>(color.g)) << 8) |
(static_cast<unsigned short>(snorm<8>(color.r)) << 0);
break;
case FORMAT_G8R8: case FORMAT_G8R8:
*(unsigned int*)element = (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0); *(unsigned short*)element = (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0);
break;
case FORMAT_G8R8I:
*(unsigned short*)element = (static_cast<unsigned short>(scast<8>(color.g)) << 8) |
(static_cast<unsigned short>(scast<8>(color.r)) << 0);
break;
case FORMAT_G8R8UI:
*(unsigned short*)element = (ucast<8>(color.g) << 8) | (ucast<8>(color.r) << 0);
break; break;
case FORMAT_G16R16: case FORMAT_G16R16:
*(unsigned int*)element = (unorm<16>(color.g) << 16) | (unorm<16>(color.r) << 0); *(unsigned int*)element = (unorm<16>(color.g) << 16) | (unorm<16>(color.r) << 0);
break; break;
case FORMAT_G16R16I:
*(unsigned int*)element = (static_cast<unsigned int>(scast<16>(color.g)) << 16) |
(static_cast<unsigned int>(scast<16>(color.r)) << 0);
break;
case FORMAT_G16R16UI:
*(unsigned int*)element = (ucast<16>(color.g) << 16) | (ucast<16>(color.r) << 0);
break;
case FORMAT_G32R32I:
case FORMAT_G32R32UI:
((unsigned int*)element)[0] = static_cast<unsigned int>(color.r);
((unsigned int*)element)[1] = static_cast<unsigned int>(color.g);
break;
case FORMAT_A16B16G16R16: case FORMAT_A16B16G16R16:
((unsigned short*)element)[0] = unorm<16>(color.r); ((unsigned short*)element)[0] = unorm<16>(color.r);
((unsigned short*)element)[1] = unorm<16>(color.g); ((unsigned short*)element)[1] = unorm<16>(color.g);
((unsigned short*)element)[2] = unorm<16>(color.b); ((unsigned short*)element)[2] = unorm<16>(color.b);
((unsigned short*)element)[3] = unorm<16>(color.a); ((unsigned short*)element)[3] = unorm<16>(color.a);
break; break;
case FORMAT_A16B16G16R16I:
((unsigned short*)element)[0] = static_cast<unsigned short>(scast<16>(color.r));
((unsigned short*)element)[1] = static_cast<unsigned short>(scast<16>(color.g));
((unsigned short*)element)[2] = static_cast<unsigned short>(scast<16>(color.b));
((unsigned short*)element)[3] = static_cast<unsigned short>(scast<16>(color.a));
break;
case FORMAT_A16B16G16R16UI:
((unsigned short*)element)[0] = static_cast<unsigned short>(ucast<16>(color.r));
((unsigned short*)element)[1] = static_cast<unsigned short>(ucast<16>(color.g));
((unsigned short*)element)[2] = static_cast<unsigned short>(ucast<16>(color.b));
((unsigned short*)element)[3] = static_cast<unsigned short>(ucast<16>(color.a));
break;
case FORMAT_X16B16G16R16I:
((unsigned short*)element)[0] = static_cast<unsigned short>(scast<16>(color.r));
((unsigned short*)element)[1] = static_cast<unsigned short>(scast<16>(color.g));
((unsigned short*)element)[2] = static_cast<unsigned short>(scast<16>(color.b));
break;
case FORMAT_X16B16G16R16UI:
((unsigned short*)element)[0] = static_cast<unsigned short>(ucast<16>(color.r));
((unsigned short*)element)[1] = static_cast<unsigned short>(ucast<16>(color.g));
((unsigned short*)element)[2] = static_cast<unsigned short>(ucast<16>(color.b));
break;
case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI:
((unsigned int*)element)[0] = static_cast<unsigned int>(color.r);
((unsigned int*)element)[1] = static_cast<unsigned int>(color.g);
((unsigned int*)element)[2] = static_cast<unsigned int>(color.b);
((unsigned int*)element)[3] = static_cast<unsigned int>(color.a);
break;
case FORMAT_X32B32G32R32I:
case FORMAT_X32B32G32R32UI:
((unsigned int*)element)[0] = static_cast<unsigned int>(color.r);
((unsigned int*)element)[1] = static_cast<unsigned int>(color.g);
((unsigned int*)element)[2] = static_cast<unsigned int>(color.b);
break;
case FORMAT_V8U8: case FORMAT_V8U8:
*(unsigned short*)element = (snorm<8>(color.g) << 8) | (snorm<8>(color.r) << 0); *(unsigned short*)element = (snorm<8>(color.g) << 8) | (snorm<8>(color.r) << 0);
break; break;
...@@ -304,9 +412,18 @@ namespace sw ...@@ -304,9 +412,18 @@ namespace sw
b = 0; b = 0;
a = *(unsigned char*)element * (1.0f / 0xFF); a = *(unsigned char*)element * (1.0f / 0xFF);
break; break;
case FORMAT_R8I_SNORM:
r = max((*(signed char*)element) * (1.0f / 0x7F), -1.0f);
break;
case FORMAT_R8: case FORMAT_R8:
r = *(unsigned char*)element * (1.0f / 0xFF); r = *(unsigned char*)element * (1.0f / 0xFF);
break; break;
case FORMAT_R8I:
r = *(signed char*)element;
break;
case FORMAT_R8UI:
r = *(unsigned char*)element;
break;
case FORMAT_R3G3B2: case FORMAT_R3G3B2:
{ {
unsigned char rgb = *(unsigned char*)element; unsigned char rgb = *(unsigned char*)element;
...@@ -412,6 +529,16 @@ namespace sw ...@@ -412,6 +529,16 @@ namespace sw
b = (xrgb & 0x000000FF) * (1.0f / 0x000000FF); b = (xrgb & 0x000000FF) * (1.0f / 0x000000FF);
} }
break; break;
case FORMAT_A8B8G8R8I_SNORM:
{
signed char* abgr = (signed char*)element;
r = max(abgr[0] * (1.0f / 0x7F), -1.0f);
g = max(abgr[1] * (1.0f / 0x7F), -1.0f);
b = max(abgr[2] * (1.0f / 0x7F), -1.0f);
a = max(abgr[3] * (1.0f / 0x7F), -1.0f);
}
break;
case FORMAT_A8B8G8R8: case FORMAT_A8B8G8R8:
{ {
unsigned int abgr = *(unsigned int*)element; unsigned int abgr = *(unsigned int*)element;
...@@ -422,6 +549,35 @@ namespace sw ...@@ -422,6 +549,35 @@ namespace sw
r = (abgr & 0x000000FF) * (1.0f / 0x000000FF); r = (abgr & 0x000000FF) * (1.0f / 0x000000FF);
} }
break; break;
case FORMAT_A8B8G8R8I:
{
signed char* abgr = (signed char*)element;
r = abgr[0];
g = abgr[1];
b = abgr[2];
a = abgr[3];
}
break;
case FORMAT_A8B8G8R8UI:
{
unsigned char* abgr = (unsigned char*)element;
r = abgr[0];
g = abgr[1];
b = abgr[2];
a = abgr[3];
}
break;
case FORMAT_X8B8G8R8I_SNORM:
{
signed char* bgr = (signed char*)element;
r = max(bgr[0] * (1.0f / 0x7F), -1.0f);
g = max(bgr[1] * (1.0f / 0x7F), -1.0f);
b = max(bgr[2] * (1.0f / 0x7F), -1.0f);
}
break;
case FORMAT_X8B8G8R8: case FORMAT_X8B8G8R8:
{ {
unsigned int xbgr = *(unsigned int*)element; unsigned int xbgr = *(unsigned int*)element;
...@@ -431,6 +587,32 @@ namespace sw ...@@ -431,6 +587,32 @@ namespace sw
r = (xbgr & 0x000000FF) * (1.0f / 0x000000FF); r = (xbgr & 0x000000FF) * (1.0f / 0x000000FF);
} }
break; break;
case FORMAT_X8B8G8R8I:
{
signed char* bgr = (signed char*)element;
r = bgr[0];
g = bgr[1];
b = bgr[2];
}
break;
case FORMAT_X8B8G8R8UI:
{
unsigned char* bgr = (unsigned char*)element;
r = bgr[0];
g = bgr[1];
b = bgr[2];
}
break;
case FORMAT_G8R8I_SNORM:
{
signed char* gr = (signed char*)element;
r = (gr[0] & 0xFF00) * (1.0f / 0xFF00);
g = (gr[1] & 0x00FF) * (1.0f / 0x00FF);
}
break;
case FORMAT_G8R8: case FORMAT_G8R8:
{ {
unsigned short gr = *(unsigned short*)element; unsigned short gr = *(unsigned short*)element;
...@@ -439,6 +621,36 @@ namespace sw ...@@ -439,6 +621,36 @@ namespace sw
r = (gr & 0x00FF) * (1.0f / 0x00FF); r = (gr & 0x00FF) * (1.0f / 0x00FF);
} }
break; break;
case FORMAT_G8R8I:
{
signed char* gr = (signed char*)element;
r = gr[0];
g = gr[1];
}
break;
case FORMAT_G8R8UI:
{
unsigned char* gr = (unsigned char*)element;
r = gr[0];
g = gr[1];
}
break;
case FORMAT_R16I:
r = *((short*)element);
break;
case FORMAT_R16UI:
r = *((unsigned short*)element);
break;
case FORMAT_G16R16I:
{
short* gr = (short*)element;
r = gr[0];
g = gr[1];
}
break;
case FORMAT_G16R16: case FORMAT_G16R16:
{ {
unsigned int gr = *(unsigned int*)element; unsigned int gr = *(unsigned int*)element;
...@@ -447,6 +659,14 @@ namespace sw ...@@ -447,6 +659,14 @@ namespace sw
r = (gr & 0x0000FFFF) * (1.0f / 0x0000FFFF); r = (gr & 0x0000FFFF) * (1.0f / 0x0000FFFF);
} }
break; break;
case FORMAT_G16R16UI:
{
unsigned short* gr = (unsigned short*)element;
r = gr[0];
g = gr[1];
}
break;
case FORMAT_A2R10G10B10: case FORMAT_A2R10G10B10:
{ {
unsigned int argb = *(unsigned int*)element; unsigned int argb = *(unsigned int*)element;
...@@ -467,12 +687,110 @@ namespace sw ...@@ -467,12 +687,110 @@ namespace sw
r = (abgr & 0x000003FF) * (1.0f / 0x000003FF); r = (abgr & 0x000003FF) * (1.0f / 0x000003FF);
} }
break; break;
case FORMAT_A16B16G16R16I:
{
short* abgr = (short*)element;
r = abgr[0];
g = abgr[1];
b = abgr[2];
a = abgr[3];
}
break;
case FORMAT_A16B16G16R16: case FORMAT_A16B16G16R16:
r = ((unsigned short*)element)[0] * (1.0f / 0xFFFF); r = ((unsigned short*)element)[0] * (1.0f / 0xFFFF);
g = ((unsigned short*)element)[1] * (1.0f / 0xFFFF); g = ((unsigned short*)element)[1] * (1.0f / 0xFFFF);
b = ((unsigned short*)element)[2] * (1.0f / 0xFFFF); b = ((unsigned short*)element)[2] * (1.0f / 0xFFFF);
a = ((unsigned short*)element)[3] * (1.0f / 0xFFFF); a = ((unsigned short*)element)[3] * (1.0f / 0xFFFF);
break; break;
case FORMAT_A16B16G16R16UI:
{
unsigned short* abgr = (unsigned short*)element;
r = abgr[0];
g = abgr[1];
b = abgr[2];
a = abgr[3];
}
break;
case FORMAT_X16B16G16R16I:
{
short* bgr = (short*)element;
r = bgr[0];
g = bgr[1];
b = bgr[2];
}
break;
case FORMAT_X16B16G16R16UI:
{
unsigned short* bgr = (unsigned short*)element;
r = bgr[0];
g = bgr[1];
b = bgr[2];
}
break;
case FORMAT_A32B32G32R32I:
{
int* abgr = (int*)element;
r = static_cast<float>(abgr[0]);
g = static_cast<float>(abgr[1]);
b = static_cast<float>(abgr[2]);
a = static_cast<float>(abgr[3]);
}
break;
case FORMAT_A32B32G32R32UI:
{
unsigned int* abgr = (unsigned int*)element;
r = static_cast<float>(abgr[0]);
g = static_cast<float>(abgr[1]);
b = static_cast<float>(abgr[2]);
a = static_cast<float>(abgr[3]);
}
break;
case FORMAT_X32B32G32R32I:
{
int* bgr = (int*)element;
r = static_cast<float>(bgr[0]);
g = static_cast<float>(bgr[1]);
b = static_cast<float>(bgr[2]);
}
break;
case FORMAT_X32B32G32R32UI:
{
unsigned int* bgr = (unsigned int*)element;
r = static_cast<float>(bgr[0]);
g = static_cast<float>(bgr[1]);
b = static_cast<float>(bgr[2]);
}
break;
case FORMAT_G32R32I:
{
int* gr = (int*)element;
r = static_cast<float>(gr[0]);
g = static_cast<float>(gr[1]);
}
break;
case FORMAT_G32R32UI:
{
unsigned int* gr = (unsigned int*)element;
r = static_cast<float>(gr[0]);
g = static_cast<float>(gr[1]);
}
break;
case FORMAT_R32I:
r = static_cast<float>(*((int*)element));
break;
case FORMAT_R32UI:
r = static_cast<float>(*((unsigned int*)element));
break;
case FORMAT_V8U8: case FORMAT_V8U8:
{ {
unsigned short vu = *(unsigned short*)element; unsigned short vu = *(unsigned short*)element;
...@@ -1125,8 +1443,11 @@ namespace sw ...@@ -1125,8 +1443,11 @@ namespace sw
case FORMAT_P8: return 1; case FORMAT_P8: return 1;
case FORMAT_A8P8: return 2; case FORMAT_A8P8: return 2;
case FORMAT_A8: return 1; case FORMAT_A8: return 1;
case FORMAT_R8I: return 1;
case FORMAT_R8: return 1; case FORMAT_R8: return 1;
case FORMAT_R3G3B2: return 1; case FORMAT_R3G3B2: return 1;
case FORMAT_R16I: return 2;
case FORMAT_R16UI: return 2;
case FORMAT_A8R3G3B2: return 2; case FORMAT_A8R3G3B2: return 2;
case FORMAT_R5G6B5: return 2; case FORMAT_R5G6B5: return 2;
case FORMAT_A1R5G5B5: return 2; case FORMAT_A1R5G5B5: return 2;
...@@ -1137,17 +1458,42 @@ namespace sw ...@@ -1137,17 +1458,42 @@ namespace sw
case FORMAT_R4G4B4A4: return 2; case FORMAT_R4G4B4A4: return 2;
case FORMAT_R8G8B8: return 3; case FORMAT_R8G8B8: return 3;
case FORMAT_B8G8R8: return 3; case FORMAT_B8G8R8: return 3;
case FORMAT_R32I: return 4;
case FORMAT_R32UI: return 4;
case FORMAT_X8R8G8B8: return 4; case FORMAT_X8R8G8B8: return 4;
// case FORMAT_X8G8R8B8Q: return 4; // case FORMAT_X8G8R8B8Q: return 4;
case FORMAT_A8R8G8B8: return 4; case FORMAT_A8R8G8B8: return 4;
// case FORMAT_A8G8R8B8Q: return 4; // case FORMAT_A8G8R8B8Q: return 4;
case FORMAT_X8B8G8R8I: return 4;
case FORMAT_X8B8G8R8: return 4; case FORMAT_X8B8G8R8: return 4;
case FORMAT_A8B8G8R8I: return 4;
case FORMAT_R8UI: return 1;
case FORMAT_G8R8UI: return 2;
case FORMAT_X8B8G8R8UI: return 4;
case FORMAT_A8B8G8R8UI: return 4;
case FORMAT_A8B8G8R8: return 4; case FORMAT_A8B8G8R8: return 4;
case FORMAT_R8I_SNORM: return 1;
case FORMAT_G8R8I_SNORM: return 2;
case FORMAT_X8B8G8R8I_SNORM: return 4;
case FORMAT_A8B8G8R8I_SNORM: return 4;
case FORMAT_A2R10G10B10: return 4; case FORMAT_A2R10G10B10: return 4;
case FORMAT_A2B10G10R10: return 4; case FORMAT_A2B10G10R10: return 4;
case FORMAT_G8R8I: return 2;
case FORMAT_G8R8: return 2; case FORMAT_G8R8: return 2;
case FORMAT_G16R16I: return 4;
case FORMAT_G16R16UI: return 4;
case FORMAT_G16R16: return 4; case FORMAT_G16R16: return 4;
case FORMAT_G32R32I: return 8;
case FORMAT_G32R32UI: return 8;
case FORMAT_X16B16G16R16I: return 8;
case FORMAT_X16B16G16R16UI: return 8;
case FORMAT_A16B16G16R16I: return 8;
case FORMAT_A16B16G16R16UI: return 8;
case FORMAT_A16B16G16R16: return 8; case FORMAT_A16B16G16R16: return 8;
case FORMAT_X32B32G32R32I: return 16;
case FORMAT_X32B32G32R32UI: return 16;
case FORMAT_A32B32G32R32I: return 16;
case FORMAT_A32B32G32R32UI: return 16;
// Compressed formats // Compressed formats
#if S3TC_SUPPORT #if S3TC_SUPPORT
case FORMAT_DXT1: return 2; // Column of four pixels case FORMAT_DXT1: return 2; // Column of four pixels
...@@ -2370,8 +2716,20 @@ namespace sw ...@@ -2370,8 +2716,20 @@ namespace sw
case FORMAT_A8R8G8B8: case FORMAT_A8R8G8B8:
case FORMAT_A8B8G8R8: case FORMAT_A8B8G8R8:
case FORMAT_G8R8: case FORMAT_G8R8:
case FORMAT_R16UI:
case FORMAT_G16R16: case FORMAT_G16R16:
case FORMAT_G16R16UI:
case FORMAT_X16B16G16R16UI:
case FORMAT_A16B16G16R16: case FORMAT_A16B16G16R16:
case FORMAT_A16B16G16R16UI:
case FORMAT_R32UI:
case FORMAT_G32R32UI:
case FORMAT_X32B32G32R32UI:
case FORMAT_A32B32G32R32UI:
case FORMAT_R8UI:
case FORMAT_G8R8UI:
case FORMAT_X8B8G8R8UI:
case FORMAT_A8B8G8R8UI:
case FORMAT_D32F: case FORMAT_D32F:
case FORMAT_D32F_COMPLEMENTARY: case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_D32F_LOCKABLE: case FORMAT_D32F_LOCKABLE:
...@@ -2386,49 +2744,35 @@ namespace sw ...@@ -2386,49 +2744,35 @@ namespace sw
case FORMAT_YV12_BT709: case FORMAT_YV12_BT709:
case FORMAT_YV12_JFIF: case FORMAT_YV12_JFIF:
return true; return true;
case FORMAT_V8U8: case FORMAT_A8B8G8R8I:
case FORMAT_X8L8V8U8: case FORMAT_A16B16G16R16I:
case FORMAT_V16U16: case FORMAT_A32B32G32R32I:
if(component < 2) case FORMAT_A8B8G8R8I_SNORM:
{
return false;
}
else
{
return true;
}
case FORMAT_A16W16V16U16:
if(component < 3)
{
return false;
}
else
{
return true;
}
case FORMAT_Q8W8V8U8: case FORMAT_Q8W8V8U8:
case FORMAT_Q16W16V16U16: case FORMAT_Q16W16V16U16:
case FORMAT_A32B32G32R32F:
return false; return false;
case FORMAT_R32F: case FORMAT_R32F:
if(component < 1) case FORMAT_R8I:
{ case FORMAT_R16I:
return false; case FORMAT_R32I:
} case FORMAT_R8I_SNORM:
else return component >= 1;
{ case FORMAT_V8U8:
return true; case FORMAT_X8L8V8U8:
} case FORMAT_V16U16:
case FORMAT_G32R32F: case FORMAT_G32R32F:
if(component < 2) case FORMAT_G8R8I:
{ case FORMAT_G16R16I:
return false; case FORMAT_G32R32I:
} case FORMAT_G8R8I_SNORM:
else return component >= 2;
{ case FORMAT_A16W16V16U16:
return true; case FORMAT_X8B8G8R8I:
} case FORMAT_X16B16G16R16I:
case FORMAT_A32B32G32R32F: case FORMAT_X32B32G32R32I:
return false; case FORMAT_X8B8G8R8I_SNORM:
return component >= 3;
default: default:
ASSERT(false); ASSERT(false);
} }
...@@ -2580,12 +2924,35 @@ namespace sw ...@@ -2580,12 +2924,35 @@ namespace sw
{ {
case FORMAT_R5G6B5: return 3; case FORMAT_R5G6B5: return 3;
case FORMAT_X8R8G8B8: return 3; case FORMAT_X8R8G8B8: return 3;
case FORMAT_X8B8G8R8I: return 3;
case FORMAT_X8B8G8R8: return 3; case FORMAT_X8B8G8R8: return 3;
case FORMAT_A8R8G8B8: return 4; case FORMAT_A8R8G8B8: return 4;
case FORMAT_A8B8G8R8I: return 4;
case FORMAT_A8B8G8R8: return 4; case FORMAT_A8B8G8R8: return 4;
case FORMAT_G8R8I: return 2;
case FORMAT_G8R8: return 2; case FORMAT_G8R8: return 2;
case FORMAT_R8I_SNORM: return 1;
case FORMAT_G8R8I_SNORM: return 2;
case FORMAT_X8B8G8R8I_SNORM:return 3;
case FORMAT_A8B8G8R8I_SNORM:return 4;
case FORMAT_R8UI: return 1;
case FORMAT_G8R8UI: return 2;
case FORMAT_X8B8G8R8UI: return 3;
case FORMAT_A8B8G8R8UI: return 4;
case FORMAT_G16R16I: return 2;
case FORMAT_G16R16UI: return 2;
case FORMAT_G16R16: return 2; case FORMAT_G16R16: return 2;
case FORMAT_G32R32I: return 2;
case FORMAT_G32R32UI: return 2;
case FORMAT_X16B16G16R16I: return 3;
case FORMAT_X16B16G16R16UI: return 3;
case FORMAT_A16B16G16R16I: return 4;
case FORMAT_A16B16G16R16UI: return 4;
case FORMAT_A16B16G16R16: return 4; case FORMAT_A16B16G16R16: return 4;
case FORMAT_X32B32G32R32I: return 3;
case FORMAT_X32B32G32R32UI: return 3;
case FORMAT_A32B32G32R32I: return 4;
case FORMAT_A32B32G32R32UI: return 4;
case FORMAT_V8U8: return 2; case FORMAT_V8U8: return 2;
case FORMAT_Q8W8V8U8: return 4; case FORMAT_Q8W8V8U8: return 4;
case FORMAT_X8L8V8U8: return 3; case FORMAT_X8L8V8U8: return 3;
...@@ -2595,11 +2962,17 @@ namespace sw ...@@ -2595,11 +2962,17 @@ namespace sw
case FORMAT_R32F: return 1; case FORMAT_R32F: return 1;
case FORMAT_G32R32F: return 2; case FORMAT_G32R32F: return 2;
case FORMAT_A32B32G32R32F: return 4; case FORMAT_A32B32G32R32F: return 4;
case FORMAT_D32F: return 1;
case FORMAT_D32F_LOCKABLE: return 1; case FORMAT_D32F_LOCKABLE: return 1;
case FORMAT_D32FS8_TEXTURE: return 1; case FORMAT_D32FS8_TEXTURE: return 1;
case FORMAT_D32FS8_SHADOW: return 1; case FORMAT_D32FS8_SHADOW: return 1;
case FORMAT_A8: return 1; case FORMAT_A8: return 1;
case FORMAT_R8I: return 1;
case FORMAT_R8: return 1; case FORMAT_R8: return 1;
case FORMAT_R16I: return 1;
case FORMAT_R16UI: return 1;
case FORMAT_R32I: return 1;
case FORMAT_R32UI: return 1;
case FORMAT_L8: return 1; case FORMAT_L8: return 1;
case FORMAT_L16: return 1; case FORMAT_L16: return 1;
case FORMAT_A8L8: return 2; case FORMAT_A8L8: return 2;
...@@ -3457,16 +3830,56 @@ namespace sw ...@@ -3457,16 +3830,56 @@ namespace sw
return FORMAT_A8R8G8B8; return FORMAT_A8R8G8B8;
case FORMAT_A8: case FORMAT_A8:
return FORMAT_A8; return FORMAT_A8;
case FORMAT_R8I:
return FORMAT_R8I;
case FORMAT_R8UI:
return FORMAT_R8UI;
case FORMAT_R8I_SNORM:
return FORMAT_R8I_SNORM;
case FORMAT_R8: case FORMAT_R8:
return FORMAT_R8; return FORMAT_R8;
case FORMAT_R16I:
return FORMAT_R16I;
case FORMAT_R16UI:
return FORMAT_R16UI;
case FORMAT_R32I:
return FORMAT_R32I;
case FORMAT_R32UI:
return FORMAT_R32UI;
case FORMAT_A2R10G10B10: case FORMAT_A2R10G10B10:
case FORMAT_A2B10G10R10: case FORMAT_A2B10G10R10:
case FORMAT_X16B16G16R16I:
case FORMAT_A16B16G16R16I:
return FORMAT_A16B16G16R16I;
case FORMAT_X16B16G16R16UI:
case FORMAT_A16B16G16R16UI:
return FORMAT_A16B16G16R16UI;
case FORMAT_A16B16G16R16: case FORMAT_A16B16G16R16:
return FORMAT_A16B16G16R16; return FORMAT_A16B16G16R16;
case FORMAT_X32B32G32R32I:
case FORMAT_A32B32G32R32I:
return FORMAT_A32B32G32R32I;
case FORMAT_X32B32G32R32UI:
case FORMAT_A32B32G32R32UI:
return FORMAT_A32B32G32R32UI;
case FORMAT_G8R8I:
return FORMAT_G8R8I;
case FORMAT_G8R8UI:
return FORMAT_G8R8UI;
case FORMAT_G8R8I_SNORM:
return FORMAT_G8R8I_SNORM;
case FORMAT_G8R8: case FORMAT_G8R8:
return FORMAT_G8R8; return FORMAT_G8R8;
case FORMAT_G16R16I:
return FORMAT_G16R16I;
case FORMAT_G16R16UI:
return FORMAT_G16R16UI;
case FORMAT_G16R16: case FORMAT_G16R16:
return FORMAT_G16R16; return FORMAT_G16R16;
case FORMAT_G32R32I:
return FORMAT_G32R32I;
case FORMAT_G32R32UI:
return FORMAT_G32R32UI;
case FORMAT_A8R8G8B8: case FORMAT_A8R8G8B8:
if(lockable || !quadLayoutEnabled) if(lockable || !quadLayoutEnabled)
{ {
...@@ -3476,6 +3889,12 @@ namespace sw ...@@ -3476,6 +3889,12 @@ namespace sw
{ {
return FORMAT_A8G8R8B8Q; return FORMAT_A8G8R8B8Q;
} }
case FORMAT_A8B8G8R8I:
return FORMAT_A8B8G8R8I;
case FORMAT_A8B8G8R8UI:
return FORMAT_A8B8G8R8UI;
case FORMAT_A8B8G8R8I_SNORM:
return FORMAT_A8B8G8R8I_SNORM;
case FORMAT_R5G5B5A1: case FORMAT_R5G5B5A1:
case FORMAT_R4G4B4A4: case FORMAT_R4G4B4A4:
case FORMAT_A8B8G8R8: case FORMAT_A8B8G8R8:
...@@ -3495,6 +3914,12 @@ namespace sw ...@@ -3495,6 +3914,12 @@ namespace sw
{ {
return FORMAT_X8G8R8B8Q; return FORMAT_X8G8R8B8Q;
} }
case FORMAT_X8B8G8R8I:
return FORMAT_X8B8G8R8I;
case FORMAT_X8B8G8R8UI:
return FORMAT_X8B8G8R8UI;
case FORMAT_X8B8G8R8I_SNORM:
return FORMAT_X8B8G8R8I_SNORM;
case FORMAT_B8G8R8: case FORMAT_B8G8R8:
case FORMAT_X8B8G8R8: case FORMAT_X8B8G8R8:
return FORMAT_X8B8G8R8; return FORMAT_X8B8G8R8;
...@@ -3599,6 +4024,7 @@ namespace sw ...@@ -3599,6 +4024,7 @@ namespace sw
{ {
return FORMAT_D32F; return FORMAT_D32F;
} }
case FORMAT_D32F: return FORMAT_D32F;
case FORMAT_D32F_LOCKABLE: return FORMAT_D32F_LOCKABLE; case FORMAT_D32F_LOCKABLE: return FORMAT_D32F_LOCKABLE;
case FORMAT_D32FS8_TEXTURE: return FORMAT_D32FS8_TEXTURE; case FORMAT_D32FS8_TEXTURE: return FORMAT_D32FS8_TEXTURE;
case FORMAT_INTZ: return FORMAT_D32FS8_TEXTURE; case FORMAT_INTZ: return FORMAT_D32FS8_TEXTURE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment