[3/3] wined3d: Properly load FLOAT16_2 and FLOAT16_4 vertex data

H. Verbeet hverbeet at gmail.com
Wed Aug 1 15:48:54 CDT 2007


Currently we attempt to load this as regular float data, which won't
work of course. To my knowledge NV_half_float is the only way, other
than converting the data before loading it, to load 16 bit float data
in OpenGL. The ARB extension, ARB_half_float_pixel extension, which is
based on NV_half_float does define a 16 bit float type, but explicitly
doesn't include the entrypoints for specifying vertex data.

Changelog:
  - Properly load FLOAT16_2 and FLOAT16_4 vertex data
-------------- next part --------------
---

 dlls/wined3d/drawprim.c        |   12 ++++++++++--
 dlls/wined3d/wined3d_private.h |    7 +++++--
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index f440089..647e9b2 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -818,10 +818,18 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, WineDirect3DVerte
                     /* Are those 16 bit floats. C doesn't have a 16 bit float type. I could read the single bits and calculate a 4
                      * byte float according to the IEEE standard
                      */
-                    FIXME("Unsupported WINED3DDECLTYPE_FLOAT16_2\n");
+                    if (GL_SUPPORT(NV_HALF_FLOAT)) {
+                        GL_EXTCALL(glVertexAttrib2hvNV(instancedData[j], (GLhalfNV *)ptr));
+                    } else {
+                        FIXME("Unsupported WINED3DDECLTYPE_FLOAT16_2\n");
+                    }
                     break;
                 case WINED3DDECLTYPE_FLOAT16_4:
-                    FIXME("Unsupported WINED3DDECLTYPE_FLOAT16_4\n");
+                    if (GL_SUPPORT(NV_HALF_FLOAT)) {
+                        GL_EXTCALL(glVertexAttrib4hvNV(instancedData[j], (GLhalfNV *)ptr));
+                    } else {
+                        FIXME("Unsupported WINED3DDECLTYPE_FLOAT16_4\n");
+                    }
                     break;
 
                 case WINED3DDECLTYPE_UNUSED:
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 18528b8..22c18ca 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -139,8 +139,11 @@ static WINED3DGLTYPE const glTypeLookup[WINED3DDECLTYPE_UNUSED] = {
                                   {WINED3DDECLTYPE_USHORT4N,  4, GL_UNSIGNED_SHORT  , GL_TRUE  ,sizeof(short int)},
                                   {WINED3DDECLTYPE_UDEC3,     3, GL_UNSIGNED_SHORT  , GL_FALSE ,sizeof(short int)},
                                   {WINED3DDECLTYPE_DEC3N,     3, GL_SHORT           , GL_TRUE  ,sizeof(short int)},
-                                  {WINED3DDECLTYPE_FLOAT16_2, 2, GL_FLOAT           , GL_FALSE ,sizeof(short int)},
-                                  {WINED3DDECLTYPE_FLOAT16_4, 4, GL_FLOAT           , GL_FALSE ,sizeof(short int)}};
+                                  /* We should do an extension check for NV_HALF_FLOAT. However, without NV_HALF_FLOAT
+                                   * we won't be able to load the data at all, so at least for the moment it wouldn't
+                                   * gain us much. */
+                                  {WINED3DDECLTYPE_FLOAT16_2, 2, GL_HALF_FLOAT_NV   , GL_FALSE ,sizeof(GLhalfNV)},
+                                  {WINED3DDECLTYPE_FLOAT16_4, 4, GL_HALF_FLOAT_NV   , GL_FALSE ,sizeof(GLhalfNV)}};
 
 #define WINED3D_ATR_TYPE(type)          glTypeLookup[type].d3dType
 #define WINED3D_ATR_SIZE(type)          glTypeLookup[type].size


More information about the wine-patches mailing list