Added support for HALF_FLOAT vertex attributes.

TRAC #22703 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2091 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent ee2a86ad
......@@ -92,6 +92,7 @@ class VertexAttribute
case GL_SHORT: return mSize * sizeof(GLshort);
case GL_UNSIGNED_SHORT: return mSize * sizeof(GLushort);
case GL_FIXED: return mSize * sizeof(GLfixed);
case GL_HALF_FLOAT: return mSize * sizeof(GLhalf);
case GL_FLOAT: return mSize * sizeof(GLfloat);
default: UNREACHABLE(); return mSize * sizeof(GLfloat);
}
......
......@@ -6768,6 +6768,8 @@ void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLbo
return gl::error(GL_INVALID_VALUE);
}
gl::Context *context = gl::getNonLostContext();
switch (type)
{
case GL_BYTE:
......@@ -6777,6 +6779,17 @@ void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLbo
case GL_FIXED:
case GL_FLOAT:
break;
case GL_HALF_FLOAT:
if (context && context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
else
{
break;
}
default:
return gl::error(GL_INVALID_ENUM);
}
......@@ -6786,8 +6799,6 @@ void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLbo
return gl::error(GL_INVALID_VALUE);
}
gl::Context *context = gl::getNonLostContext();
if (context)
{
context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
......
......@@ -15,6 +15,7 @@
#include "libGLESv2/Context.h"
#define FLOAT32_ONE_BITS (0x3f800000)
#define FLOAT16_ONE_BITS (0x3c00)
namespace rx
{
......@@ -386,6 +387,20 @@ const VertexBuffer11::VertexConverter VertexBuffer11::mPossibleTranslations[NUM_
{ &copyFixedVertexData<4>, false, DXGI_FORMAT_R32G32B32A32_FLOAT, 16 },
},
},
{ // GL_HALF_FLOAT
{ // unnormalized
{ &copyVertexData<GLhalf, 1, false, FLOAT16_ONE_BITS>, true, DXGI_FORMAT_R16_FLOAT, 2 },
{ &copyVertexData<GLhalf, 2, false, FLOAT16_ONE_BITS>, true, DXGI_FORMAT_R16G16_FLOAT, 4 },
{ &copyVertexData<GLhalf, 3, true, FLOAT16_ONE_BITS>, false, DXGI_FORMAT_R16G16B16A16_FLOAT, 8 },
{ &copyVertexData<GLhalf, 4, false, FLOAT16_ONE_BITS>, true, DXGI_FORMAT_R16G16B16A16_FLOAT, 8 },
},
{ // normalized
{ &copyVertexData<GLhalf, 1, false, FLOAT16_ONE_BITS>, true, DXGI_FORMAT_R16_FLOAT, 2 },
{ &copyVertexData<GLhalf, 2, false, FLOAT16_ONE_BITS>, true, DXGI_FORMAT_R16G16_FLOAT, 4 },
{ &copyVertexData<GLhalf, 3, true, FLOAT16_ONE_BITS>, false, DXGI_FORMAT_R16G16B16A16_FLOAT, 8 },
{ &copyVertexData<GLhalf, 4, false, FLOAT16_ONE_BITS>, true, DXGI_FORMAT_R16G16B16A16_FLOAT, 8 },
},
},
{ // GL_FLOAT
{ // unnormalized
{ &copyVertexData<GLfloat, 1, false, FLOAT32_ONE_BITS>, true, DXGI_FORMAT_R32_FLOAT, 4 },
......@@ -412,7 +427,8 @@ const VertexBuffer11::VertexConverter &VertexBuffer11::getVertexConversion(const
case GL_SHORT: typeIndex = 2; break;
case GL_UNSIGNED_SHORT: typeIndex = 3; break;
case GL_FIXED: typeIndex = 4; break;
case GL_FLOAT: typeIndex = 5; break;
case GL_HALF_FLOAT: typeIndex = 5; break;
case GL_FLOAT: typeIndex = 6; break;
default: UNREACHABLE(); break;
}
......
......@@ -60,7 +60,7 @@ class VertexBuffer11 : public VertexBuffer
unsigned int outputElementSize;
};
enum { NUM_GL_VERTEX_ATTRIB_TYPES = 6 };
enum { NUM_GL_VERTEX_ATTRIB_TYPES = 7 };
// This table is used to generate mAttributeTypes.
static const VertexConverter mPossibleTranslations[NUM_GL_VERTEX_ATTRIB_TYPES][2][4]; // [GL types as enumerated by typeIndex()][normalized][size - 1]
......
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