// Auto-generated with: android/scripts/gen-entries.py --mode=dispatch_logging_wrappers stream-servers/gl/OpenGLESDispatch/gles3_extensions.entries --output=stream-servers/gl/OpenGLESDispatch/gles3_extensions_dispatch_logging_wrappers.impl
// DO NOT EDIT THIS FILE

void glVertexAttribIPointerWithDataSize_dispatchLoggingWrapper(GLuint indx, GLint size, GLenum type, GLsizei stride, const GLvoid* ptr, GLsizei dataSize) {
	DISPATCH_DEBUG_LOG("glVertexAttribIPointerWithDataSize(indx:%d, size:%d, type:0x%X, stride:%d, ptr:%p, dataSize:%d)", indx, size, type, stride, ptr, dataSize);
	GLDispatch::glVertexAttribIPointerWithDataSize_underlying(indx, size, type, stride, ptr, dataSize);
}

void glPrimitiveRestartIndex_dispatchLoggingWrapper(GLuint index) {
	DISPATCH_DEBUG_LOG("glPrimitiveRestartIndex(index:%d)", index);
	GLDispatch::glPrimitiveRestartIndex_underlying(index);
}

void glTexBufferOES_dispatchLoggingWrapper(GLenum target, GLenum internalformat, GLuint buffer) {
	DISPATCH_DEBUG_LOG("glTexBufferOES(target:0x%X, internalformat:0x%X, buffer:%d)", target, internalformat, buffer);
	GLDispatch::glTexBufferOES_underlying(target, internalformat, buffer);
}

void glTexBufferRangeOES_dispatchLoggingWrapper(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) {
	DISPATCH_DEBUG_LOG("glTexBufferRangeOES(target:0x%X, internalformat:0x%X, buffer:%d, offset:%ld, size:%ld)", target, internalformat, buffer, offset, size);
	GLDispatch::glTexBufferRangeOES_underlying(target, internalformat, buffer, offset, size);
}

void glTexBufferEXT_dispatchLoggingWrapper(GLenum target, GLenum internalformat, GLuint buffer) {
	DISPATCH_DEBUG_LOG("glTexBufferEXT(target:0x%X, internalformat:0x%X, buffer:%d)", target, internalformat, buffer);
	GLDispatch::glTexBufferEXT_underlying(target, internalformat, buffer);
}

void glTexBufferRangeEXT_dispatchLoggingWrapper(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) {
	DISPATCH_DEBUG_LOG("glTexBufferRangeEXT(target:0x%X, internalformat:0x%X, buffer:%d, offset:%ld, size:%ld)", target, internalformat, buffer, offset, size);
	GLDispatch::glTexBufferRangeEXT_underlying(target, internalformat, buffer, offset, size);
}

void glEnableiEXT_dispatchLoggingWrapper(GLenum cap, GLuint index) {
	DISPATCH_DEBUG_LOG("glEnableiEXT(cap:0x%X, index:%d)", cap, index);
	GLDispatch::glEnableiEXT_underlying(cap, index);
}

void glDisableiEXT_dispatchLoggingWrapper(GLenum cap, GLuint index) {
	DISPATCH_DEBUG_LOG("glDisableiEXT(cap:0x%X, index:%d)", cap, index);
	GLDispatch::glDisableiEXT_underlying(cap, index);
}

void glBlendEquationiEXT_dispatchLoggingWrapper(GLuint buf, GLenum mode) {
	DISPATCH_DEBUG_LOG("glBlendEquationiEXT(buf:%d, mode:0x%X)", buf, mode);
	GLDispatch::glBlendEquationiEXT_underlying(buf, mode);
}

void glBlendEquationSeparateiEXT_dispatchLoggingWrapper(GLuint buf, GLenum modeRGB, GLenum modeAlpha) {
	DISPATCH_DEBUG_LOG("glBlendEquationSeparateiEXT(buf:%d, modeRGB:0x%X, modeAlpha:0x%X)", buf, modeRGB, modeAlpha);
	GLDispatch::glBlendEquationSeparateiEXT_underlying(buf, modeRGB, modeAlpha);
}

void glBlendFunciEXT_dispatchLoggingWrapper(GLuint buf, GLenum sfactor, GLenum dfactor) {
	DISPATCH_DEBUG_LOG("glBlendFunciEXT(buf:%d, sfactor:0x%X, dfactor:0x%X)", buf, sfactor, dfactor);
	GLDispatch::glBlendFunciEXT_underlying(buf, sfactor, dfactor);
}

void glBlendFuncSeparateiEXT_dispatchLoggingWrapper(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) {
	DISPATCH_DEBUG_LOG("glBlendFuncSeparateiEXT(buf:%d, srcRGB:0x%X, dstRGB:0x%X, srcAlpha:0x%X, dstAlpha:0x%X)", buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
	GLDispatch::glBlendFuncSeparateiEXT_underlying(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
}

void glColorMaskiEXT_dispatchLoggingWrapper(GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) {
	DISPATCH_DEBUG_LOG("glColorMaskiEXT(buf:%d, red:%d, green:%d, blue:%d, alpha:%d)", buf, red, green, blue, alpha);
	GLDispatch::glColorMaskiEXT_underlying(buf, red, green, blue, alpha);
}

GLboolean glIsEnablediEXT_dispatchLoggingWrapper(GLenum cap, GLuint index) {
	DISPATCH_DEBUG_LOG("glIsEnablediEXT(cap:0x%X, index:%d)", cap, index);
	return GLDispatch::glIsEnablediEXT_underlying(cap, index);
}

