return to;
}
+///////////////////////////////////////////////////////////////////
+// function: pack_array
+///////////////////////////////////////////////////////////////////
+// info:
+// Pack array param to buffer
+// params:
+// char *to - destination buffer
+// va_list *args - array size and array (pointer)
+// uint32_t element_size - size of array element
+// return:
+// char * - destination pointer end after pack
+static char *pack_array(char *to, va_list *args, uint32_t element_size)
+{
+ uint32_t d;
+ uint64_t p;
+
+ // get array elements count
+ d = va_arg(*args, uint32_t);
+ // get array pointer
+ p = (unsigned long)(uintptr_t)va_arg(*args, uint64_t);
+
+ // pack original pointer
+ memcpy(to, &p, sizeof(p));
+ to += sizeof(p);
+ // pack array elements count
+ memcpy(to, &d, sizeof(d));
+ to += sizeof(d);
+
+ // pack array elements
+ element_size *= d;
+ memcpy(to, (void *)(long)p, element_size);
+ to += element_size;
+
+ return to;
+}
+
static char __attribute__((used)) *pack_value_by_type(char *to, const char t, va_list *args)
{
uint8_t c;
case 'v':
case 'n':
break;
+ /* pack arrays params */
+ case 'D':
+ /* array of 'd' uint32_t */
+ to = pack_array(to, args, sizeof(d));
+ break;
+ case 'F':
+ /* array of 'f' float */
+ to = pack_array(to, args, sizeof(f));
+ break;
+ case 'W':
+ /* array of 'w' double */
+ to = pack_array(to, args, sizeof(w));
+ break;
default:
to--;
break;
#define MAX_SHADER_LEN (4 * 1024)
#define ADD_LOCAL_BUF_SIZE (1024)
+#define MAX_GL_CONTEXT_VALUE_SIZE (1024)
#define MAX_LOCAL_BUF_SIZE (MAX_SHADER_LEN + ADD_LOCAL_BUF_SIZE)
#define LOCAL_BUF msg_buf
#include "binproto.h"
#include "common_probe_init.h"
-static char contextValue[256];
+static char contextValue[MAX_GL_CONTEXT_VALUE_SIZE];
static enum DaOptions _sopt = OPT_GLES;
static __thread GLenum gl_error_external = GL_NO_ERROR;
BEFORE(glUniform1fv);
glUniform1fvp(location, count, value);
GL_GET_ERROR();
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddp",
- location, count, voidp_to_uint64(value));
+ AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddF",
+ location, count, count * 1, voidp_to_uint64(value));
}
void glUniform2fv(GLint location, GLsizei count, const GLfloat *value) {
BEFORE(glUniform2fv);
glUniform2fvp(location, count, value);
GL_GET_ERROR();
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddp",
- location, count, voidp_to_uint64(value));
+ AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddF",
+ location, count, count * 2, voidp_to_uint64(value));
}
void glUniform3fv(GLint location, GLsizei count, const GLfloat *value) {
BEFORE(glUniform3fv);
glUniform3fvp(location, count, value);
GL_GET_ERROR();
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddp",
- location, count, voidp_to_uint64(value));
+ AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddF",
+ location, count, count * 3, voidp_to_uint64(value));
}
void glUniform4fv(GLint location, GLsizei count, const GLfloat *value) {
BEFORE(glUniform4fv);
glUniform4fvp(location, count, value);
GL_GET_ERROR();
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddp",
- location, count, voidp_to_uint64(value));
+ AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddF",
+ location, count, count * 4, voidp_to_uint64(value));
}
void glUniform1i(GLint location, GLint v0) {
BEFORE(glUniform1iv);
glUniform1ivp(location, count, value);
GL_GET_ERROR();
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddp",
- location, count, voidp_to_uint64(value));
+ AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddD",
+ location, count, count * 1, voidp_to_uint64(value));
}
void glUniform2iv(GLint location, GLsizei count, const GLint *value) {
BEFORE(glUniform2iv);
glUniform2ivp(location, count, value);
GL_GET_ERROR();
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddp",
- location, count, voidp_to_uint64(value));
+ AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddD",
+ location, count, count * 2, voidp_to_uint64(value));
}
void glUniform3iv(GLint location, GLsizei count, const GLint *value) {
BEFORE(glUniform3iv);
glUniform3ivp(location, count, value);
GL_GET_ERROR();
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddp",
- location, count, voidp_to_uint64(value));
+ AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddD",
+ location, count, count * 3, voidp_to_uint64(value));
+}
+
+void glUniform4iv(GLint location, GLsizei count, const GLint *value) {
+ typedef void (*methodType)(GLint, GLsizei, const GLint *);
+ BEFORE(glUniform4iv);
+ glUniform4ivp(location, count, value);
+ GL_GET_ERROR();
+ AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddD",
+ location, count, count * 4, voidp_to_uint64(value));
}
void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose,
BEFORE(glUniformMatrix2fv);
glUniformMatrix2fvp(location, count, transpose, value);
GL_GET_ERROR();
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddxp",
- location, count, (uint64_t)(transpose), voidp_to_uint64(value));
+ AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddxF",
+ location, count, (uint64_t)(transpose), count * 2 * 2,
+ voidp_to_uint64(value));
}
void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose,
BEFORE(glUniformMatrix3fv);
glUniformMatrix3fvp(location, count, transpose, value);
GL_GET_ERROR();
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddxp",
- location, count, (uint64_t)(transpose), voidp_to_uint64(value));
+ AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddxF",
+ location, count, (uint64_t)(transpose), count * 3 * 3,
+ voidp_to_uint64(value));
}
void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose,
BEFORE(glUniformMatrix4fv);
glUniformMatrix4fvp(location, count, transpose, value);
GL_GET_ERROR();
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddxp",
- location, count, (uint64_t)(transpose), voidp_to_uint64(value));
+ AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddxF",
+ location, count, (uint64_t)(transpose), count * 4 * 4,
+ voidp_to_uint64(value));
}
-void glUniform4iv(GLint location, GLsizei count, const GLint *value) {
- typedef void (*methodType)(GLint, GLsizei, const GLint *);
- BEFORE(glUniform4iv);
- glUniform4ivp(location, count, value);
- GL_GET_ERROR();
- AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "ddp",
- location, count, voidp_to_uint64(value));
-}
void glUseProgram(GLuint program) {
typedef void (*methodType)(GLuint);