Mesa (master): Create common trace_drm code, add to radeon_winsys.

Corbin Simpson csimpson at kemper.freedesktop.org
Sat May 16 17:08:10 UTC 2009


Module: Mesa
Branch: master
Commit: 5e39a8c4503596a019dc7c3ed4e24ee4117b1fca
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5e39a8c4503596a019dc7c3ed4e24ee4117b1fca

Author: Corbin Simpson <MostAwesomeDude at gmail.com>
Date:   Sat May 16 09:58:54 2009 -0700

Create common trace_drm code, add to radeon_winsys.

---

 src/gallium/auxiliary/trace/trace_drm.h         |  165 +++++++++++++++++++++++
 src/gallium/winsys/drm/radeon/core/radeon_drm.c |    8 +
 src/gallium/winsys/drm/radeon/dri/Makefile      |    1 +
 src/gallium/winsys/drm/radeon/egl/Makefile      |    1 +
 4 files changed, 175 insertions(+), 0 deletions(-)

diff --git a/src/gallium/auxiliary/trace/trace_drm.h b/src/gallium/auxiliary/trace/trace_drm.h
new file mode 100644
index 0000000..892bd98
--- /dev/null
+++ b/src/gallium/auxiliary/trace/trace_drm.h
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2009 Jakob Bornecrantz <jakob at vmware.com>
+ *                Corbin Simpson <MostAwesomeDude at gmail.com>
+ *
+ * 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
+ * THE AUTHOR(S) 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. */
+
+#ifndef TRACE_DRM_H
+#define TRACE_DRM_H
+
+#include "state_tracker/drm_api.h"
+
+#include "trace/tr_buffer.h"
+#include "trace/tr_context.h"
+#include "trace/tr_screen.h"
+#include "trace/tr_texture.h"
+
+struct drm_api hooks;
+
+static struct pipe_screen *
+trace_drm_create_screen(int fd, struct drm_create_screen_arg *arg)
+{
+	struct pipe_screen *screen;
+
+	if (arg && arg->mode != DRM_CREATE_NORMAL)
+		return NULL;
+
+	screen = hooks.create_screen(fd, arg);
+
+	return trace_screen_create(screen);
+};
+
+static struct pipe_context *
+trace_drm_create_context(struct pipe_screen *_screen)
+{
+	struct pipe_screen *screen;
+	struct pipe_context *pipe;
+
+	if (trace_enabled())
+		screen = trace_screen(_screen)->screen;
+	else
+		screen = _screen;
+
+	pipe = hooks.create_context(screen);
+
+	if (trace_enabled())
+		pipe = trace_context_create(_screen, pipe);
+
+	return pipe;
+};
+
+static boolean
+trace_drm_buffer_from_texture(struct pipe_texture *_texture,
+                              struct pipe_buffer **_buffer,
+                              unsigned *stride)
+{
+	struct pipe_texture *texture;
+	struct pipe_buffer *buffer = NULL;
+	boolean result;
+
+	if (trace_enabled())
+		texture = trace_texture(_texture)->texture;
+	else
+		texture = _texture;
+
+	result = hooks.buffer_from_texture(texture, &buffer, stride);
+
+	if (result && _buffer)
+		buffer = trace_buffer_create(trace_screen(texture->screen), buffer);
+
+	if (_buffer)
+		*_buffer = buffer;
+	else
+		pipe_buffer_reference(&buffer, NULL);
+
+	return result;
+}
+
+static struct pipe_buffer *
+trace_drm_buffer_from_handle(struct pipe_screen *_screen,
+                             const char *name,
+                             unsigned handle)
+{
+	struct pipe_screen *screen;
+	struct pipe_buffer *result;
+
+	if (trace_enabled())
+		screen = trace_screen(_screen)->screen;
+	else
+		screen = _screen;
+
+	result = hooks.buffer_from_handle(screen, name, handle);
+
+	if (trace_enabled())
+		result = trace_buffer_create(trace_screen(_screen), result);
+
+	return result;
+}
+
+static boolean
+trace_drm_handle_from_buffer(struct pipe_screen *_screen,
+                             struct pipe_buffer *_buffer,
+                             unsigned *handle)
+{
+	struct pipe_screen *screen;
+	struct pipe_buffer *buffer;
+
+	if (trace_enabled()) {
+		screen = trace_screen(_screen)->screen;
+		buffer = trace_buffer(_buffer)->buffer;
+	} else {
+		screen = _screen;
+		buffer = _buffer;
+	}
+
+	return hooks.handle_from_buffer(screen, buffer, handle);
+}
+
+static boolean
+trace_drm_global_handle_from_buffer(struct pipe_screen *_screen,
+                                    struct pipe_buffer *_buffer,
+                                    unsigned *handle)
+{
+	struct pipe_screen *screen;
+	struct pipe_buffer *buffer;
+
+	if (trace_enabled()) {
+		screen = trace_screen(_screen)->screen;
+		buffer = trace_buffer(_buffer)->buffer;
+	} else {
+		screen = _screen;
+		buffer = _buffer;
+	}
+
+	return hooks.global_handle_from_buffer(screen, buffer, handle);
+}
+
+struct drm_api drm_api_hooks =
+{
+	.create_screen = trace_drm_create_screen,
+	.create_context = trace_drm_create_context,
+
+	.buffer_from_texture = trace_drm_buffer_from_texture,
+	.buffer_from_handle = trace_drm_buffer_from_handle,
+	.handle_from_buffer = trace_drm_handle_from_buffer,
+	.global_handle_from_buffer = trace_drm_global_handle_from_buffer,
+};
+
+#endif /* TRACE_DRM_H */
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_drm.c b/src/gallium/winsys/drm/radeon/core/radeon_drm.c
index 428d3f6..5406d2b 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_drm.c
+++ b/src/gallium/winsys/drm/radeon/core/radeon_drm.c
@@ -30,6 +30,10 @@
 
 #include "radeon_drm.h"
 
