void GetAttachedShaders(GLuint program, GLsizei mx, GLsizei* count, GLuint* objs) { // workaround for broken GL implementations // some implementations crash if count is a NULL pointer // althougth this is perfectly valid according to the spec GLsizei dummyCount; if (count == NULL) count = &dummyCount; if(arb) { glGetAttachedObjectsARB(static_cast<GLhandleARB>(program), mx, count, reinterpret_cast<GLhandleARB*>(objs)); } else { glGetAttachedShaders(program, mx, count, objs); } }
static inline void dumpCurrentProgramObj(JSONWriter &json) { GLhandleARB programObj = glGetHandleARB(GL_PROGRAM_OBJECT_ARB); if (!programObj) { return; } GLint attached_shaders = 0; glGetProgramivARB(programObj, GL_OBJECT_ATTACHED_OBJECTS_ARB, &attached_shaders); if (!attached_shaders) { return; } GLhandleARB *shaderObjs = new GLhandleARB[attached_shaders]; GLsizei count = 0; glGetAttachedObjectsARB(programObj, attached_shaders, &count, shaderObjs); for (GLsizei i = 0; i < count; ++ i) { dumpShaderObj(json, shaderObjs[i]); } delete [] shaderObjs; }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglGetAttachedObjectsARB(JNIEnv *env, jclass clazz, jint containerObj, jint maxCount, jobject count, jint count_position, jobject obj, jint obj_position, jlong function_pointer) { GLsizei *count_address = ((GLsizei *)safeGetBufferAddress(env, count)) + count_position; GLhandleARB *obj_address = ((GLhandleARB *)(*env)->GetDirectBufferAddress(env, obj)) + obj_position; glGetAttachedObjectsARBPROC glGetAttachedObjectsARB = (glGetAttachedObjectsARBPROC)((intptr_t)function_pointer); glGetAttachedObjectsARB(containerObj, maxCount, count_address, obj_address); }