summaryrefslogtreecommitdiffstats
path: root/opengl
diff options
context:
space:
mode:
Diffstat (limited to 'opengl')
-rw-r--r--opengl/shared/OpenglCodecCommon/GLClientState.cpp2
-rw-r--r--opengl/system/GLESv2_enc/GL2Encoder.cpp37
-rw-r--r--opengl/system/GLESv2_enc/GL2Encoder.h16
-rw-r--r--opengl/system/GLESv2_enc/gl2_enc.cpp8
-rw-r--r--opengl/system/OpenglSystemCommon/QemuPipeStream.cpp4
5 files changed, 63 insertions, 4 deletions
diff --git a/opengl/shared/OpenglCodecCommon/GLClientState.cpp b/opengl/shared/OpenglCodecCommon/GLClientState.cpp
index 9795490..a84e856 100644
--- a/opengl/shared/OpenglCodecCommon/GLClientState.cpp
+++ b/opengl/shared/OpenglCodecCommon/GLClientState.cpp
@@ -224,6 +224,8 @@ int GLClientState::setPixelStore(GLenum param, GLint value)
size_t GLClientState::pixelDataSize(GLsizei width, GLsizei height, GLenum format, GLenum type, int pack) const
{
+ if (width <= 0 || height <= 0) return 0;
+
int pixelsize = glUtilsPixelBitSize(format, type) >> 3;
int alignment = pack ? m_pixelStore.pack_alignment : m_pixelStore.unpack_alignment;
diff --git a/opengl/system/GLESv2_enc/GL2Encoder.cpp b/opengl/system/GLESv2_enc/GL2Encoder.cpp
index 305806e..f6f61e6 100644
--- a/opengl/system/GLESv2_enc/GL2Encoder.cpp
+++ b/opengl/system/GLESv2_enc/GL2Encoder.cpp
@@ -79,6 +79,11 @@ GL2Encoder::GL2Encoder(IOStream *stream) : gl2_encoder_context_t(stream)
m_glDeleteShader_enc = set_glDeleteShader(s_glDeleteShader);
m_glAttachShader_enc = set_glAttachShader(s_glAttachShader);
m_glDetachShader_enc = set_glDetachShader(s_glDetachShader);
+ m_glGetAttachedShaders_enc = set_glGetAttachedShaders(s_glGetAttachedShaders);
+ m_glGetShaderSource_enc = set_glGetShaderSource(s_glGetShaderSource);
+ m_glGetShaderInfoLog_enc = set_glGetShaderInfoLog(s_glGetShaderInfoLog);
+ m_glGetProgramInfoLog_enc = set_glGetProgramInfoLog(s_glGetProgramInfoLog);
+
m_glGetUniformLocation_enc = set_glGetUniformLocation(s_glGetUniformLocation);
m_glUseProgram_enc = set_glUseProgram(s_glUseProgram);
@@ -746,6 +751,38 @@ GLuint GL2Encoder::s_glCreateShader(void *self, GLenum shaderType)
return shader;
}
+void GL2Encoder::s_glGetAttachedShaders(void *self, GLuint program, GLsizei maxCount,
+ GLsizei* count, GLuint* shaders)
+{
+ GL2Encoder *ctx = (GL2Encoder*)self;
+ SET_ERROR_IF(maxCount < 0, GL_INVALID_VALUE);
+ ctx->m_glGetAttachedShaders_enc(self, program, maxCount, count, shaders);
+}
+
+void GL2Encoder::s_glGetShaderSource(void *self, GLuint shader, GLsizei bufsize,
+ GLsizei* length, GLchar* source)
+{
+ GL2Encoder *ctx = (GL2Encoder*)self;
+ SET_ERROR_IF(bufsize < 0, GL_INVALID_VALUE);
+ ctx->m_glGetShaderSource_enc(self, shader, bufsize, length, source);
+}
+
+void GL2Encoder::s_glGetShaderInfoLog(void *self, GLuint shader, GLsizei bufsize,
+ GLsizei* length, GLchar* infolog)
+{
+ GL2Encoder *ctx = (GL2Encoder*)self;
+ SET_ERROR_IF(bufsize < 0, GL_INVALID_VALUE);
+ ctx->m_glGetShaderInfoLog_enc(self, shader, bufsize, length, infolog);
+}
+
+void GL2Encoder::s_glGetProgramInfoLog(void *self, GLuint program, GLsizei bufsize,
+ GLsizei* length, GLchar* infolog)
+{
+ GL2Encoder *ctx = (GL2Encoder*)self;
+ SET_ERROR_IF(bufsize < 0, GL_INVALID_VALUE);
+ ctx->m_glGetProgramInfoLog_enc(self, program, bufsize, length, infolog);
+}
+
void GL2Encoder::s_glDeleteShader(void *self, GLenum shader)
{
GL2Encoder *ctx = (GL2Encoder*)self;
diff --git a/opengl/system/GLESv2_enc/GL2Encoder.h b/opengl/system/GLESv2_enc/GL2Encoder.h
index c6506a9..8f6204c 100644
--- a/opengl/system/GLESv2_enc/GL2Encoder.h
+++ b/opengl/system/GLESv2_enc/GL2Encoder.h
@@ -148,6 +148,22 @@ private:
glDetachShader_client_proc_t m_glDetachShader_enc;
static void s_glDetachShader(void *self, GLuint program, GLuint shader);
+ glGetAttachedShaders_client_proc_t m_glGetAttachedShaders_enc;
+ static void s_glGetAttachedShaders(void *self, GLuint program, GLsizei maxCount,
+ GLsizei* count, GLuint* shaders);
+
+ glGetShaderSource_client_proc_t m_glGetShaderSource_enc;
+ static void s_glGetShaderSource(void *self, GLuint shader, GLsizei bufsize,
+ GLsizei* length, GLchar* source);
+
+ glGetShaderInfoLog_client_proc_t m_glGetShaderInfoLog_enc;
+ static void s_glGetShaderInfoLog(void *self,GLuint shader,
+ GLsizei bufsize, GLsizei* length, GLchar* infolog);
+
+ glGetProgramInfoLog_client_proc_t m_glGetProgramInfoLog_enc;
+ static void s_glGetProgramInfoLog(void *self,GLuint program,
+ GLsizei bufsize, GLsizei* length, GLchar* infolog);
+
glGetUniformLocation_client_proc_t m_glGetUniformLocation_enc;
static int s_glGetUniformLocation(void *self, GLuint program, const GLchar *name);
glUseProgram_client_proc_t m_glUseProgram_enc;
diff --git a/opengl/system/GLESv2_enc/gl2_enc.cpp b/opengl/system/GLESv2_enc/gl2_enc.cpp
index 46684e9..5929697 100644
--- a/opengl/system/GLESv2_enc/gl2_enc.cpp
+++ b/opengl/system/GLESv2_enc/gl2_enc.cpp
@@ -1162,7 +1162,7 @@ void glGetProgramInfoLog_enc(void *self , GLuint program, GLsizei bufsize, GLsiz
gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
IOStream *stream = ctx->m_stream;
- const unsigned int __size_length = sizeof(GLsizei);
+ const unsigned int __size_length = ((length != NULL) ? (sizeof(GLsizei)) : 0);
const unsigned int __size_infolog = bufsize;
unsigned char *ptr;
const size_t packetSize = 8 + 4 + 4 + __size_length + __size_infolog + 2*4;
@@ -1174,7 +1174,7 @@ void glGetProgramInfoLog_enc(void *self , GLuint program, GLsizei bufsize, GLsiz
memcpy(ptr, &bufsize, 4); ptr += 4;
*(unsigned int *)(ptr) = __size_length; ptr += 4;
*(unsigned int *)(ptr) = __size_infolog; ptr += 4;
- stream->readback(length, __size_length);
+ if (length != NULL) stream->readback(length, __size_length);
stream->readback(infolog, __size_infolog);
}
@@ -1923,7 +1923,7 @@ void glTexSubImage2D_enc(void *self , GLenum target, GLint level, GLint xoffset,
gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
IOStream *stream = ctx->m_stream;
- const unsigned int __size_pixels = pixelDataSize(self, width, height, format, type, 0);
+ const unsigned int __size_pixels = ((pixels != NULL) ? pixelDataSize(self, width, height, format, type, 0) : 0);
unsigned char *ptr;
const size_t packetSize = 8 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + __size_pixels + 1*4;
ptr = stream->alloc(8 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
@@ -1940,7 +1940,7 @@ void glTexSubImage2D_enc(void *self , GLenum target, GLint level, GLint xoffset,
memcpy(ptr, &type, 4); ptr += 4;
stream->flush();
stream->writeFully(&__size_pixels,4);
- stream->writeFully(pixels, __size_pixels);
+ if (pixels != NULL) stream->writeFully(pixels, __size_pixels);
}
void glUniform1f_enc(void *self , GLint location, GLfloat x)
diff --git a/opengl/system/OpenglSystemCommon/QemuPipeStream.cpp b/opengl/system/OpenglSystemCommon/QemuPipeStream.cpp
index a55dca0..5798370 100644
--- a/opengl/system/OpenglSystemCommon/QemuPipeStream.cpp
+++ b/opengl/system/OpenglSystemCommon/QemuPipeStream.cpp
@@ -87,6 +87,10 @@ int QemuPipeStream::writeFully(const void *buf, size_t len)
{
//DBG(">> QemuPipeStream::writeFully %d\n", len);
if (!valid()) return -1;
+ if (!buf) {
+ if (len>0) ERR("QemuPipeStream::writeFully failed, buf=NULL, len %d", len);
+ return 0;
+ }
size_t res = len;
int retval = 0;