Added vertex attribute types
Added a few types:
- Half float
- 2_10_10_10_INT
- 2_10_10_10_UINT
Related dEQP tests pass.
Change-Id: I2fb04fee89c3d69367dc2e401ac53d9758add9bf
Reviewed-on: https://swiftshader-review.googlesource.com/5356
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 94b8fe8..6477734 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -210,6 +210,9 @@
case GL_UNSIGNED_INT: return mSize * sizeof(GLuint);
case GL_FIXED: return mSize * sizeof(GLfixed);
case GL_FLOAT: return mSize * sizeof(GLfloat);
+ case GL_HALF_FLOAT: return mSize * sizeof(GLhalf);
+ case GL_INT_2_10_10_10_REV: return sizeof(GLint);
+ case GL_UNSIGNED_INT_2_10_10_10_REV: return sizeof(GLuint);
default: UNREACHABLE(mType); return mSize * sizeof(GLfloat);
}
}
diff --git a/src/OpenGL/libGLESv2/VertexDataManager.cpp b/src/OpenGL/libGLESv2/VertexDataManager.cpp
index ddc9d8d..7f2dd83 100644
--- a/src/OpenGL/libGLESv2/VertexDataManager.cpp
+++ b/src/OpenGL/libGLESv2/VertexDataManager.cpp
@@ -192,6 +192,9 @@
case GL_UNSIGNED_INT: translated[i].type = sw::STREAMTYPE_UINT; break;
case GL_FIXED: translated[i].type = sw::STREAMTYPE_FIXED; break;
case GL_FLOAT: translated[i].type = sw::STREAMTYPE_FLOAT; break;
+ case GL_HALF_FLOAT: translated[i].type = sw::STREAMTYPE_HALF; break;
+ case GL_INT_2_10_10_10_REV: translated[i].type = sw::STREAMTYPE_2_10_10_10_INT; break;
+ case GL_UNSIGNED_INT_2_10_10_10_REV: translated[i].type = sw::STREAMTYPE_2_10_10_10_UINT; break;
default: UNREACHABLE(attrib.mType); translated[i].type = sw::STREAMTYPE_FLOAT; break;
}
diff --git a/src/Renderer/Stream.hpp b/src/Renderer/Stream.hpp
index 9e06cf3..047cf75 100644
--- a/src/Renderer/Stream.hpp
+++ b/src/Renderer/Stream.hpp
@@ -36,6 +36,8 @@
STREAMTYPE_UINT,
STREAMTYPE_FIXED, // Normalization ignored (16.16 format)
STREAMTYPE_HALF, // Normalization ignored
+ STREAMTYPE_2_10_10_10_INT,
+ STREAMTYPE_2_10_10_10_UINT,
STREAMTYPE_LAST = STREAMTYPE_HALF
};
diff --git a/src/Shader/VertexRoutine.cpp b/src/Shader/VertexRoutine.cpp
index e5405ef..626f710 100644
--- a/src/Shader/VertexRoutine.cpp
+++ b/src/Shader/VertexRoutine.cpp
@@ -482,6 +482,50 @@
v.x.w = *Pointer<Float>(source3);
}
break;
+ case STREAMTYPE_2_10_10_10_INT:
+ {
+ Int4 src;
+ src = Insert(src, *Pointer<Int>(source0), 0);
+ src = Insert(src, *Pointer<Int>(source1), 1);
+ src = Insert(src, *Pointer<Int>(source2), 2);
+ src = Insert(src, *Pointer<Int>(source3), 3);
+
+ v.x = Float4((src << 22) >> 22);
+ v.y = Float4((src << 12) >> 22);
+ v.z = Float4((src << 02) >> 22);
+ v.w = Float4(src >> 30);
+
+ if(stream.normalized)
+ {
+ v.x = Max(v.x * Float4(1.0f / 0x1FF), Float4(-1.0f));
+ v.y = Max(v.y * Float4(1.0f / 0x1FF), Float4(-1.0f));
+ v.z = Max(v.z * Float4(1.0f / 0x1FF), Float4(-1.0f));
+ v.w = Max(v.w, Float4(-1.0f));
+ }
+ }
+ break;
+ case STREAMTYPE_2_10_10_10_UINT:
+ {
+ Int4 src;
+ src = Insert(src, *Pointer<Int>(source0), 0);
+ src = Insert(src, *Pointer<Int>(source1), 1);
+ src = Insert(src, *Pointer<Int>(source2), 2);
+ src = Insert(src, *Pointer<Int>(source3), 3);
+
+ v.x = Float4(src & Int4(0x3FF));
+ v.y = Float4((src >> 10) & Int4(0x3FF));
+ v.z = Float4((src >> 20) & Int4(0x3FF));
+ v.w = Float4((src >> 30) & Int4(0x3));
+
+ if(stream.normalized)
+ {
+ v.x *= Float4(1.0f / 0x3FF);
+ v.y *= Float4(1.0f / 0x3FF);
+ v.z *= Float4(1.0f / 0x3FF);
+ v.w *= Float4(1.0f / 0x3);
+ }
+ }
+ break;
default:
ASSERT(false);
}