/* GL locking is done by the caller */ static inline void send_attribute(IWineD3DDeviceImpl *This, WINED3DFORMAT format, const UINT index, const void *ptr) { const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; switch(format) { case WINED3DFMT_R32_FLOAT: GL_EXTCALL(glVertexAttrib1fvARB(index, ptr)); break; case WINED3DFMT_R32G32_FLOAT: GL_EXTCALL(glVertexAttrib2fvARB(index, ptr)); break; case WINED3DFMT_R32G32B32_FLOAT: GL_EXTCALL(glVertexAttrib3fvARB(index, ptr)); break; case WINED3DFMT_R32G32B32A32_FLOAT: GL_EXTCALL(glVertexAttrib4fvARB(index, ptr)); break; case WINED3DFMT_R8G8B8A8_UINT: GL_EXTCALL(glVertexAttrib4ubvARB(index, ptr)); break; case WINED3DFMT_B8G8R8A8_UNORM: if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA]) { const DWORD *src = ptr; DWORD c = *src & 0xff00ff00; c |= (*src & 0xff0000) >> 16; c |= (*src & 0xff) << 16; GL_EXTCALL(glVertexAttrib4NubvARB(index, (GLubyte *)&c)); break; } /* else fallthrough */ case WINED3DFMT_R8G8B8A8_UNORM: GL_EXTCALL(glVertexAttrib4NubvARB(index, ptr)); break; case WINED3DFMT_R16G16_SINT: GL_EXTCALL(glVertexAttrib4svARB(index, ptr)); break; case WINED3DFMT_R16G16B16A16_SINT: GL_EXTCALL(glVertexAttrib4svARB(index, ptr)); break; case WINED3DFMT_R16G16_SNORM: { GLshort s[4] = {((const GLshort *)ptr)[0], ((const GLshort *)ptr)[1], 0, 1}; GL_EXTCALL(glVertexAttrib4NsvARB(index, s)); break; } case WINED3DFMT_R16G16_UNORM: { GLushort s[4] = {((const GLushort *)ptr)[0], ((const GLushort *)ptr)[1], 0, 1}; GL_EXTCALL(glVertexAttrib4NusvARB(index, s)); break; } case WINED3DFMT_R16G16B16A16_SNORM: GL_EXTCALL(glVertexAttrib4NsvARB(index, ptr)); break; case WINED3DFMT_R16G16B16A16_UNORM: GL_EXTCALL(glVertexAttrib4NusvARB(index, ptr)); break; case WINED3DFMT_R10G10B10A2_UINT: FIXME("Unsure about WINED3DDECLTYPE_UDEC3\n"); /*glVertexAttrib3usvARB(instancedData[j], (GLushort *) ptr); Does not exist */ break; case WINED3DFMT_R10G10B10A2_SNORM: FIXME("Unsure about WINED3DDECLTYPE_DEC3N\n"); /*glVertexAttrib3NusvARB(instancedData[j], (GLushort *) ptr); Does not exist */ break; case WINED3DFMT_R16G16_FLOAT: /* 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 */ if (gl_info->supported[NV_HALF_FLOAT]) { /* Not supported by GL_ARB_half_float_vertex */ GL_EXTCALL(glVertexAttrib2hvNV(index, ptr)); } else { float x = float_16_to_32(((const unsigned short *)ptr) + 0); float y = float_16_to_32(((const unsigned short *)ptr) + 1); GL_EXTCALL(glVertexAttrib2fARB(index, x, y)); } break; case WINED3DFMT_R16G16B16A16_FLOAT: if (gl_info->supported[NV_HALF_FLOAT]) { /* Not supported by GL_ARB_half_float_vertex */ GL_EXTCALL(glVertexAttrib4hvNV(index, ptr)); } else { float x = float_16_to_32(((const unsigned short *)ptr) + 0); float y = float_16_to_32(((const unsigned short *)ptr) + 1); float z = float_16_to_32(((const unsigned short *)ptr) + 2); float w = float_16_to_32(((const unsigned short *)ptr) + 3); GL_EXTCALL(glVertexAttrib4fARB(index, x, y, z, w)); } break; default: ERR("Unexpected attribute format: %s\n", debug_d3dformat(format)); break; } }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexProgram_nglVertexAttrib4NsvARB__IJ(JNIEnv *__env, jclass clazz, jint index, jlong vAddress) { glVertexAttrib4NsvARBPROC glVertexAttrib4NsvARB = (glVertexAttrib4NsvARBPROC)tlsGetFunction(1426); intptr_t v = (intptr_t)vAddress; UNUSED_PARAM(clazz) glVertexAttrib4NsvARB(index, v); }