summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/r300/r300_texture.c18
-rw-r--r--src/gallium/drivers/r300/r300_texture.h8
-rw-r--r--src/gallium/drivers/r300/r300_winsys.h4
-rw-r--r--src/gallium/winsys/drm/radeon/radeon_drm.c18
4 files changed, 45 insertions, 3 deletions
diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index 8251a597eab..b3425587e38 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -186,3 +186,21 @@ void r300_init_screen_texture_functions(struct pipe_screen* screen)
screen->tex_surface_release = r300_tex_surface_release;
screen->texture_blanket = r300_texture_blanket;
}
+
+boolean r300_get_texture_buffer(struct pipe_texture* texture,
+ struct pipe_buffer** buffer,
+ unsigned* stride)
+{
+ struct r300_texture* tex = (struct r300_texture*)texture;
+ if (!tex) {
+ return FALSE;
+ }
+
+ pipe_buffer_reference(texture->screen, buffer, tex->buffer);
+
+ if (stride) {
+ *stride = tex->stride;
+ }
+
+ return TRUE;
+}
diff --git a/src/gallium/drivers/r300/r300_texture.h b/src/gallium/drivers/r300/r300_texture.h
index 7964229a94f..27f5ea1eb7b 100644
--- a/src/gallium/drivers/r300/r300_texture.h
+++ b/src/gallium/drivers/r300/r300_texture.h
@@ -31,4 +31,12 @@
void r300_init_screen_texture_functions(struct pipe_screen* screen);
+#ifndef R300_WINSYS_H
+
+boolean r300_get_texture_buffer(struct pipe_texture* texture,
+ struct pipe_buffer** buffer,
+ unsigned* stride);
+
+#endif /* R300_WINSYS_H */
+
#endif /* R300_TEXTURE_H */
diff --git a/src/gallium/drivers/r300/r300_winsys.h b/src/gallium/drivers/r300/r300_winsys.h
index b7341c4f3ad..8c9578de514 100644
--- a/src/gallium/drivers/r300/r300_winsys.h
+++ b/src/gallium/drivers/r300/r300_winsys.h
@@ -92,4 +92,8 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
}
#endif
+boolean r300_get_texture_buffer(struct pipe_texture* texture,
+ struct pipe_buffer** buffer,
+ unsigned* stride);
+
#endif /* R300_WINSYS_H */
diff --git a/src/gallium/winsys/drm/radeon/radeon_drm.c b/src/gallium/winsys/drm/radeon/radeon_drm.c
index 9cd178f944a..21f2a62e0fe 100644
--- a/src/gallium/winsys/drm/radeon/radeon_drm.c
+++ b/src/gallium/winsys/drm/radeon/radeon_drm.c
@@ -59,6 +59,7 @@ boolean radeon_buffer_from_texture(struct pipe_texture* texture,
struct pipe_buffer** buffer,
unsigned* stride)
{
+ return FALSE;
}
/* Create a buffer from a handle. */
@@ -67,7 +68,8 @@ struct pipe_buffer* radeon_buffer_from_handle(struct pipe_screen* screen,
const char* name,
unsigned handle)
{
- struct radeon_bo_manager* bom = ((struct radeon_winsys*)screen->winsys)->bom;
+ struct radeon_bo_manager* bom =
+ ((struct radeon_winsys*)screen->winsys)->bom;
struct radeon_pipe_buffer* radeon_buffer;
struct radeon_bo* bo = NULL;
@@ -92,19 +94,29 @@ boolean radeon_handle_from_buffer(struct pipe_screen* screen,
struct pipe_buffer* buffer,
unsigned* handle)
{
+ struct radeon_pipe_buffer* radeon_buffer =
+ (struct radeon_pipe_buffer*)buffer;
+ *handle = radeon_buffer->bo->handle;
+ return TRUE;
}
boolean radeon_global_handle_from_buffer(struct pipe_screen* screen,
struct pipe_buffer* buffer,
unsigned* handle)
{
+ /* XXX WTF is the difference here? global? */
+ struct radeon_pipe_buffer* radeon_buffer =
+ (struct radeon_pipe_buffer*)buffer;
+ *handle = radeon_buffer->bo->handle;
+ return TRUE;
}
struct drm_api drm_api_hooks = {
.create_screen = radeon_create_screen,
.create_context = radeon_create_context,
- .buffer_from_texture = radeon_buffer_from_texture,
+ /* XXX fix this */
+ .buffer_from_texture = r300_get_texture_buffer,
.buffer_from_handle = radeon_buffer_from_handle,
.handle_from_buffer = radeon_handle_from_buffer,
.global_handle_from_buffer = radeon_global_handle_from_buffer,
-}; \ No newline at end of file
+};