Shader * GlesGetShaderObject(State * state, GLuint shader) { if (!GlesIsBoundObject(state->shaderFreeList, GLES_MAX_SHADERS, shader)) { GlesRecordInvalidValue(state); return NULL; } return state->shaders + shader; }
GL_API void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices) { State * state = GLES_GET_STATE(); if (count < 0) { GlesRecordInvalidValue(state); return; } if (type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT) { GlesRecordInvalidEnum(state); return; } if (state->elementArrayBuffer) { GLubyte * bufferBase = (GLubyte *) state->buffers[state->elementArrayBuffer].data; if (!bufferBase) { GlesRecordInvalidOperation(state); return; } indices = bufferBase + ((const GLubyte *) indices - (const GLubyte *) NULL); } if (!indices) { return; } if (type == GL_UNSIGNED_BYTE) { const GLubyte * ptr = (const GLubyte *) indices; if (Begin(state, mode)) { while (count-- > 0) { state->drawFunction(state, *ptr++); } End(state); } } else if (type == GL_UNSIGNED_SHORT) { const GLushort * ptr = (const GLushort *) indices; if (Begin(state, mode)) { while (count-- > 0) { state->drawFunction(state, *ptr++); } End(state); } } else { GlesRecordInvalidEnum(state); } }
GL_API void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei *length, char *infolog) { State * state = GLES_GET_STATE(); Shader * shaderObject = GlesGetShaderObject(state, shader); if (!shaderObject) { return; } if (!infolog) { GlesRecordInvalidValue(state); return; } GlesLogExtract(&shaderObject->log, bufsize, infolog, length); }
GL_API void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height) { State * state = GLES_GET_STATE(); if (width < 0 || height < 0) { GlesRecordInvalidValue(state); } else { state->viewport.x = x; state->viewport.y = y; state->viewport.width = width; state->viewport.height = height; state->viewportOrigin.x = x + width / 2.0f; state->viewportOrigin.y = y + height / 2.0f; state->viewportScale.x = width / 2.0f; state->viewportScale.y = height / 2.0f; } }
GL_API void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count) { State * state = GLES_GET_STATE(); if (count < 0) { GlesRecordInvalidValue(state); return; } if (Begin(state, mode)) { while (count-- > 0) { (state->drawFunction)(state, first++); } End(state); } }
GL_API void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufsize, GLsizei *length, char *source) { State * state = GLES_GET_STATE(); GLsizei returnedLength; Shader * shaderObject = GlesGetShaderObject(state, shader); if (!shaderObject) { return; } if (!source) { GlesRecordInvalidValue(state); return; } returnedLength = shaderObject->length + 1 >= bufsize ? bufsize - 1 : shaderObject->length; GlesMemcpy(source, shaderObject->text, returnedLength); source[returnedLength] = '\0'; if (length) { *length = returnedLength; } }
GL_API void GL_APIENTRY glGetShaderIntermediateVIN (GLuint shader, GLsizei bufsize, GLsizei *length, char *intermediate) { State * state = GLES_GET_STATE(); Shader * shaderObject = GlesGetShaderObject(state, shader); GLsizei returnedLength; if (!shaderObject) { return; } if (!intermediate) { GlesRecordInvalidValue(state); return; } returnedLength = shaderObject->size + 1 >= bufsize ? bufsize - 1 : shaderObject->size; GlesMemcpy(intermediate, shaderObject->il, returnedLength); intermediate[returnedLength] = '\0'; if (length) { *length = returnedLength; } }