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); }