summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/marshal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/main/marshal.c')
-rw-r--r--src/mesa/main/marshal.c133
1 files changed, 132 insertions, 1 deletions
diff --git a/src/mesa/main/marshal.c b/src/mesa/main/marshal.c
index 5499bc41ae1..391b6e746c2 100644
--- a/src/mesa/main/marshal.c
+++ b/src/mesa/main/marshal.c
@@ -516,7 +516,7 @@ _mesa_marshal_NamedBufferSubData(GLuint buffer, GLintptr offset,
}
}
-/* ClearBufferfv: marshalled asynchronously */
+/* ClearBuffer* (all variants): marshalled asynchronously */
struct marshal_cmd_ClearBuffer
{
struct marshal_cmd_base cmd_base;
@@ -537,6 +537,46 @@ _mesa_unmarshal_ClearBufferfv(struct gl_context *ctx,
(buffer, drawbuffer, value));
}
+void
+_mesa_unmarshal_ClearBufferiv(struct gl_context *ctx,
+ const struct marshal_cmd_ClearBuffer *cmd)
+{
+ const GLenum buffer = cmd->buffer;
+ const GLint drawbuffer = cmd->drawbuffer;
+ const char *variable_data = (const char *) (cmd + 1);
+ const GLint *value = (const GLint *) variable_data;
+
+ CALL_ClearBufferiv(ctx->CurrentServerDispatch,
+ (buffer, drawbuffer, value));
+}
+
+void
+_mesa_unmarshal_ClearBufferuiv(struct gl_context *ctx,
+ const struct marshal_cmd_ClearBuffer *cmd)
+{
+ const GLenum buffer = cmd->buffer;
+ const GLint drawbuffer = cmd->drawbuffer;
+ const char *variable_data = (const char *) (cmd + 1);
+ const GLuint *value = (const GLuint *) variable_data;
+
+ CALL_ClearBufferuiv(ctx->CurrentServerDispatch,
+ (buffer, drawbuffer, value));
+}
+
+void
+_mesa_unmarshal_ClearBufferfi(struct gl_context *ctx,
+ const struct marshal_cmd_ClearBuffer *cmd)
+{
+ const GLenum buffer = cmd->buffer;
+ const GLint drawbuffer = cmd->drawbuffer;
+ const char *variable_data = (const char *) (cmd + 1);
+ const GLfloat *depth = (const GLfloat *) variable_data;
+ const GLint *stencil = (const GLint *) (variable_data + 4);
+
+ CALL_ClearBufferfi(ctx->CurrentServerDispatch,
+ (buffer, drawbuffer, *depth, *stencil));
+}
+
static inline size_t buffer_to_size(GLenum buffer)
{
switch (buffer) {
@@ -607,3 +647,94 @@ _mesa_marshal_ClearBufferfv(GLenum buffer, GLint drawbuffer,
(buffer, drawbuffer, value));
}
}
+
+void GLAPIENTRY
+_mesa_marshal_ClearBufferiv(GLenum buffer, GLint drawbuffer,
+ const GLint *value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ debug_print_marshal("ClearBufferiv");
+
+ if (!(buffer == GL_STENCIL || buffer == GL_COLOR)) {
+ _mesa_glthread_finish(ctx);
+
+ /* Page 498 of the PDF, section '17.4.3.1 Clearing Individual Buffers'
+ * of the OpenGL 4.5 spec states:
+ *
+ * "An INVALID_ENUM error is generated by ClearBufferiv and
+ * ClearNamedFramebufferiv if buffer is not COLOR or STENCIL."
+ */
+ _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferiv(buffer=%s)",
+ _mesa_enum_to_string(buffer));
+ }
+
+ size_t size = buffer_to_size(buffer);
+ if (!clear_buffer_add_command(ctx, DISPATCH_CMD_ClearBufferiv, buffer,
+ drawbuffer, (GLuint *)value, size)) {
+ debug_print_sync("ClearBufferiv");
+ _mesa_glthread_finish(ctx);
+ CALL_ClearBufferiv(ctx->CurrentServerDispatch,
+ (buffer, drawbuffer, value));
+ }
+}
+
+void GLAPIENTRY
+_mesa_marshal_ClearBufferuiv(GLenum buffer, GLint drawbuffer,
+ const GLuint *value)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ debug_print_marshal("ClearBufferuiv");
+
+ if (buffer != GL_COLOR) {
+ _mesa_glthread_finish(ctx);
+
+ /* Page 498 of the PDF, section '17.4.3.1 Clearing Individual Buffers'
+ * of the OpenGL 4.5 spec states:
+ *
+ * "An INVALID_ENUM error is generated by ClearBufferuiv and
+ * ClearNamedFramebufferuiv if buffer is not COLOR."
+ */
+ _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferuiv(buffer=%s)",
+ _mesa_enum_to_string(buffer));
+ }
+
+ if (!clear_buffer_add_command(ctx, DISPATCH_CMD_ClearBufferuiv, buffer,
+ drawbuffer, (GLuint *)value, 4)) {
+ debug_print_sync("ClearBufferuiv");
+ _mesa_glthread_finish(ctx);
+ CALL_ClearBufferuiv(ctx->CurrentServerDispatch,
+ (buffer, drawbuffer, value));
+ }
+}
+
+void GLAPIENTRY
+_mesa_marshal_ClearBufferfi(GLenum buffer, GLint drawbuffer,
+ const GLfloat depth, const GLint stencil)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ debug_print_marshal("ClearBufferfi");
+
+ if (buffer != GL_DEPTH_STENCIL) {
+ _mesa_glthread_finish(ctx);
+
+ /* Page 498 of the PDF, section '17.4.3.1 Clearing Individual Buffers'
+ * of the OpenGL 4.5 spec states:
+ *
+ * "An INVALID_ENUM error is generated by ClearBufferfi and
+ * ClearNamedFramebufferfi if buffer is not DEPTH_STENCIL."
+ */
+ _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferfi(buffer=%s)",
+ _mesa_enum_to_string(buffer));
+ }
+
+ fi_type value[2];
+ value[0].f = depth;
+ value[1].i = stencil;
+ if (!clear_buffer_add_command(ctx, DISPATCH_CMD_ClearBufferfi, buffer,
+ drawbuffer, (GLuint *)value, 2)) {
+ debug_print_sync("ClearBufferfi");
+ _mesa_glthread_finish(ctx);
+ CALL_ClearBufferfi(ctx->CurrentServerDispatch,
+ (buffer, drawbuffer, depth, stencil));
+ }
+}