rbug: Add Gallium Remote Debugger Protocol code
authorJakob Bornecrantz <jakob@vmware.com>
Thu, 14 May 2009 23:07:05 +0000 (01:07 +0200)
committerJakob Bornecrantz <jakob@vmware.com>
Mon, 1 Jun 2009 10:19:39 +0000 (11:19 +0100)
This is the (de)marshalling and connection managment code

20 files changed:
configs/default
configure.ac
src/gallium/SConscript
src/gallium/auxiliary/rbug/Makefile [new file with mode: 0644]
src/gallium/auxiliary/rbug/README [new file with mode: 0644]
src/gallium/auxiliary/rbug/SConscript [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug.h [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_connection.c [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_connection.h [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_context.c [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_context.h [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_core.c [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_core.h [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_demarshal.c [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_internal.h [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_proto.h [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_shader.c [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_shader.h [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_texture.c [new file with mode: 0644]
src/gallium/auxiliary/rbug/rbug_texture.h [new file with mode: 0644]

index 9c479fccdf95ee29ee6821258c6c7ffb992e56f6..d2ea3b24876c4f37c6f3c37ba7aff54483b34d5d 100644 (file)
@@ -90,7 +90,7 @@ EGL_DRIVERS_DIRS = demo
 
 # Gallium directories and 
 GALLIUM_DIRS = auxiliary drivers state_trackers
-GALLIUM_AUXILIARY_DIRS = draw translate cso_cache pipebuffer tgsi sct rtasm util indices
+GALLIUM_AUXILIARY_DIRS = rbug draw translate cso_cache pipebuffer tgsi sct rtasm util indices
 GALLIUM_AUXILIARIES = $(foreach DIR,$(GALLIUM_AUXILIARY_DIRS),$(TOP)/src/gallium/auxiliary/$(DIR)/lib$(DIR).a)
 GALLIUM_DRIVERS_DIRS = softpipe i915simple failover trace
 GALLIUM_DRIVERS = $(foreach DIR,$(GALLIUM_DRIVERS_DIRS),$(TOP)/src/gallium/drivers/$(DIR)/lib$(DIR).a)
index 8110e0f86922bde94d1ae04a5b835763059342fa..24aa13a7cadb8f2ade86ad6e0b24796e7139a2e6 100644 (file)
@@ -409,7 +409,7 @@ WINDOW_SYSTEM=""
 GALLIUM_DIRS="auxiliary drivers state_trackers"
 GALLIUM_WINSYS_DIRS=""
 GALLIUM_WINSYS_DRM_DIRS=""
-GALLIUM_AUXILIARY_DIRS="draw translate cso_cache pipebuffer tgsi sct rtasm util indices"
+GALLIUM_AUXILIARY_DIRS="rbug draw translate cso_cache pipebuffer tgsi sct rtasm util indices"
 GALLIUM_DRIVERS_DIRS="softpipe failover trace"
 GALLIUM_STATE_TRACKERS_DIRS=""
 
index b6ceaf3edf9105719e9658b96f999588d8200e96..32b7c2980ab7bd433a89c6b5554fb439164e6ef8 100644 (file)
@@ -22,6 +22,7 @@ SConscript([
        'auxiliary/draw/SConscript',
        'auxiliary/pipebuffer/SConscript',
        'auxiliary/indices/SConscript',
+       'auxiliary/rbug/SConscript',
 ])
 
 for driver in env['drivers']:
diff --git a/src/gallium/auxiliary/rbug/Makefile b/src/gallium/auxiliary/rbug/Makefile
new file mode 100644 (file)
index 0000000..cd12e84
--- /dev/null
@@ -0,0 +1,14 @@
+TOP = ../../../..
+include $(TOP)/configs/current
+
+LIBNAME = rbug
+
+C_SOURCES = \
+       rbug_connection.c \
+       rbug_core.c \
+       rbug_texture.c \
+       rbug_context.c \
+       rbug_shader.c \
+       rbug_demarshal.c
+
+include ../../Makefile.template
diff --git a/src/gallium/auxiliary/rbug/README b/src/gallium/auxiliary/rbug/README
new file mode 100644 (file)
index 0000000..33d7637
--- /dev/null
@@ -0,0 +1,21 @@
+                 GALLIUM REMOTE DEBUGGING COMMON CODE
+
+= About =
+
+This directory contains the common code for the Gallium 3D remote debugging
+driver and clients. The code is two parts the connection managment code and
+the (de)marsheller.
+
+The code currently uses tcp and ip4v for connections.
+
+Information about driver integration can be found in:
+
+src/gallium/drivers/trace/README
+
+for information about applications look in:
+
+progs/rbug/README
+
+
+--
+Jakob Bornecrantz <jakob@vmware.com>
diff --git a/src/gallium/auxiliary/rbug/SConscript b/src/gallium/auxiliary/rbug/SConscript
new file mode 100644 (file)
index 0000000..4a9afb4
--- /dev/null
@@ -0,0 +1,14 @@
+Import('*')
+
+rbug = env.ConvenienceLibrary(
+       target = 'rbug',
+       source = [
+               'rbug_core.c',
+               'rbug_shader.c',
+               'rbug_context.c',
+               'rbug_texture.c',
+               'rbug_demarshal.c',
+               'rbug_connection.c',
+       ])
+
+auxiliaries.insert(0, rbug)
diff --git a/src/gallium/auxiliary/rbug/rbug.h b/src/gallium/auxiliary/rbug/rbug.h
new file mode 100644 (file)
index 0000000..259bfc6
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Include all for users the remote debugger protocol code.
+ */
+
+#include "rbug/rbug_core.h"
+#include "rbug/rbug_shader.h"
+#include "rbug/rbug_context.h"
+#include "rbug/rbug_texture.h"
+#include "rbug/rbug_connection.h"
diff --git a/src/gallium/auxiliary/rbug/rbug_connection.c b/src/gallium/auxiliary/rbug/rbug_connection.c
new file mode 100644 (file)
index 0000000..52acb70
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "rbug/rbug.h"
+#include "rbug/rbug_internal.h"
+
+#include "util/u_network.h"
+
+struct rbug_connection
+{
+   int socket;
+   uint32_t send_serial;
+   uint32_t recv_serial;
+   enum rbug_opcode opcode;
+};
+
+/**
+ * Create a rbug connection from a socket created with u_socket.
+ *
+ * Result:
+ *    A new allocated connection using socket as communication path
+ */
+struct rbug_connection *
+rbug_from_socket(int socket)
+{
+   struct rbug_connection *c = CALLOC_STRUCT(rbug_connection);
+   c->socket = socket;
+   return c;
+}
+
+/**
+ * Free a connection, also closes socket.
+ */
+void
+rbug_disconnect(struct rbug_connection *c)
+{
+   u_socket_close(c->socket);
+   FREE(c);
+}
+
+/**
+ * Waits for a message to be fully received.
+ * Also returns the serial for the message, serial is not touched for replys.
+ *
+ * Result:
+ *    demarshaled message on success, NULL on connection error
+ */
+struct rbug_header *
+rbug_get_message(struct rbug_connection *c, uint32_t *serial)
+{
+   struct rbug_proto_header header;
+   struct rbug_header *out;
+   struct rbug_proto_header *data;
+   size_t length = 0;
+   size_t read = 0;
+   int ret;
+
+
+   ret = u_socket_peek(c->socket, &header, sizeof(header));
+   if (ret <= 0) {
+      return NULL;
+   }
+
+   length = (size_t)header.length * 4;
+   data = MALLOC(length);
+   if (!data) {
+      return NULL;
+   }
+
+   do {
+      uint8_t *ptr = ((uint8_t*)data) + read;
+      ret = u_socket_recv(c->socket, ptr, length - read);
+
+      if (ret <= 0) {
+         FREE(data);
+         return NULL;
+      }
+
+      read += ret;
+   } while(read < length);
+
+   out = rbug_demarshal(data);
+   if (!out)
+      FREE(data);
+   else if (serial)
+      *serial = c->recv_serial++;
+   else
+      c->recv_serial++;
+
+   return out;
+}
+
+/**
+ * Frees a message and associated data.
+ */
+void
+rbug_free_header(struct rbug_header *header)
+{
+   if (!header)
+      return;
+
+   FREE(header->__message);
+   FREE(header);
+}
+
+/**
+ * Internal function used by rbug_send_* functions.
+ *
+ * Start sending a message.
+ */
+int
+rbug_connection_send_start(struct rbug_connection *c, enum rbug_opcode opcode, uint32_t length)
+{
+   c->opcode = opcode;
+   return 0;
+}
+
+/**
+ * Internal function used by rbug_send_* functions.
+ *
+ * Write data to the socket.
+ */
+int
+rbug_connection_write(struct rbug_connection *c, void *to, uint32_t size)
+{
+   int ret = u_socket_send(c->socket, to, size);
+   return ret;
+}
+
+/**
+ * Internal function used by rbug_send_* functions.
+ *
+ * Finish writeing data to the socket.
+ * Ups the send_serial and sets the serial argument if supplied.
+ */
+int rbug_connection_send_finish(struct rbug_connection *c, uint32_t *serial)
+{
+   if (c->opcode < 0)
+      return 0;
+   else if (serial)
+      *serial = c->send_serial++;
+   else
+      c->send_serial++;
+
+   return 0;
+}
diff --git a/src/gallium/auxiliary/rbug/rbug_connection.h b/src/gallium/auxiliary/rbug/rbug_connection.h
new file mode 100644 (file)
index 0000000..1f2c9ff
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file contains the function defentions for connection see c file for
+ * more comments covering function use.
+ */
+
+#ifndef _RBUG_CONNECTION_H_
+#define _RBUG_CONNECTION_H_
+
+#include "rbug/rbug_proto.h"
+
+struct rbug_connection * rbug_from_socket(int socket);
+
+void rbug_disconnect(struct rbug_connection *c);
+
+struct rbug_header * rbug_get_message(struct rbug_connection *c, uint32_t *serial);
+
+void rbug_free_header(struct rbug_header *header);
+
+struct rbug_header * rbug_demarshal(struct rbug_proto_header *header);
+
+#endif
diff --git a/src/gallium/auxiliary/rbug/rbug_context.c b/src/gallium/auxiliary/rbug/rbug_context.c
new file mode 100644 (file)
index 0000000..b4fad53
--- /dev/null
@@ -0,0 +1,442 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file holds the function implementation for one of the rbug extensions.
+ * Prototypes and declerations of functions and structs is in the same folder
+ * in the header file matching this file's name.
+ *
+ * The functions starting rbug_send_* encodes a call to the write format and
+ * sends that to the supplied connection, while functions starting with
+ * rbug_demarshal_* demarshal data in the wire protocol.
+ *
+ * Functions ending with _reply are replies to requests.
+ */
+
+#include "rbug_internal.h"
+#include "rbug/rbug_context.h"
+
+int rbug_send_context_list(struct rbug_connection *__con,
+                           uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_LIST));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_CONTEXT_LIST, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_context_info(struct rbug_connection *__con,
+                           rbug_context_t context,
+                           uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(8); /* context */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_INFO));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(8, rbug_context_t, context); /* context */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_CONTEXT_INFO, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_context_block_draw(struct rbug_connection *__con,
+                                 rbug_context_t context,
+                                 uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(8); /* context */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_BLOCK_DRAW));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(8, rbug_context_t, context); /* context */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_CONTEXT_BLOCK_DRAW, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_context_unblock_draw(struct rbug_connection *__con,
+                                   rbug_context_t context,
+                                   uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(8); /* context */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_UNBLOCK_DRAW));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(8, rbug_context_t, context); /* context */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_CONTEXT_UNBLOCK_DRAW, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_context_list_reply(struct rbug_connection *__con,
+                                 uint32_t serial,
+                                 rbug_context_t *contexts,
+                                 uint32_t contexts_len,
+                                 uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(4); /* serial */
+       LEN_ARRAY(8, contexts); /* contexts */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_LIST_REPLY));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(4, uint32_t, serial); /* serial */
+       WRITE_ARRAY(8, rbug_context_t, contexts); /* contexts */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_CONTEXT_LIST_REPLY, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_context_info_reply(struct rbug_connection *__con,
+                                 uint32_t serial,
+                                 rbug_texture_t *cbufs,
+                                 uint32_t cbufs_len,
+                                 rbug_texture_t zdbuf,
+                                 uint8_t blocked,
+                                 uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(4); /* serial */
+       LEN_ARRAY(8, cbufs); /* cbufs */
+       LEN(8); /* zdbuf */
+       LEN(1); /* blocked */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_INFO_REPLY));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(4, uint32_t, serial); /* serial */
+       WRITE_ARRAY(8, rbug_texture_t, cbufs); /* cbufs */
+       WRITE(8, rbug_texture_t, zdbuf); /* zdbuf */
+       WRITE(1, uint8_t, blocked); /* blocked */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_CONTEXT_INFO_REPLY, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+struct rbug_proto_context_list * rbug_demarshal_context_list(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_context_list *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_CONTEXT_LIST)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+
+       return ret;
+}
+
+struct rbug_proto_context_info * rbug_demarshal_context_info(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_context_info *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_CONTEXT_INFO)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(8, rbug_context_t, context); /* context */
+
+       return ret;
+}
+
+struct rbug_proto_context_block_draw * rbug_demarshal_context_block_draw(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_context_block_draw *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_CONTEXT_BLOCK_DRAW)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(8, rbug_context_t, context); /* context */
+
+       return ret;
+}
+
+struct rbug_proto_context_unblock_draw * rbug_demarshal_context_unblock_draw(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_context_unblock_draw *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_CONTEXT_UNBLOCK_DRAW)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(8, rbug_context_t, context); /* context */
+
+       return ret;
+}
+
+struct rbug_proto_context_list_reply * rbug_demarshal_context_list_reply(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_context_list_reply *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_CONTEXT_LIST_REPLY)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(4, uint32_t, serial); /* serial */
+       READ_ARRAY(8, rbug_context_t, contexts); /* contexts */
+
+       return ret;
+}
+
+struct rbug_proto_context_info_reply * rbug_demarshal_context_info_reply(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_context_info_reply *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_CONTEXT_INFO_REPLY)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(4, uint32_t, serial); /* serial */
+       READ_ARRAY(8, rbug_texture_t, cbufs); /* cbufs */
+       READ(8, rbug_texture_t, zdbuf); /* zdbuf */
+       READ(1, uint8_t, blocked); /* blocked */
+
+       return ret;
+}
diff --git a/src/gallium/auxiliary/rbug/rbug_context.h b/src/gallium/auxiliary/rbug/rbug_context.h
new file mode 100644 (file)
index 0000000..bcd2a82
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file holds structs decelerations and function prototypes for one of
+ * the rbug extensions. Implementation of the functions is in the same folder
+ * in the c file matching this file's name.
+ *
+ * The structs what is returned from the demarshal functions. The functions
+ * starting rbug_send_* encodes a call to the write format and sends that to
+ * the supplied connection, while functions starting with rbug_demarshal_*
+ * demarshal data from the wire protocol.
+ *
+ * Structs and functions ending with _reply are replies to requests.
+ */
+
+#ifndef _RBUG_PROTO_CONTEXT_H_
+#define _RBUG_PROTO_CONTEXT_H_
+
+#include "rbug/rbug_proto.h"
+#include "rbug/rbug_texture.h"
+
+typedef uint64_t rbug_context_t;
+
+struct rbug_proto_context_list
+{
+       struct rbug_header header;
+};
+
+struct rbug_proto_context_info
+{
+       struct rbug_header header;
+       rbug_context_t context;
+};
+
+struct rbug_proto_context_block_draw
+{
+       struct rbug_header header;
+       rbug_context_t context;
+};
+
+struct rbug_proto_context_unblock_draw
+{
+       struct rbug_header header;
+       rbug_context_t context;
+};
+
+struct rbug_proto_context_list_reply
+{
+       struct rbug_header header;
+       uint32_t serial;
+       rbug_context_t *contexts;
+       uint32_t contexts_len;
+};
+
+struct rbug_proto_context_info_reply
+{
+       struct rbug_header header;
+       uint32_t serial;
+       rbug_texture_t *cbufs;
+       uint32_t cbufs_len;
+       rbug_texture_t zdbuf;
+       uint8_t blocked;
+};
+
+int rbug_send_context_list(struct rbug_connection *__con,
+                           uint32_t *__serial);
+
+int rbug_send_context_info(struct rbug_connection *__con,
+                           rbug_context_t context,
+                           uint32_t *__serial);
+
+int rbug_send_context_block_draw(struct rbug_connection *__con,
+                                 rbug_context_t context,
+                                 uint32_t *__serial);
+
+int rbug_send_context_unblock_draw(struct rbug_connection *__con,
+                                   rbug_context_t context,
+                                   uint32_t *__serial);
+
+int rbug_send_context_list_reply(struct rbug_connection *__con,
+                                 uint32_t serial,
+                                 rbug_context_t *contexts,
+                                 uint32_t contexts_len,
+                                 uint32_t *__serial);
+
+int rbug_send_context_info_reply(struct rbug_connection *__con,
+                                 uint32_t serial,
+                                 rbug_texture_t *cbufs,
+                                 uint32_t cbufs_len,
+                                 rbug_texture_t zdbuf,
+                                 uint8_t blocked,
+                                 uint32_t *__serial);
+
+struct rbug_proto_context_list * rbug_demarshal_context_list(struct rbug_proto_header *header);
+
+struct rbug_proto_context_info * rbug_demarshal_context_info(struct rbug_proto_header *header);
+
+struct rbug_proto_context_block_draw * rbug_demarshal_context_block_draw(struct rbug_proto_header *header);
+
+struct rbug_proto_context_unblock_draw * rbug_demarshal_context_unblock_draw(struct rbug_proto_header *header);
+
+struct rbug_proto_context_list_reply * rbug_demarshal_context_list_reply(struct rbug_proto_header *header);
+
+struct rbug_proto_context_info_reply * rbug_demarshal_context_info_reply(struct rbug_proto_header *header);
+
+#endif
diff --git a/src/gallium/auxiliary/rbug/rbug_core.c b/src/gallium/auxiliary/rbug/rbug_core.c
new file mode 100644 (file)
index 0000000..876ae5a
--- /dev/null
@@ -0,0 +1,359 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file holds the function implementation for one of the rbug extensions.
+ * Prototypes and declerations of functions and structs is in the same folder
+ * in the header file matching this file's name.
+ *
+ * The functions starting rbug_send_* encodes a call to the write format and
+ * sends that to the supplied connection, while functions starting with
+ * rbug_demarshal_* demarshal data in the wire protocol.
+ *
+ * Functions ending with _reply are replies to requests.
+ */
+
+#include "rbug_internal.h"
+#include "rbug/rbug_core.h"
+
+int rbug_send_noop(struct rbug_connection *__con,
+                   uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_NOOP));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_NOOP, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_ping(struct rbug_connection *__con,
+                   uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_PING));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_PING, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_error(struct rbug_connection *__con,
+                    uint32_t error,
+                    uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(4); /* error */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_ERROR));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(4, uint32_t, error); /* error */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_ERROR, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_ping_reply(struct rbug_connection *__con,
+                         uint32_t serial,
+                         uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(4); /* serial */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_PING_REPLY));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(4, uint32_t, serial); /* serial */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_PING_REPLY, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_error_reply(struct rbug_connection *__con,
+                          uint32_t serial,
+                          uint32_t error,
+                          uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(4); /* serial */
+       LEN(4); /* error */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_ERROR_REPLY));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(4, uint32_t, serial); /* serial */
+       WRITE(4, uint32_t, error); /* error */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_ERROR_REPLY, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+struct rbug_proto_noop * rbug_demarshal_noop(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_noop *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_NOOP)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+
+       return ret;
+}
+
+struct rbug_proto_ping * rbug_demarshal_ping(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_ping *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_PING)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+
+       return ret;
+}
+
+struct rbug_proto_error * rbug_demarshal_error(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_error *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_ERROR)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(4, uint32_t, error); /* error */
+
+       return ret;
+}
+
+struct rbug_proto_ping_reply * rbug_demarshal_ping_reply(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_ping_reply *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_PING_REPLY)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(4, uint32_t, serial); /* serial */
+
+       return ret;
+}
+
+struct rbug_proto_error_reply * rbug_demarshal_error_reply(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_error_reply *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_ERROR_REPLY)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(4, uint32_t, serial); /* serial */
+       READ(4, uint32_t, error); /* error */
+
+       return ret;
+}
diff --git a/src/gallium/auxiliary/rbug/rbug_core.h b/src/gallium/auxiliary/rbug/rbug_core.h
new file mode 100644 (file)
index 0000000..d63a8c8
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file holds structs decelerations and function prototypes for one of
+ * the rbug extensions. Implementation of the functions is in the same folder
+ * in the c file matching this file's name.
+ *
+ * The structs what is returned from the demarshal functions. The functions
+ * starting rbug_send_* encodes a call to the write format and sends that to
+ * the supplied connection, while functions starting with rbug_demarshal_*
+ * demarshal data from the wire protocol.
+ *
+ * Structs and functions ending with _reply are replies to requests.
+ */
+
+#ifndef _RBUG_PROTO_CORE_H_
+#define _RBUG_PROTO_CORE_H_
+
+#include "rbug/rbug_proto.h"
+
+struct rbug_proto_noop
+{
+       struct rbug_header header;
+};
+
+struct rbug_proto_ping
+{
+       struct rbug_header header;
+};
+
+struct rbug_proto_error
+{
+       struct rbug_header header;
+       uint32_t error;
+};
+
+struct rbug_proto_ping_reply
+{
+       struct rbug_header header;
+       uint32_t serial;
+};
+
+struct rbug_proto_error_reply
+{
+       struct rbug_header header;
+       uint32_t serial;
+       uint32_t error;
+};
+
+int rbug_send_noop(struct rbug_connection *__con,
+                   uint32_t *__serial);
+
+int rbug_send_ping(struct rbug_connection *__con,
+                   uint32_t *__serial);
+
+int rbug_send_error(struct rbug_connection *__con,
+                    uint32_t error,
+                    uint32_t *__serial);
+
+int rbug_send_ping_reply(struct rbug_connection *__con,
+                         uint32_t serial,
+                         uint32_t *__serial);
+
+int rbug_send_error_reply(struct rbug_connection *__con,
+                          uint32_t serial,
+                          uint32_t error,
+                          uint32_t *__serial);
+
+struct rbug_proto_noop * rbug_demarshal_noop(struct rbug_proto_header *header);
+
+struct rbug_proto_ping * rbug_demarshal_ping(struct rbug_proto_header *header);
+
+struct rbug_proto_error * rbug_demarshal_error(struct rbug_proto_header *header);
+
+struct rbug_proto_ping_reply * rbug_demarshal_ping_reply(struct rbug_proto_header *header);
+
+struct rbug_proto_error_reply * rbug_demarshal_error_reply(struct rbug_proto_header *header);
+
+#endif
diff --git a/src/gallium/auxiliary/rbug/rbug_demarshal.c b/src/gallium/auxiliary/rbug/rbug_demarshal.c
new file mode 100644 (file)
index 0000000..e3c0954
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "rbug.h"
+
+/**
+ * Small function that looks at the proto_header and selects the correct
+ * demarshal functions and return the result.
+ */
+struct rbug_header * rbug_demarshal(struct rbug_proto_header *header)
+{
+       switch(header->opcode) {
+       case RBUG_OP_NOOP:
+               return (struct rbug_header *)rbug_demarshal_noop(header);
+       case RBUG_OP_PING:
+               return (struct rbug_header *)rbug_demarshal_ping(header);
+       case RBUG_OP_ERROR:
+               return (struct rbug_header *)rbug_demarshal_error(header);
+       case RBUG_OP_PING_REPLY:
+               return (struct rbug_header *)rbug_demarshal_ping_reply(header);
+       case RBUG_OP_ERROR_REPLY:
+               return (struct rbug_header *)rbug_demarshal_error_reply(header);
+       case RBUG_OP_TEXTURE_LIST:
+               return (struct rbug_header *)rbug_demarshal_texture_list(header);
+       case RBUG_OP_TEXTURE_INFO:
+               return (struct rbug_header *)rbug_demarshal_texture_info(header);
+       case RBUG_OP_TEXTURE_WRITE:
+               return (struct rbug_header *)rbug_demarshal_texture_write(header);
+       case RBUG_OP_TEXTURE_READ:
+               return (struct rbug_header *)rbug_demarshal_texture_read(header);
+       case RBUG_OP_TEXTURE_LIST_REPLY:
+               return (struct rbug_header *)rbug_demarshal_texture_list_reply(header);
+       case RBUG_OP_TEXTURE_INFO_REPLY:
+               return (struct rbug_header *)rbug_demarshal_texture_info_reply(header);
+       case RBUG_OP_TEXTURE_READ_REPLY:
+               return (struct rbug_header *)rbug_demarshal_texture_read_reply(header);
+       case RBUG_OP_CONTEXT_LIST:
+               return (struct rbug_header *)rbug_demarshal_context_list(header);
+       case RBUG_OP_CONTEXT_INFO:
+               return (struct rbug_header *)rbug_demarshal_context_info(header);
+       case RBUG_OP_CONTEXT_BLOCK_DRAW:
+               return (struct rbug_header *)rbug_demarshal_context_block_draw(header);
+       case RBUG_OP_CONTEXT_UNBLOCK_DRAW:
+               return (struct rbug_header *)rbug_demarshal_context_unblock_draw(header);
+       case RBUG_OP_CONTEXT_LIST_REPLY:
+               return (struct rbug_header *)rbug_demarshal_context_list_reply(header);
+       case RBUG_OP_CONTEXT_INFO_REPLY:
+               return (struct rbug_header *)rbug_demarshal_context_info_reply(header);
+       case RBUG_OP_SHADER_LIST:
+               return (struct rbug_header *)rbug_demarshal_shader_list(header);
+       case RBUG_OP_SHADER_INFO:
+               return (struct rbug_header *)rbug_demarshal_shader_info(header);
+       case RBUG_OP_SHADER_DISABLE:
+               return (struct rbug_header *)rbug_demarshal_shader_disable(header);
+       case RBUG_OP_SHADER_REPLACE:
+               return (struct rbug_header *)rbug_demarshal_shader_replace(header);
+       case RBUG_OP_SHADER_LIST_REPLY:
+               return (struct rbug_header *)rbug_demarshal_shader_list_reply(header);
+       case RBUG_OP_SHADER_INFO_REPLY:
+               return (struct rbug_header *)rbug_demarshal_shader_info_reply(header);
+       default:
+               return NULL;
+       }
+}
diff --git a/src/gallium/auxiliary/rbug/rbug_internal.h b/src/gallium/auxiliary/rbug/rbug_internal.h
new file mode 100644 (file)
index 0000000..4aba1a8
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file is internal to the rbug protocol code, and contains asorted
+ * features needed by the code.
+ */
+
+#ifndef _RBUG_INTERNAL_H_
+#define _RBUG_INTERNAL_H_
+
+#include "rbug/rbug_proto.h"
+
+#include "util/u_memory.h"
+#include "util/u_debug.h"
+#include <errno.h>
+
+int rbug_connection_send_start(struct rbug_connection *con, enum rbug_opcode opcode, uint32_t length);
+int rbug_connection_write(struct rbug_connection *con, void *data, uint32_t size);
+int rbug_connection_send_finish(struct rbug_connection *con, uint32_t *c);
+
+/**
+ * Only works with multiples of 2
+ */
+#define PAD(from, to)                       \
+do {                                        \
+       from = (from + to - 1) & ~(to - 1); \
+} while(0)
+
+#define LEN(size)         \
+do {                      \
+       PAD(__len, size); \
+       __len += size;    \
+} while(0)
+
+#define LEN_ARRAY(size, name)       \
+do {                                \
+       LEN(4);                     \
+       PAD(__len, size);           \
+       __len += size * name##_len; \
+} while(0)
+
+#define WRITE(size, type, name)             \
+do {                                        \
+       PAD(__pos, size);                   \
+       *((type *)(&__data[__pos])) = name; \
+       __pos += size;                      \
+} while(0)
+
+#define WRITE_ARRAY(size, type, name)                    \
+do {                                                     \
+       WRITE(4, uint32_t, name##_len);                  \
+       PAD(__pos, size);                                \
+       memcpy(&__data[__pos], name, size * name##_len); \
+       __pos += size * name##_len;                      \
+} while(0)
+
+#define READ(size, type, name)                      \
+do {                                                \
+       PAD(pos, size);                             \
+       pos += size;                                \
+       if (pos > len)                              \
+               break;                              \
+       ret->name = *((type *)(&data[pos - size])); \
+} while(0)
+
+#define READ_ARRAY(size, type, name)                             \
+do {                                                             \
+       READ(4, uint32_t, name##_len);                           \
+       if (pos > len)                                           \
+               break;                                           \
+       PAD(pos, size);                                          \
+       pos += size * ret->name##_len;                           \
+       if (pos > len)                                           \
+               break;                                           \
+       ret->name = (type *)&data[pos - size * ret->name##_len]; \
+} while(0)
+
+#endif
diff --git a/src/gallium/auxiliary/rbug/rbug_proto.h b/src/gallium/auxiliary/rbug/rbug_proto.h
new file mode 100644 (file)
index 0000000..8fa1836
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file holds common definitions of the gallium remote debugging protocol.
+ */
+
+#ifndef _RBUG_PROTO_H_
+#define _RBUG_PROTO_H_
+
+#include "pipe/p_compiler.h"
+
+/**
+ * Uniqe indentifier for each command.
+ *
+ * Replys are designated by negative.
+ */
+enum rbug_opcode
+{
+       RBUG_OP_NOOP = 0,
+       RBUG_OP_PING = 1,
+       RBUG_OP_ERROR = 2,
+       RBUG_OP_PING_REPLY = -1,
+       RBUG_OP_ERROR_REPLY = -2,
+       RBUG_OP_TEXTURE_LIST = 256,
+       RBUG_OP_TEXTURE_INFO = 257,
+       RBUG_OP_TEXTURE_WRITE = 258,
+       RBUG_OP_TEXTURE_READ = 259,
+       RBUG_OP_TEXTURE_LIST_REPLY = -256,
+       RBUG_OP_TEXTURE_INFO_REPLY = -257,
+       RBUG_OP_TEXTURE_READ_REPLY = -259,
+       RBUG_OP_CONTEXT_LIST = 512,
+       RBUG_OP_CONTEXT_INFO = 513,
+       RBUG_OP_CONTEXT_BLOCK_DRAW = 514,
+       RBUG_OP_CONTEXT_UNBLOCK_DRAW = 515,
+       RBUG_OP_CONTEXT_LIST_REPLY = -512,
+       RBUG_OP_CONTEXT_INFO_REPLY = -513,
+       RBUG_OP_SHADER_LIST = 768,
+       RBUG_OP_SHADER_INFO = 769,
+       RBUG_OP_SHADER_DISABLE = 770,
+       RBUG_OP_SHADER_REPLACE = 771,
+       RBUG_OP_SHADER_LIST_REPLY = -768,
+       RBUG_OP_SHADER_INFO_REPLY = -769,
+};
+
+/**
+ * Header for demarshaled message.
+ */
+struct rbug_header
+{
+       enum rbug_opcode opcode;
+       void *__message;
+};
+
+/**
+ * Header for a message in wire format.
+ */
+struct rbug_proto_header
+{
+       int32_t opcode;
+       uint32_t length;
+};
+
+/**
+ * Forward declare connection here, as this file is included by all users.
+ */
+struct rbug_connection;
+
+#endif
diff --git a/src/gallium/auxiliary/rbug/rbug_shader.c b/src/gallium/auxiliary/rbug/rbug_shader.c
new file mode 100644 (file)
index 0000000..fccd2f5
--- /dev/null
@@ -0,0 +1,468 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file holds the function implementation for one of the rbug extensions.
+ * Prototypes and declerations of functions and structs is in the same folder
+ * in the header file matching this file's name.
+ *
+ * The functions starting rbug_send_* encodes a call to the write format and
+ * sends that to the supplied connection, while functions starting with
+ * rbug_demarshal_* demarshal data in the wire protocol.
+ *
+ * Functions ending with _reply are replies to requests.
+ */
+
+#include "rbug_internal.h"
+#include "rbug/rbug_shader.h"
+
+int rbug_send_shader_list(struct rbug_connection *__con,
+                          rbug_context_t context,
+                          uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(8); /* context */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_SHADER_LIST));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(8, rbug_context_t, context); /* context */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_SHADER_LIST, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_shader_info(struct rbug_connection *__con,
+                          rbug_context_t context,
+                          rbug_shader_t shader,
+                          uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(8); /* context */
+       LEN(8); /* shader */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_SHADER_INFO));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(8, rbug_context_t, context); /* context */
+       WRITE(8, rbug_shader_t, shader); /* shader */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_SHADER_INFO, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_shader_disable(struct rbug_connection *__con,
+                             rbug_context_t context,
+                             rbug_shader_t shader,
+                             uint8_t disable,
+                             uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(8); /* context */
+       LEN(8); /* shader */
+       LEN(1); /* disable */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_SHADER_DISABLE));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(8, rbug_context_t, context); /* context */
+       WRITE(8, rbug_shader_t, shader); /* shader */
+       WRITE(1, uint8_t, disable); /* disable */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_SHADER_DISABLE, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_shader_replace(struct rbug_connection *__con,
+                             rbug_context_t context,
+                             rbug_shader_t shader,
+                             uint32_t *tokens,
+                             uint32_t tokens_len,
+                             uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(8); /* context */
+       LEN(8); /* shader */
+       LEN_ARRAY(4, tokens); /* tokens */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_SHADER_REPLACE));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(8, rbug_context_t, context); /* context */
+       WRITE(8, rbug_shader_t, shader); /* shader */
+       WRITE_ARRAY(4, uint32_t, tokens); /* tokens */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_SHADER_REPLACE, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_shader_list_reply(struct rbug_connection *__con,
+                                uint32_t serial,
+                                rbug_shader_t *shaders,
+                                uint32_t shaders_len,
+                                uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(4); /* serial */
+       LEN_ARRAY(8, shaders); /* shaders */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_SHADER_LIST_REPLY));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(4, uint32_t, serial); /* serial */
+       WRITE_ARRAY(8, rbug_shader_t, shaders); /* shaders */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_SHADER_LIST_REPLY, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_shader_info_reply(struct rbug_connection *__con,
+                                uint32_t serial,
+                                uint32_t *original,
+                                uint32_t original_len,
+                                uint32_t *replaced,
+                                uint32_t replaced_len,
+                                uint8_t disabled,
+                                uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(4); /* serial */
+       LEN_ARRAY(4, original); /* original */
+       LEN_ARRAY(4, replaced); /* replaced */
+       LEN(1); /* disabled */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_SHADER_INFO_REPLY));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(4, uint32_t, serial); /* serial */
+       WRITE_ARRAY(4, uint32_t, original); /* original */
+       WRITE_ARRAY(4, uint32_t, replaced); /* replaced */
+       WRITE(1, uint8_t, disabled); /* disabled */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_SHADER_INFO_REPLY, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+struct rbug_proto_shader_list * rbug_demarshal_shader_list(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_shader_list *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_SHADER_LIST)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(8, rbug_context_t, context); /* context */
+
+       return ret;
+}
+
+struct rbug_proto_shader_info * rbug_demarshal_shader_info(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_shader_info *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_SHADER_INFO)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(8, rbug_context_t, context); /* context */
+       READ(8, rbug_shader_t, shader); /* shader */
+
+       return ret;
+}
+
+struct rbug_proto_shader_disable * rbug_demarshal_shader_disable(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_shader_disable *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_SHADER_DISABLE)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(8, rbug_context_t, context); /* context */
+       READ(8, rbug_shader_t, shader); /* shader */
+       READ(1, uint8_t, disable); /* disable */
+
+       return ret;
+}
+
+struct rbug_proto_shader_replace * rbug_demarshal_shader_replace(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_shader_replace *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_SHADER_REPLACE)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(8, rbug_context_t, context); /* context */
+       READ(8, rbug_shader_t, shader); /* shader */
+       READ_ARRAY(4, uint32_t, tokens); /* tokens */
+
+       return ret;
+}
+
+struct rbug_proto_shader_list_reply * rbug_demarshal_shader_list_reply(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_shader_list_reply *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_SHADER_LIST_REPLY)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(4, uint32_t, serial); /* serial */
+       READ_ARRAY(8, rbug_shader_t, shaders); /* shaders */
+
+       return ret;
+}
+
+struct rbug_proto_shader_info_reply * rbug_demarshal_shader_info_reply(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_shader_info_reply *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_SHADER_INFO_REPLY)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(4, uint32_t, serial); /* serial */
+       READ_ARRAY(4, uint32_t, original); /* original */
+       READ_ARRAY(4, uint32_t, replaced); /* replaced */
+       READ(1, uint8_t, disabled); /* disabled */
+
+       return ret;
+}
diff --git a/src/gallium/auxiliary/rbug/rbug_shader.h b/src/gallium/auxiliary/rbug/rbug_shader.h
new file mode 100644 (file)
index 0000000..fe1b9ac
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file holds structs decelerations and function prototypes for one of
+ * the rbug extensions. Implementation of the functions is in the same folder
+ * in the c file matching this file's name.
+ *
+ * The structs what is returned from the demarshal functions. The functions
+ * starting rbug_send_* encodes a call to the write format and sends that to
+ * the supplied connection, while functions starting with rbug_demarshal_*
+ * demarshal data from the wire protocol.
+ *
+ * Structs and functions ending with _reply are replies to requests.
+ */
+
+#ifndef _RBUG_PROTO_SHADER_H_
+#define _RBUG_PROTO_SHADER_H_
+
+#include "rbug/rbug_proto.h"
+#include "rbug/rbug_context.h"
+
+typedef uint64_t rbug_shader_t;
+
+struct rbug_proto_shader_list
+{
+       struct rbug_header header;
+       rbug_context_t context;
+};
+
+struct rbug_proto_shader_info
+{
+       struct rbug_header header;
+       rbug_context_t context;
+       rbug_shader_t shader;
+};
+
+struct rbug_proto_shader_disable
+{
+       struct rbug_header header;
+       rbug_context_t context;
+       rbug_shader_t shader;
+       uint8_t disable;
+};
+
+struct rbug_proto_shader_replace
+{
+       struct rbug_header header;
+       rbug_context_t context;
+       rbug_shader_t shader;
+       uint32_t *tokens;
+       uint32_t tokens_len;
+};
+
+struct rbug_proto_shader_list_reply
+{
+       struct rbug_header header;
+       uint32_t serial;
+       rbug_shader_t *shaders;
+       uint32_t shaders_len;
+};
+
+struct rbug_proto_shader_info_reply
+{
+       struct rbug_header header;
+       uint32_t serial;
+       uint32_t *original;
+       uint32_t original_len;
+       uint32_t *replaced;
+       uint32_t replaced_len;
+       uint8_t disabled;
+};
+
+int rbug_send_shader_list(struct rbug_connection *__con,
+                          rbug_context_t context,
+                          uint32_t *__serial);
+
+int rbug_send_shader_info(struct rbug_connection *__con,
+                          rbug_context_t context,
+                          rbug_shader_t shader,
+                          uint32_t *__serial);
+
+int rbug_send_shader_disable(struct rbug_connection *__con,
+                             rbug_context_t context,
+                             rbug_shader_t shader,
+                             uint8_t disable,
+                             uint32_t *__serial);
+
+int rbug_send_shader_replace(struct rbug_connection *__con,
+                             rbug_context_t context,
+                             rbug_shader_t shader,
+                             uint32_t *tokens,
+                             uint32_t tokens_len,
+                             uint32_t *__serial);
+
+int rbug_send_shader_list_reply(struct rbug_connection *__con,
+                                uint32_t serial,
+                                rbug_shader_t *shaders,
+                                uint32_t shaders_len,
+                                uint32_t *__serial);
+
+int rbug_send_shader_info_reply(struct rbug_connection *__con,
+                                uint32_t serial,
+                                uint32_t *original,
+                                uint32_t original_len,
+                                uint32_t *replaced,
+                                uint32_t replaced_len,
+                                uint8_t disabled,
+                                uint32_t *__serial);
+
+struct rbug_proto_shader_list * rbug_demarshal_shader_list(struct rbug_proto_header *header);
+
+struct rbug_proto_shader_info * rbug_demarshal_shader_info(struct rbug_proto_header *header);
+
+struct rbug_proto_shader_disable * rbug_demarshal_shader_disable(struct rbug_proto_header *header);
+
+struct rbug_proto_shader_replace * rbug_demarshal_shader_replace(struct rbug_proto_header *header);
+
+struct rbug_proto_shader_list_reply * rbug_demarshal_shader_list_reply(struct rbug_proto_header *header);
+
+struct rbug_proto_shader_info_reply * rbug_demarshal_shader_info_reply(struct rbug_proto_header *header);
+
+#endif
diff --git a/src/gallium/auxiliary/rbug/rbug_texture.c b/src/gallium/auxiliary/rbug/rbug_texture.c
new file mode 100644 (file)
index 0000000..5a918fe
--- /dev/null
@@ -0,0 +1,631 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file holds the function implementation for one of the rbug extensions.
+ * Prototypes and declerations of functions and structs is in the same folder
+ * in the header file matching this file's name.
+ *
+ * The functions starting rbug_send_* encodes a call to the write format and
+ * sends that to the supplied connection, while functions starting with
+ * rbug_demarshal_* demarshal data in the wire protocol.
+ *
+ * Functions ending with _reply are replies to requests.
+ */
+
+#include "rbug_internal.h"
+#include "rbug/rbug_texture.h"
+
+int rbug_send_texture_list(struct rbug_connection *__con,
+                           uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_LIST));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_TEXTURE_LIST, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_texture_info(struct rbug_connection *__con,
+                           rbug_texture_t texture,
+                           uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(8); /* texture */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_INFO));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(8, rbug_texture_t, texture); /* texture */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_TEXTURE_INFO, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_texture_write(struct rbug_connection *__con,
+                            rbug_texture_t texture,
+                            uint32_t face,
+                            uint32_t level,
+                            uint32_t zslice,
+                            uint32_t x,
+                            uint32_t y,
+                            uint32_t w,
+                            uint32_t h,
+                            uint8_t *data,
+                            uint32_t data_len,
+                            uint32_t stride,
+                            uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(8); /* texture */
+       LEN(4); /* face */
+       LEN(4); /* level */
+       LEN(4); /* zslice */
+       LEN(4); /* x */
+       LEN(4); /* y */
+       LEN(4); /* w */
+       LEN(4); /* h */
+       LEN_ARRAY(1, data); /* data */
+       LEN(4); /* stride */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_WRITE));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(8, rbug_texture_t, texture); /* texture */
+       WRITE(4, uint32_t, face); /* face */
+       WRITE(4, uint32_t, level); /* level */
+       WRITE(4, uint32_t, zslice); /* zslice */
+       WRITE(4, uint32_t, x); /* x */
+       WRITE(4, uint32_t, y); /* y */
+       WRITE(4, uint32_t, w); /* w */
+       WRITE(4, uint32_t, h); /* h */
+       WRITE_ARRAY(1, uint8_t, data); /* data */
+       WRITE(4, uint32_t, stride); /* stride */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_TEXTURE_WRITE, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_texture_read(struct rbug_connection *__con,
+                           rbug_texture_t texture,
+                           uint32_t face,
+                           uint32_t level,
+                           uint32_t zslice,
+                           uint32_t x,
+                           uint32_t y,
+                           uint32_t w,
+                           uint32_t h,
+                           uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(8); /* texture */
+       LEN(4); /* face */
+       LEN(4); /* level */
+       LEN(4); /* zslice */
+       LEN(4); /* x */
+       LEN(4); /* y */
+       LEN(4); /* w */
+       LEN(4); /* h */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_READ));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(8, rbug_texture_t, texture); /* texture */
+       WRITE(4, uint32_t, face); /* face */
+       WRITE(4, uint32_t, level); /* level */
+       WRITE(4, uint32_t, zslice); /* zslice */
+       WRITE(4, uint32_t, x); /* x */
+       WRITE(4, uint32_t, y); /* y */
+       WRITE(4, uint32_t, w); /* w */
+       WRITE(4, uint32_t, h); /* h */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_TEXTURE_READ, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_texture_list_reply(struct rbug_connection *__con,
+                                 uint32_t serial,
+                                 rbug_texture_t *textures,
+                                 uint32_t textures_len,
+                                 uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(4); /* serial */
+       LEN_ARRAY(8, textures); /* textures */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_LIST_REPLY));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(4, uint32_t, serial); /* serial */
+       WRITE_ARRAY(8, rbug_texture_t, textures); /* textures */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_TEXTURE_LIST_REPLY, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_texture_info_reply(struct rbug_connection *__con,
+                                 uint32_t serial,
+                                 uint32_t target,
+                                 uint32_t format,
+                                 uint32_t *width,
+                                 uint32_t width_len,
+                                 uint32_t *height,
+                                 uint32_t height_len,
+                                 uint32_t *depth,
+                                 uint32_t depth_len,
+                                 uint32_t blockw,
+                                 uint32_t blockh,
+                                 uint32_t blocksize,
+                                 uint32_t last_level,
+                                 uint32_t nr_samples,
+                                 uint32_t tex_usage,
+                                 uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(4); /* serial */
+       LEN(4); /* target */
+       LEN(4); /* format */
+       LEN_ARRAY(4, width); /* width */
+       LEN_ARRAY(4, height); /* height */
+       LEN_ARRAY(4, depth); /* depth */
+       LEN(4); /* blockw */
+       LEN(4); /* blockh */
+       LEN(4); /* blocksize */
+       LEN(4); /* last_level */
+       LEN(4); /* nr_samples */
+       LEN(4); /* tex_usage */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_INFO_REPLY));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(4, uint32_t, serial); /* serial */
+       WRITE(4, uint32_t, target); /* target */
+       WRITE(4, uint32_t, format); /* format */
+       WRITE_ARRAY(4, uint32_t, width); /* width */
+       WRITE_ARRAY(4, uint32_t, height); /* height */
+       WRITE_ARRAY(4, uint32_t, depth); /* depth */
+       WRITE(4, uint32_t, blockw); /* blockw */
+       WRITE(4, uint32_t, blockh); /* blockh */
+       WRITE(4, uint32_t, blocksize); /* blocksize */
+       WRITE(4, uint32_t, last_level); /* last_level */
+       WRITE(4, uint32_t, nr_samples); /* nr_samples */
+       WRITE(4, uint32_t, tex_usage); /* tex_usage */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_TEXTURE_INFO_REPLY, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+int rbug_send_texture_read_reply(struct rbug_connection *__con,
+                                 uint32_t serial,
+                                 uint32_t format,
+                                 uint32_t blockw,
+                                 uint32_t blockh,
+                                 uint32_t blocksize,
+                                 uint8_t *data,
+                                 uint32_t data_len,
+                                 uint32_t stride,
+                                 uint32_t *__serial)
+{
+       uint32_t __len = 0;
+       uint32_t __pos = 0;
+       uint8_t *__data = NULL;
+       int __ret = 0;
+
+       LEN(8); /* header */
+       LEN(4); /* serial */
+       LEN(4); /* format */
+       LEN(4); /* blockw */
+       LEN(4); /* blockh */
+       LEN(4); /* blocksize */
+       LEN_ARRAY(1, data); /* data */
+       LEN(4); /* stride */
+
+       /* align */
+       PAD(__len, 8);
+
+       __data = (uint8_t*)MALLOC(__len);
+       if (!__data)
+               return -ENOMEM;
+
+       WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_READ_REPLY));
+       WRITE(4, uint32_t, ((uint32_t)(__len / 4)));
+       WRITE(4, uint32_t, serial); /* serial */
+       WRITE(4, uint32_t, format); /* format */
+       WRITE(4, uint32_t, blockw); /* blockw */
+       WRITE(4, uint32_t, blockh); /* blockh */
+       WRITE(4, uint32_t, blocksize); /* blocksize */
+       WRITE_ARRAY(1, uint8_t, data); /* data */
+       WRITE(4, uint32_t, stride); /* stride */
+
+       /* final pad */
+       PAD(__pos, 8);
+
+       if (__pos != __len) {
+               __ret = -EINVAL;
+       } else {
+               rbug_connection_send_start(__con, RBUG_OP_TEXTURE_READ_REPLY, __len);
+               rbug_connection_write(__con, __data, __len);
+               __ret = rbug_connection_send_finish(__con, __serial);
+       }
+
+       FREE(__data);
+       return __ret;
+}
+
+struct rbug_proto_texture_list * rbug_demarshal_texture_list(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_texture_list *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_TEXTURE_LIST)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+
+       return ret;
+}
+
+struct rbug_proto_texture_info * rbug_demarshal_texture_info(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_texture_info *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_TEXTURE_INFO)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(8, rbug_texture_t, texture); /* texture */
+
+       return ret;
+}
+
+struct rbug_proto_texture_write * rbug_demarshal_texture_write(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_texture_write *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_TEXTURE_WRITE)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(8, rbug_texture_t, texture); /* texture */
+       READ(4, uint32_t, face); /* face */
+       READ(4, uint32_t, level); /* level */
+       READ(4, uint32_t, zslice); /* zslice */
+       READ(4, uint32_t, x); /* x */
+       READ(4, uint32_t, y); /* y */
+       READ(4, uint32_t, w); /* w */
+       READ(4, uint32_t, h); /* h */
+       READ_ARRAY(1, uint8_t, data); /* data */
+       READ(4, uint32_t, stride); /* stride */
+
+       return ret;
+}
+
+struct rbug_proto_texture_read * rbug_demarshal_texture_read(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_texture_read *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_TEXTURE_READ)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(8, rbug_texture_t, texture); /* texture */
+       READ(4, uint32_t, face); /* face */
+       READ(4, uint32_t, level); /* level */
+       READ(4, uint32_t, zslice); /* zslice */
+       READ(4, uint32_t, x); /* x */
+       READ(4, uint32_t, y); /* y */
+       READ(4, uint32_t, w); /* w */
+       READ(4, uint32_t, h); /* h */
+
+       return ret;
+}
+
+struct rbug_proto_texture_list_reply * rbug_demarshal_texture_list_reply(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_texture_list_reply *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_TEXTURE_LIST_REPLY)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(4, uint32_t, serial); /* serial */
+       READ_ARRAY(8, rbug_texture_t, textures); /* textures */
+
+       return ret;
+}
+
+struct rbug_proto_texture_info_reply * rbug_demarshal_texture_info_reply(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_texture_info_reply *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_TEXTURE_INFO_REPLY)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(4, uint32_t, serial); /* serial */
+       READ(4, uint32_t, target); /* target */
+       READ(4, uint32_t, format); /* format */
+       READ_ARRAY(4, uint32_t, width); /* width */
+       READ_ARRAY(4, uint32_t, height); /* height */
+       READ_ARRAY(4, uint32_t, depth); /* depth */
+       READ(4, uint32_t, blockw); /* blockw */
+       READ(4, uint32_t, blockh); /* blockh */
+       READ(4, uint32_t, blocksize); /* blocksize */
+       READ(4, uint32_t, last_level); /* last_level */
+       READ(4, uint32_t, nr_samples); /* nr_samples */
+       READ(4, uint32_t, tex_usage); /* tex_usage */
+
+       return ret;
+}
+
+struct rbug_proto_texture_read_reply * rbug_demarshal_texture_read_reply(struct rbug_proto_header *header)
+{
+       uint32_t len = 0;
+       uint32_t pos = 0;
+       uint8_t *data =  NULL;
+       struct rbug_proto_texture_read_reply *ret;
+
+       if (!header)
+               return NULL;
+       if (header->opcode != (int16_t)RBUG_OP_TEXTURE_READ_REPLY)
+               return NULL;
+
+       pos = 0;
+       len = header->length * 4;
+       data = (uint8_t*)&header[1];
+       ret = MALLOC(sizeof(*ret));
+       if (!ret)
+               return NULL;
+
+       ret->header.__message = header;
+       ret->header.opcode = header->opcode;
+
+       READ(4, uint32_t, serial); /* serial */
+       READ(4, uint32_t, format); /* format */
+       READ(4, uint32_t, blockw); /* blockw */
+       READ(4, uint32_t, blockh); /* blockh */
+       READ(4, uint32_t, blocksize); /* blocksize */
+       READ_ARRAY(1, uint8_t, data); /* data */
+       READ(4, uint32_t, stride); /* stride */
+
+       return ret;
+}
diff --git a/src/gallium/auxiliary/rbug/rbug_texture.h b/src/gallium/auxiliary/rbug/rbug_texture.h
new file mode 100644 (file)
index 0000000..2bcc356
--- /dev/null
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file holds structs decelerations and function prototypes for one of
+ * the rbug extensions. Implementation of the functions is in the same folder
+ * in the c file matching this file's name.
+ *
+ * The structs what is returned from the demarshal functions. The functions
+ * starting rbug_send_* encodes a call to the write format and sends that to
+ * the supplied connection, while functions starting with rbug_demarshal_*
+ * demarshal data from the wire protocol.
+ *
+ * Structs and functions ending with _reply are replies to requests.
+ */
+
+#ifndef _RBUG_PROTO_TEXTURE_H_
+#define _RBUG_PROTO_TEXTURE_H_
+
+#include "rbug/rbug_proto.h"
+
+typedef uint64_t rbug_texture_t;
+
+struct rbug_proto_texture_list
+{
+       struct rbug_header header;
+};
+
+struct rbug_proto_texture_info
+{
+       struct rbug_header header;
+       rbug_texture_t texture;
+};
+
+struct rbug_proto_texture_write
+{
+       struct rbug_header header;
+       rbug_texture_t texture;
+       uint32_t face;
+       uint32_t level;
+       uint32_t zslice;
+       uint32_t x;
+       uint32_t y;
+       uint32_t w;
+       uint32_t h;
+       uint8_t *data;
+       uint32_t data_len;
+       uint32_t stride;
+};
+
+struct rbug_proto_texture_read
+{
+       struct rbug_header header;
+       rbug_texture_t texture;
+       uint32_t face;
+       uint32_t level;
+       uint32_t zslice;
+       uint32_t x;
+       uint32_t y;
+       uint32_t w;
+       uint32_t h;
+};
+
+struct rbug_proto_texture_list_reply
+{
+       struct rbug_header header;
+       uint32_t serial;
+       rbug_texture_t *textures;
+       uint32_t textures_len;
+};
+
+struct rbug_proto_texture_info_reply
+{
+       struct rbug_header header;
+       uint32_t serial;
+       uint32_t target;
+       uint32_t format;
+       uint32_t *width;
+       uint32_t width_len;
+       uint32_t *height;
+       uint32_t height_len;
+       uint32_t *depth;
+       uint32_t depth_len;
+       uint32_t blockw;
+       uint32_t blockh;
+       uint32_t blocksize;
+       uint32_t last_level;
+       uint32_t nr_samples;
+       uint32_t tex_usage;
+};
+
+struct rbug_proto_texture_read_reply
+{
+       struct rbug_header header;
+       uint32_t serial;
+       uint32_t format;
+       uint32_t blockw;
+       uint32_t blockh;
+       uint32_t blocksize;
+       uint8_t *data;
+       uint32_t data_len;
+       uint32_t stride;
+};
+
+int rbug_send_texture_list(struct rbug_connection *__con,
+                           uint32_t *__serial);
+
+int rbug_send_texture_info(struct rbug_connection *__con,
+                           rbug_texture_t texture,
+                           uint32_t *__serial);
+
+int rbug_send_texture_write(struct rbug_connection *__con,
+                            rbug_texture_t texture,
+                            uint32_t face,
+                            uint32_t level,
+                            uint32_t zslice,
+                            uint32_t x,
+                            uint32_t y,
+                            uint32_t w,
+                            uint32_t h,
+                            uint8_t *data,
+                            uint32_t data_len,
+                            uint32_t stride,
+                            uint32_t *__serial);
+
+int rbug_send_texture_read(struct rbug_connection *__con,
+                           rbug_texture_t texture,
+                           uint32_t face,
+                           uint32_t level,
+                           uint32_t zslice,
+                           uint32_t x,
+                           uint32_t y,
+                           uint32_t w,
+                           uint32_t h,
+                           uint32_t *__serial);
+
+int rbug_send_texture_list_reply(struct rbug_connection *__con,
+                                 uint32_t serial,
+                                 rbug_texture_t *textures,
+                                 uint32_t textures_len,
+                                 uint32_t *__serial);
+
+int rbug_send_texture_info_reply(struct rbug_connection *__con,
+                                 uint32_t serial,
+                                 uint32_t target,
+                                 uint32_t format,
+                                 uint32_t *width,
+                                 uint32_t width_len,
+                                 uint32_t *height,
+                                 uint32_t height_len,
+                                 uint32_t *depth,
+                                 uint32_t depth_len,
+                                 uint32_t blockw,
+                                 uint32_t blockh,
+                                 uint32_t blocksize,
+                                 uint32_t last_level,
+                                 uint32_t nr_samples,
+                                 uint32_t tex_usage,
+                                 uint32_t *__serial);
+
+int rbug_send_texture_read_reply(struct rbug_connection *__con,
+                                 uint32_t serial,
+                                 uint32_t format,
+                                 uint32_t blockw,
+                                 uint32_t blockh,
+                                 uint32_t blocksize,
+                                 uint8_t *data,
+                                 uint32_t data_len,
+                                 uint32_t stride,
+                                 uint32_t *__serial);
+
+struct rbug_proto_texture_list * rbug_demarshal_texture_list(struct rbug_proto_header *header);
+
+struct rbug_proto_texture_info * rbug_demarshal_texture_info(struct rbug_proto_header *header);
+
+struct rbug_proto_texture_write * rbug_demarshal_texture_write(struct rbug_proto_header *header);
+
+struct rbug_proto_texture_read * rbug_demarshal_texture_read(struct rbug_proto_header *header);
+
+struct rbug_proto_texture_list_reply * rbug_demarshal_texture_list_reply(struct rbug_proto_header *header);
+
+struct rbug_proto_texture_info_reply * rbug_demarshal_texture_info_reply(struct rbug_proto_header *header);
+
+struct rbug_proto_texture_read_reply * rbug_demarshal_texture_read_reply(struct rbug_proto_header *header);
+
+#endif