emulator opengl - encode glShaderSource

glShaderSource strings are concatenated into a single string
before sent over the wire protocol. The wire protocol transfer is
done using a special api call 'glShaderString'

Change-Id: I90c157df66fe82fee17c460a1e7852d370c77088
This commit is contained in:
Jacky Romano
2011-04-23 20:19:39 +03:00
committed by David 'Digit' Turner
parent d10c96517b
commit 0c814b227c
5 changed files with 50 additions and 22 deletions

View File

@@ -363,24 +363,37 @@ int glUtilsPixelBitSize(GLenum format, GLenum type)
return pixelsize; return pixelsize;
} }
// pack a list of strings into one.
int glUtilsSumArrayValues(GLint *array, GLsizei count) void glUtilsPackStrings(char *ptr, char **strings, GLint *length, GLsizei count)
{ {
int sum = 0; char *p = ptr;
*p = '\0';
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
sum += *array; int l;
array++; if (length == NULL || length[i] < 0) {
l = strlen(strings[i]);
strcat(p, strings[i]);
} else {
l = length[i];
strncat(p, strings[i], l);
} }
return sum; p += l;
}
void glUtilsPackStrings(void *ptr, char **strings, GLint *length, GLsizei count)
{
unsigned char *p = (unsigned char *)ptr;
for (int i = 0; i < count; i++) {
memcpy(p, *strings, *length);
p += *length;
strings++;
length++;
} }
} }
// claculate the length of a list of strings
int glUtilsCalcShaderSourceLen( char **strings, GLint *length, GLsizei count)
{
int len = 0;
for (int i = 0; i < count; i++) {
int l;
if (length == NULL || length[i] < 0) {
l = strlen(strings[i]);
} else {
l = length[i];
}
len += l;
}
return len;
}

View File

@@ -52,8 +52,8 @@ extern "C" {
int size, GLenum type, unsigned int stride, int size, GLenum type, unsigned int stride,
unsigned int datalen); unsigned int datalen);
int glUtilsPixelBitSize(GLenum format, GLenum type); int glUtilsPixelBitSize(GLenum format, GLenum type);
int glUtilsSumArrayValues(GLint *array, GLsizei count); void glUtilsPackStrings(char *ptr, char **strings, GLint *length, GLsizei count);
void glUtilsPackStrings(void *ptr, char **strings, GLint *length, GLsizei count); int glUtilsCalcShaderSourceLen(char **strings, GLint *length, GLsizei count);
#ifdef __cplusplus #ifdef __cplusplus
}; };
#endif #endif

View File

@@ -25,6 +25,7 @@ GL2Encoder::GL2Encoder(IOStream *stream) : gl2_encoder_context_t(stream)
m_glGetVertexAttribiv_enc = set_glGetVertexAttribiv(s_glGetVertexAttribiv); m_glGetVertexAttribiv_enc = set_glGetVertexAttribiv(s_glGetVertexAttribiv);
m_glGetVertexAttribfv_enc = set_glGetVertexAttribfv(s_glGetVertexAttribfv); m_glGetVertexAttribfv_enc = set_glGetVertexAttribfv(s_glGetVertexAttribfv);
m_glGetVertexAttribPointerv = set_glGetVertexAttribPointerv(s_glGetVertexAttribPointerv); m_glGetVertexAttribPointerv = set_glGetVertexAttribPointerv(s_glGetVertexAttribPointerv);
set_glShaderSource(s_glShaderSource);
} }
GL2Encoder::~GL2Encoder() GL2Encoder::~GL2Encoder()
@@ -322,3 +323,15 @@ GLint * GL2Encoder::getCompressedTextureFormats()
} }
return m_compressedTextureFormats; return m_compressedTextureFormats;
} }
void GL2Encoder::s_glShaderSource(void *self, GLuint shader, GLsizei count, GLstr *string, GLint *length)
{
int len = glUtilsCalcShaderSourceLen(string, length, count);
char *str = new char[len + 1];
glUtilsPackStrings(str, string, length, count);
GL2Encoder *ctx = (GL2Encoder *)self;
ctx->glShaderString(ctx, shader, str, len + 1);
delete str;
}

View File

@@ -91,5 +91,6 @@ private:
glGetVertexAttribPointerv_client_proc_t m_glGetVertexAttribPointerv; glGetVertexAttribPointerv_client_proc_t m_glGetVertexAttribPointerv;
static void s_glGetVertexAttribPointerv(void *self, GLuint index, GLenum pname, GLvoid **pointer); static void s_glGetVertexAttribPointerv(void *self, GLuint index, GLenum pname, GLvoid **pointer);
static void s_glShaderSource(void *self, GLuint shader, GLsizei count, GLstr *string, GLint *length);
}; };
#endif #endif

View File

@@ -344,11 +344,12 @@ glMultiDrawArraysEXT
glMultiDrawElementsEXT glMultiDrawElementsEXT
flag unsupported flag unsupported
# handled by encoder
#void glShaderSource(GLuint shader, GLsizei count, GLstr *string, const GLint *length) #void glShaderSource(GLuint shader, GLsizei count, GLstr *string, const GLint *length)
glShaderSource glShaderSource
len length (count * sizeof(GLint)) flag unsupported
len string (glUtilsSumArrayValues(length, count))
custom_pack string glUtilsPackStrings(ptr, string, length, count)
#void glGetPerfMonitorGroupsAMD(GLint *numGroups, GLsizei groupsSize, GLuint *groups) #void glGetPerfMonitorGroupsAMD(GLint *numGroups, GLsizei groupsSize, GLuint *groups)