+#ifdef DEBUG
+#include "trace/trace_drm.h"
+#endif
+
 /* Create a pipe_screen. */
 struct pipe_screen* radeon_create_screen(int drmFB,
 					 struct drm_create_screen_arg *arg)
@@ -112,7 +116,11 @@ boolean radeon_global_handle_from_buffer(struct pipe_screen* screen,
     return TRUE;
 }
 
+#ifdef DEBUG
+struct drm_api hooks = {
+#else
 struct drm_api drm_api_hooks = {
+#endif
     .create_screen = radeon_create_screen,
     .create_context = radeon_create_context,
     /* XXX fix this */
diff --git a/src/gallium/winsys/drm/radeon/dri/Makefile b/src/gallium/winsys/drm/radeon/dri/Makefile
index c218ee9..a988944 100644
--- a/src/gallium/winsys/drm/radeon/dri/Makefile
+++ b/src/gallium/winsys/drm/radeon/dri/Makefile
@@ -10,6 +10,7 @@ PIPE_DRIVERS = \
 	$(TOP)/src/gallium/state_trackers/dri/libdridrm.a \
 	$(TOP)/src/gallium/winsys/drm/radeon/core/libradeonwinsys.a \
 	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
+	$(TOP)/src/gallium/drivers/trace/libtrace.a \
 	$(TOP)/src/gallium/drivers/r300/libr300.a
 
 C_SOURCES = \
diff --git a/src/gallium/winsys/drm/radeon/egl/Makefile b/src/gallium/winsys/drm/radeon/egl/Makefile
index d989b3a..6a1448d 100644
--- a/src/gallium/winsys/drm/radeon/egl/Makefile
+++ b/src/gallium/winsys/drm/radeon/egl/Makefile
@@ -8,6 +8,7 @@ PIPE_DRIVERS = \
 	$(TOP)/src/gallium/state_trackers/egl/libegldrm.a \
 	$(GALLIUMDIR)/winsys/drm/radeon/core/libradeonwinsys.a \
 	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
+	$(TOP)/src/gallium/drivers/trace/libtrace.a \
 	$(TOP)/src/gallium/drivers/r300/libr300.a
 
 DRIVER_SOURCES =




More information about the mesa-commit mailing list