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 ...@@ -92,6 +92,7 @@ class VertexAttribute
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_FIXED: return mSize * sizeof(GLfixed); case GL_FIXED: return mSize * sizeof(GLfixed);
case GL_HALF_FLOAT: return mSize * sizeof(GLhalf);
case GL_FLOAT: return mSize * sizeof(GLfloat); case GL_FLOAT: return mSize * sizeof(GLfloat);
default: UNREACHABLE(); return mSize * sizeof(GLfloat); default: UNREACHABLE(); return mSize * sizeof(GLfloat);
} }
......
...@@ -6768,6 +6768,8 @@ void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLbo ...@@ -6768,6 +6768,8 @@ void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLbo
return gl::error(GL_INVALID_VALUE); return gl::error(GL_INVALID_VALUE);
} }
gl::Context *context = gl::getNonLostContext();
switch (type) switch (type)
{ {
case GL_BYTE: case GL_BYTE:
...@@ -6777,6 +6779,17 @@ void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLbo ...@@ -6777,6 +6779,17 @@ void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLbo
case GL_FIXED: case GL_FIXED:
case GL_FLOAT: case GL_FLOAT:
break; break;
case GL_HALF_FLOAT:
if (context && context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
else
{
break;
}
default: default:
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
...@@ -6786,8 +6799,6 @@ void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLbo ...@@ -6786,8 +6799,6 @@ void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLbo
return gl::error(GL_INVALID_VALUE); return gl::error(GL_INVALID_VALUE);
} }
gl::Context *context = gl::getNonLostContext();
if (context) if (context)
{ {
context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr); context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "libGLESv2/Context.h" #include "libGLESv2/Context.h"
#define FLOAT32_ONE_BITS (0x3f800000) #define FLOAT32_ONE_BITS (0x3f800000)
#define FLOAT16_ONE_BITS (0x3c00)
namespace rx namespace rx
{ {
...@@ -386,6 +387,20 @@ const VertexBuffer11::VertexConverter VertexBuffer11::mPossibleTranslations[NUM_ ...@@ -386,6 +387,20 @@ const VertexBuffer11::VertexConverter VertexBuffer11::mPossibleTranslations[NUM_
{ &copyFixedVertexData<4>, false, DXGI_FORMAT_R32G32B32A32_FLOAT, 16 }, { &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 { // GL_FLOAT
{ // unnormalized { // unnormalized
{ &copyVertexData<GLfloat, 1, false, FLOAT32_ONE_BITS>, true, DXGI_FORMAT_R32_FLOAT, 4 }, { &copyVertexData<GLfloat, 1, false, FLOAT32_ONE_BITS>, true, DXGI_FORMAT_R32_FLOAT, 4 },
...@@ -412,7 +427,8 @@ const VertexBuffer11::VertexConverter &VertexBuffer11::getVertexConversion(const ...@@ -412,7 +427,8 @@ const VertexBuffer11::VertexConverter &VertexBuffer11::getVertexConversion(const
case GL_SHORT: typeIndex = 2; break; case GL_SHORT: typeIndex = 2; break;
case GL_UNSIGNED_SHORT: typeIndex = 3; break; case GL_UNSIGNED_SHORT: typeIndex = 3; break;
case GL_FIXED: typeIndex = 4; 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; default: UNREACHABLE(); break;
} }
......
...@@ -60,7 +60,7 @@ class VertexBuffer11 : public VertexBuffer ...@@ -60,7 +60,7 @@ class VertexBuffer11 : public VertexBuffer
unsigned int outputElementSize; unsigned int outputElementSize;
}; };
enum { NUM_GL_VERTEX_ATTRIB_TYPES = 6 }; enum { NUM_GL_VERTEX_ATTRIB_TYPES = 7 };
// This table is used to generate mAttributeTypes. // 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] 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