Commit 25639ea6 by Alexis Hetu Committed by Alexis Hétu

32-bit integer vertex attribute

Added 32-bit signed and unsigned vertex attribute Change-Id: Ibbf9c035294584db71713ae7aeca36b32a8564c0 Reviewed-on: https://swiftshader-review.googlesource.com/4974Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 0f448078
...@@ -179,6 +179,8 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat ...@@ -179,6 +179,8 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat
case GL_UNSIGNED_BYTE: translated[i].type = sw::STREAMTYPE_BYTE; break; case GL_UNSIGNED_BYTE: translated[i].type = sw::STREAMTYPE_BYTE; break;
case GL_SHORT: translated[i].type = sw::STREAMTYPE_SHORT; break; case GL_SHORT: translated[i].type = sw::STREAMTYPE_SHORT; break;
case GL_UNSIGNED_SHORT: translated[i].type = sw::STREAMTYPE_USHORT; break; case GL_UNSIGNED_SHORT: translated[i].type = sw::STREAMTYPE_USHORT; break;
case GL_INT: translated[i].type = sw::STREAMTYPE_INT; break;
case GL_UNSIGNED_INT: translated[i].type = sw::STREAMTYPE_UINT; break;
case GL_FIXED: translated[i].type = sw::STREAMTYPE_FIXED; break; case GL_FIXED: translated[i].type = sw::STREAMTYPE_FIXED; break;
case GL_FLOAT: translated[i].type = sw::STREAMTYPE_FLOAT; break; case GL_FLOAT: translated[i].type = sw::STREAMTYPE_FLOAT; break;
default: UNREACHABLE(attribs[i].mType); translated[i].type = sw::STREAMTYPE_FLOAT; break; default: UNREACHABLE(attribs[i].mType); translated[i].type = sw::STREAMTYPE_FLOAT; break;
......
...@@ -174,6 +174,8 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat ...@@ -174,6 +174,8 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat
case GL_UNSIGNED_BYTE: translated[i].type = sw::STREAMTYPE_BYTE; break; case GL_UNSIGNED_BYTE: translated[i].type = sw::STREAMTYPE_BYTE; break;
case GL_SHORT: translated[i].type = sw::STREAMTYPE_SHORT; break; case GL_SHORT: translated[i].type = sw::STREAMTYPE_SHORT; break;
case GL_UNSIGNED_SHORT: translated[i].type = sw::STREAMTYPE_USHORT; break; case GL_UNSIGNED_SHORT: translated[i].type = sw::STREAMTYPE_USHORT; break;
case GL_INT: translated[i].type = sw::STREAMTYPE_INT; break;
case GL_UNSIGNED_INT: translated[i].type = sw::STREAMTYPE_UINT; break;
case GL_FIXED: translated[i].type = sw::STREAMTYPE_FIXED; break; case GL_FIXED: translated[i].type = sw::STREAMTYPE_FIXED; break;
case GL_FLOAT: translated[i].type = sw::STREAMTYPE_FLOAT; break; case GL_FLOAT: translated[i].type = sw::STREAMTYPE_FLOAT; break;
default: UNREACHABLE(attribs[i].mType); translated[i].type = sw::STREAMTYPE_FLOAT; break; default: UNREACHABLE(attribs[i].mType); translated[i].type = sw::STREAMTYPE_FLOAT; break;
......
...@@ -189,6 +189,8 @@ public: ...@@ -189,6 +189,8 @@ public:
case GL_UNSIGNED_BYTE: return mSize * sizeof(GLubyte); case GL_UNSIGNED_BYTE: return mSize * sizeof(GLubyte);
case GL_SHORT: return mSize * sizeof(GLshort); case GL_SHORT: return mSize * sizeof(GLshort);
case GL_UNSIGNED_SHORT: return mSize * sizeof(GLushort); case GL_UNSIGNED_SHORT: return mSize * sizeof(GLushort);
case GL_INT: return mSize * sizeof(GLint);
case GL_UNSIGNED_INT: return mSize * sizeof(GLuint);
case GL_FIXED: return mSize * sizeof(GLfixed); case GL_FIXED: return mSize * sizeof(GLfixed);
case GL_FLOAT: return mSize * sizeof(GLfloat); case GL_FLOAT: return mSize * sizeof(GLfloat);
default: UNREACHABLE(mType); return mSize * sizeof(GLfloat); default: UNREACHABLE(mType); return mSize * sizeof(GLfloat);
......
...@@ -187,6 +187,8 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat ...@@ -187,6 +187,8 @@ GLenum VertexDataManager::prepareVertexData(GLint start, GLsizei count, Translat
case GL_UNSIGNED_BYTE: translated[i].type = sw::STREAMTYPE_BYTE; break; case GL_UNSIGNED_BYTE: translated[i].type = sw::STREAMTYPE_BYTE; break;
case GL_SHORT: translated[i].type = sw::STREAMTYPE_SHORT; break; case GL_SHORT: translated[i].type = sw::STREAMTYPE_SHORT; break;
case GL_UNSIGNED_SHORT: translated[i].type = sw::STREAMTYPE_USHORT; break; case GL_UNSIGNED_SHORT: translated[i].type = sw::STREAMTYPE_USHORT; break;
case GL_INT: translated[i].type = sw::STREAMTYPE_INT; break;
case GL_UNSIGNED_INT: translated[i].type = sw::STREAMTYPE_UINT; break;
case GL_FIXED: translated[i].type = sw::STREAMTYPE_FIXED; break; case GL_FIXED: translated[i].type = sw::STREAMTYPE_FIXED; break;
case GL_FLOAT: translated[i].type = sw::STREAMTYPE_FLOAT; break; case GL_FLOAT: translated[i].type = sw::STREAMTYPE_FLOAT; break;
default: UNREACHABLE(attrib.mType); translated[i].type = sw::STREAMTYPE_FLOAT; break; default: UNREACHABLE(attrib.mType); translated[i].type = sw::STREAMTYPE_FLOAT; break;
......
...@@ -29,6 +29,8 @@ namespace sw ...@@ -29,6 +29,8 @@ namespace sw
STREAMTYPE_SBYTE, STREAMTYPE_SBYTE,
STREAMTYPE_SHORT, STREAMTYPE_SHORT,
STREAMTYPE_USHORT, STREAMTYPE_USHORT,
STREAMTYPE_INT,
STREAMTYPE_UINT,
STREAMTYPE_FIXED, // Normalization ignored (16.16 format) STREAMTYPE_FIXED, // Normalization ignored (16.16 format)
STREAMTYPE_HALF, // Normalization ignored STREAMTYPE_HALF, // Normalization ignored
......
...@@ -354,12 +354,16 @@ namespace sw ...@@ -354,12 +354,16 @@ namespace sw
static const float4 unscaleSByte = {1.0f / 0x7F, 1.0f / 0x7F, 1.0f / 0x7F, 1.0f / 0x7F}; static const float4 unscaleSByte = {1.0f / 0x7F, 1.0f / 0x7F, 1.0f / 0x7F, 1.0f / 0x7F};
static const float4 unscaleShort = {1.0f / 0x7FFF, 1.0f / 0x7FFF, 1.0f / 0x7FFF, 1.0f / 0x7FFF}; static const float4 unscaleShort = {1.0f / 0x7FFF, 1.0f / 0x7FFF, 1.0f / 0x7FFF, 1.0f / 0x7FFF};
static const float4 unscaleUShort = {1.0f / 0xFFFF, 1.0f / 0xFFFF, 1.0f / 0xFFFF, 1.0f / 0xFFFF}; static const float4 unscaleUShort = {1.0f / 0xFFFF, 1.0f / 0xFFFF, 1.0f / 0xFFFF, 1.0f / 0xFFFF};
static const float4 unscaleInt = {1.0f / 0x7FFFFFFF, 1.0f / 0x7FFFFFFF, 1.0f / 0x7FFFFFFF, 1.0f / 0x7FFFFFFF};
static const float4 unscaleUInt = {1.0f / 0xFFFFFFFF, 1.0f / 0xFFFFFFFF, 1.0f / 0xFFFFFFFF, 1.0f / 0xFFFFFFFF};
static const float4 unscaleFixed = {1.0f / 0x00010000, 1.0f / 0x00010000, 1.0f / 0x00010000, 1.0f / 0x00010000}; static const float4 unscaleFixed = {1.0f / 0x00010000, 1.0f / 0x00010000, 1.0f / 0x00010000, 1.0f / 0x00010000};
memcpy(&this->unscaleByte, &unscaleByte, sizeof(unscaleByte)); memcpy(&this->unscaleByte, &unscaleByte, sizeof(unscaleByte));
memcpy(&this->unscaleSByte, &unscaleSByte, sizeof(unscaleSByte)); memcpy(&this->unscaleSByte, &unscaleSByte, sizeof(unscaleSByte));
memcpy(&this->unscaleShort, &unscaleShort, sizeof(unscaleShort)); memcpy(&this->unscaleShort, &unscaleShort, sizeof(unscaleShort));
memcpy(&this->unscaleUShort, &unscaleUShort, sizeof(unscaleUShort)); memcpy(&this->unscaleUShort, &unscaleUShort, sizeof(unscaleUShort));
memcpy(&this->unscaleInt, &unscaleInt, sizeof(unscaleInt));
memcpy(&this->unscaleUInt, &unscaleUInt, sizeof(unscaleUInt));
memcpy(&this->unscaleFixed, &unscaleFixed, sizeof(unscaleFixed)); memcpy(&this->unscaleFixed, &unscaleFixed, sizeof(unscaleFixed));
for(int i = 0; i <= 0xFFFF; i++) for(int i = 0; i <= 0xFFFF; i++)
......
...@@ -100,6 +100,8 @@ namespace sw ...@@ -100,6 +100,8 @@ namespace sw
float4 unscaleSByte; float4 unscaleSByte;
float4 unscaleShort; float4 unscaleShort;
float4 unscaleUShort; float4 unscaleUShort;
float4 unscaleInt;
float4 unscaleUInt;
float4 unscaleFixed; float4 unscaleFixed;
float half2float[65536]; float half2float[65536];
......
...@@ -253,6 +253,60 @@ namespace sw ...@@ -253,6 +253,60 @@ namespace sw
} }
} }
break; break;
case STREAMTYPE_INT:
{
if(stream.normalized)
{
v.x = Float4(*Pointer<Int4>(source0));
v.y = Float4(*Pointer<Int4>(source1));
v.z = Float4(*Pointer<Int4>(source2));
v.w = Float4(*Pointer<Int4>(source3));
transpose4xN(v.x, v.y, v.z, v.w, stream.count);
if(stream.count >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt));
if(stream.count >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt));
if(stream.count >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt));
if(stream.count >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt));
}
else
{
v.x = As<Float4>(*Pointer<Int4>(source0));
v.y = As<Float4>(*Pointer<Int4>(source1));
v.z = As<Float4>(*Pointer<Int4>(source2));
v.w = As<Float4>(*Pointer<Int4>(source3));
transpose4xN(v.x, v.y, v.z, v.w, stream.count);
}
}
break;
case STREAMTYPE_UINT:
{
if(stream.normalized)
{
v.x = Float4(*Pointer<UInt4>(source0));
v.y = Float4(*Pointer<UInt4>(source1));
v.z = Float4(*Pointer<UInt4>(source2));
v.w = Float4(*Pointer<UInt4>(source3));
transpose4xN(v.x, v.y, v.z, v.w, stream.count);
if(stream.count >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt));
if(stream.count >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt));
if(stream.count >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt));
if(stream.count >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt));
}
else
{
v.x = As<Float4>(*Pointer<UInt4>(source0));
v.y = As<Float4>(*Pointer<UInt4>(source1));
v.z = As<Float4>(*Pointer<UInt4>(source2));
v.w = As<Float4>(*Pointer<UInt4>(source3));
transpose4xN(v.x, v.y, v.z, v.w, stream.count);
}
}
break;
case STREAMTYPE_UDEC3: case STREAMTYPE_UDEC3:
{ {
// FIXME: Vectorize // FIXME: Vectorize
......
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