summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2011-06-22 13:45:35 +0200
committerAlon Levy <alevy@redhat.com>2011-08-26 16:22:12 +0300
commitf3badccdd2a71cb9d18649b3c17d240daa98431a (patch)
tree5e23122829440be574d922b376785657adc7ab4d
parentb768cfd9daa2150c5a8ee6c302593b7f71ff4e48 (diff)
g/d/r: builds and links, now how do I get a libGL.so?
-rw-r--r--src/gallium/drivers/remote/tr_screen.c534
1 files changed, 171 insertions, 363 deletions
diff --git a/src/gallium/drivers/remote/tr_screen.c b/src/gallium/drivers/remote/tr_screen.c
index 4de287a55e..dfa49ba4af 100644
--- a/src/gallium/drivers/remote/tr_screen.c
+++ b/src/gallium/drivers/remote/tr_screen.c
@@ -88,7 +88,7 @@ remote_screen_get_vendor(struct pipe_screen *_screen)
static int
remote_screen_get_param(struct pipe_screen *_screen,
- int param) {
+ enum pipe_cap param) {
struct remote_screen* rscreen = (struct remote_screen*)_screen;
@@ -115,10 +115,17 @@ remote_screen_get_param(struct pipe_screen *_screen,
}
+static int
+remote_screen_get_shader_param(struct pipe_screen *_screen, unsigned shader,
+ enum pipe_shader_cap param)
+{
+ return 0;
+}
+
static float
remote_screen_get_paramf(struct pipe_screen *_screen,
- int param)
+ enum pipe_cap param)
{
struct remote_screen* rscreen = (struct remote_screen*)_screen;
@@ -180,173 +187,6 @@ remote_screen_is_format_supported(struct pipe_screen *_screen,
}
-#define minify(x) (((x >> 1) > 0) ? (x >> 1) : 1)
-
-static struct pipe_texture *
-remote_screen_texture_create(struct pipe_screen *_screen,
- const struct pipe_texture *templat)
-{
- struct remote_screen *tr_scr = remote_screen(_screen);
-
- ALLOC_OUT_MESSAGE(texture_create, message);
-
- uint32_t handle = get_fresh_texture_handle(_screen);
-
- DBG("Creating new texture, using handle %u\n", handle);
-
- message->base.opcode = REMREQ_TEXTURE_CREATE;
- message->templat = *templat;
- message->screen = tr_scr->remote_handle;
- message->handle = handle;
-
- enqueue_message(message);
-
- struct remote_texture* result = CALLOC_STRUCT(remote_texture);
-
- result->base = *templat; // Struct copy
- result->base.screen = _screen;
- result->base.refcount = 1;
- result->handle = handle;
-
- pf_get_block(result->base.format, &result->base.block);
-
- // This bit heavily based off softpipe's texture allocation stuff
-
- DBG("Texture create: %d levels, base dimension %dx%dx%d\n", result->base.last_level, result->base.width[0], result->base.height[0], result->base.depth[0]);
-
- unsigned int width = result->base.width[0];
- unsigned int height = result->base.height[0];
- unsigned int depth = result->base.depth[0];
-
- unsigned int buffer_size = 0;
-
- for(unsigned int i = 0; i <= result->base.last_level; i++) {
-
- result->base.width[i] = width;
- result->base.height[i] = height;
- result->base.depth[i] = depth;
- result->base.nblocksx[i] = pf_get_nblocksx(&result->base.block, width);
- result->base.nblocksy[i] = pf_get_nblocksy(&result->base.block, height);
- result->level_offset[i] = buffer_size;
- result->stride[i] = result->base.nblocksx[i] * result->base.block.size;
-
- int plane_size = result->base.nblocksx[i] * result->base.nblocksy[i] * result->base.block.size;
-
- buffer_size += (plane_size * ((result->base.target == PIPE_TEXTURE_CUBE) ? 6 : depth));
-
- DBG("Level %d consists of %dx%d blocks; block size %d; %d planes\n", i, result->base.nblocksx[i], result->base.nblocksy[i], result->base.block.size, (result->base.target == PIPE_TEXTURE_CUBE ? 6 : depth));
-
- width = minify(width);
- height = minify(height);
- depth = minify(depth);
-
- }
-
- DBG("In total will allocate a buffer of size %d\n", buffer_size);
-
- result->backing_buffer = create_anon_buffer(buffer_size);
-
- if(!result->backing_buffer) {
- free(result);
- return 0;
- }
- else {
- return &(result->base);
- }
-
-}
-
-
-static struct pipe_texture *
-remote_screen_texture_blanket(struct pipe_screen *_screen,
- const struct pipe_texture *templat,
- const unsigned *ppitch,
- struct pipe_buffer *buffer)
-{
-
- struct remote_screen *tr_scr = remote_screen(_screen);
-
- if(templat->target != PIPE_TEXTURE_2D ||
- templat->last_level != 0 ||
- templat->depth[0] != 1)
- return NULL;
-
- // All current Gallium drivers enforce this... and it seems as though
- // there is no way to express how you want extra mip-levels or planes
- // to be laid out in the buffer, so it's probably the only reasonable
- // thing to do with this interface.
-
- ALLOC_OUT_MESSAGE(texture_blanket, message);
-
- uint32_t handle = get_fresh_texture_handle(_screen);
-
- DBG("Blanket: created texture %u based on buffer %u\n", handle, BUFFER_HANDLE(buffer));
-
- message->base.opcode = REMREQ_TEXTURE_BLANKET;
- message->templat = *templat;
- message->screen = tr_scr->remote_handle;
- message->pitch = *ppitch;
- message->buffer = BUFFER_HANDLE(buffer);
- message->handle = handle;
-
- enqueue_message(message);
-
- struct remote_texture* result = CALLOC_STRUCT(remote_texture);
-
- result->base = *templat; // Struct copy
- result->base.screen = _screen;
- result->base.refcount = 1;
- result->handle = handle;
-
- pf_get_block(result->base.format, &result->base.block);
-
- // This bit heavily based off softpipe's texture allocation stuff
-
- pipe_buffer_reference(_screen, &result->backing_buffer, buffer);
-
- return &(result->base);
-
-}
-
-
-static void
-remote_screen_texture_release(struct pipe_screen *_screen,
- struct pipe_texture **ptexture)
-{
-
- if(*ptexture)
- DBG("Texture release: had refcount %d\n", (*ptexture)->refcount);
- else
- DBG("Texture release called against null pointer\n");
-
- if((*ptexture) && !(--((*ptexture)->refcount))) {
-
- DBG("Our local refcount reached zero; remote deref on texture %u\n", TEXTURE_HANDLE(*ptexture));
-
- ALLOC_OUT_MESSAGE(texture_release, message);
-
- message->base.opcode = REMREQ_TEXTURE_RELEASE;
- message->screen = SCREEN_HANDLE(_screen);
- message->texture = TEXTURE_HANDLE(*ptexture);
-
- enqueue_message(message);
-
- struct remote_texture* rtex = (struct remote_texture*)*ptexture;
- if(rtex->backing_buffer) {
- pipe_buffer_reference(_screen, &rtex->backing_buffer, NULL);
- }
- else {
- debug_printf("!!! Freeing a texture with no backing buffer\n");
- }
-
- FREE(*ptexture);
-
- }
-
- *ptexture = NULL;
-
-}
-
static int get_or_alloc_buffer_handle(struct remote_buffer* rbuf,
struct pipe_screen* screen,
uint32_t* handle) {
@@ -363,233 +203,127 @@ static int get_or_alloc_buffer_handle(struct remote_buffer* rbuf,
}
-static struct pipe_surface *
-remote_screen_get_tex_surface(struct pipe_screen *_screen,
- struct pipe_texture *texture,
- unsigned face, unsigned level,
- unsigned zslice,
- unsigned usage)
+static void
+remote_screen_destroy(struct pipe_screen *_screen)
{
+ struct remote_screen *tr_scr = remote_screen(_screen);
- DBG("Get texture surface for texture %u\n", TEXTURE_HANDLE(texture));
- DBG("Face %u, level %u, zslice %u, usage %x\n", face, level, zslice, usage);
-
- struct remote_texture* rtex = (struct remote_texture*)texture;
-
- uint32_t buffer_handle;
- int new_name = get_or_alloc_buffer_handle((struct remote_buffer*)rtex->backing_buffer, _screen, &buffer_handle);
- // Gives the buffer a name, if it hadn't one already
-
- if(new_name)
- DBG("Get tex surface: the buffer had no name\n");
- else
- DBG("Get tex surface: the buffer had a name already\n");
-
- uint32_t surf_handle = get_fresh_surface_handle(_screen);
+ DBG("Destroying screen %u: closing connection\n", SCREEN_HANDLE(_screen));
- DBG("Using handle %u for new surface\n", surf_handle);
- DBG("Using handle %u for its related buffer\n", buffer_handle);
-
- ALLOC_OUT_MESSAGE(get_tex_surface, message);
-
- message->base.opcode = REMREQ_GET_TEX_SURFACE;
- message->screen = SCREEN_HANDLE(_screen);
- message->texture = TEXTURE_HANDLE(texture);
- message->face = face;
- message->level = level;
- message->zslice = zslice;
- message->usage = usage;
- message->handle = surf_handle;
- message->buffer_handle = new_name ? buffer_handle : 0;
- // 0 here signifies that we already have a name for that buffer
- // This is the *only* way for anonymous buffers to get a name
-
- enqueue_message(message);
-
- struct remote_surface* result = CALLOC_STRUCT(remote_surface);
-
- result->base.winsys = _screen->winsys;
- result->base.texture = texture;
- result->base.face = face;
- result->base.level = level;
- result->base.zslice = zslice;
- result->base.format = texture->format;
- result->base.clear_value = 0;
- result->base.width = texture->width[level];
- result->base.height = texture->height[level];
- result->base.block = texture->block;
- result->base.nblocksx = texture->nblocksx[level];
- result->base.nblocksy = texture->nblocksy[level];
- result->base.stride = rtex->stride[level];
- result->base.offset = rtex->level_offset[level];
-
- if(texture->target == PIPE_TEXTURE_CUBE || texture->target == PIPE_TEXTURE_3D) {
- result->base.offset += ((texture->target == PIPE_TEXTURE_CUBE) ? face : zslice) * result->base.nblocksy * result->base.stride;
- }
+ close(tr_scr->socketfd);
- result->base.usage = usage;
+ FREE(tr_scr);
+}
- // ...and one is used for communication between the various driver components without a callback :(
- // In the current mesa-anything arrangment of state-tracker/pipe/winsys, the winsys calls into the Mesa ST
- // to notify st_notify_swapbuffers_complete, which sets pipe status to UNDEFINED; it then gets set back to DEFINED
- // by the next call to any drawing function (softpipe,) or upon a clear or get_tex_surface (i915).
-
- // For now I will always consider my surfaces to be defined, and since my winsys doesn't call notify_swapbuffers_complete,
- // this won't be interfered with. Its only use seems to be deciding how to clear a surface, so this could easily be
- // faked out at the remote side.
+static struct pipe_context *
+remote_screen_context_create(struct pipe_screen *_screen, void *priv)
+{
+ DBG("%s: unimplemented\n", __FUNCTION__);
+ return NULL;
+}
- // At the remote, then, the winsys might well call notify_complete, but I don't do anything about it, meaning buffers will be
- // DEFINED the first time the pipe chooses and stay that way. I might need to get the DEFINED/UNDEFINED cycle going on the remote,
- // set UNDEFINED here so I get Clear() calls and not clear-with-quad, and then finally recreate the "with-quad?" logic in the remote
- // state tracker depending on DEFINED'ness.
+static void
+remote_screen_flush_frontbuffer(struct pipe_screen *_screen,
+ struct pipe_resource *_resource,
+ unsigned level, unsigned layer,
+ void *context_private)
+{
+ DBG("%s: unimplemented\n", __FUNCTION__);
+}
- result->base.status = PIPE_SURFACE_STATUS_DEFINED;
- // Not sure whether we or the remote are expected to fill this in: better safe than sorry.
- result->base.refcount = 1;
+/********************************************************************
+ * texture
+ */
- result->handle = surf_handle;
+static struct pipe_resource *
+remote_screen_resource_create(struct pipe_screen *_screen,
+ const struct pipe_resource *templat)
+{
+ struct pipe_resource *result = NULL;
- pipe_buffer_reference(_screen, &result->base.buffer, rtex->backing_buffer);
-
- return (&(result->base));
-
+ DBG("%s: unimplemented\n", __FUNCTION__);
+ return result;
}
-
-static void
-remote_screen_tex_surface_release(struct pipe_screen *_screen,
- struct pipe_surface **psurface)
+static struct pipe_resource *
+remote_screen_resource_from_handle(struct pipe_screen *_screen,
+ const struct pipe_resource *templ,
+ struct winsys_handle *handle)
{
+ struct pipe_resource *result = NULL;
- if(*psurface)
- DBG("Texture surface release on %u: old refcount %d\n", SURFACE_HANDLE(*psurface), (*psurface)->refcount);
- else
- DBG("Texture surface release passed a null pointer\n");
-
- if(*psurface && !(--((*psurface)->refcount))) {
-
- if((*psurface)->buffer) {
- pipe_buffer_reference(_screen, &((*psurface)->buffer), NULL);
- }
- else {
- debug_printf("!!! tex_surface_release with no buffer\n");
- }
-
- ALLOC_OUT_MESSAGE(tex_surface_release, message);
-
- message->base.opcode = REMREQ_TEX_SURFACE_RELEASE;
- message->screen = SCREEN_HANDLE(_screen);
- message->surface = SURFACE_HANDLE(*psurface);
-
- enqueue_message(message);
-
- FREE(*psurface);
-
- }
-
- *psurface = NULL;
+ DBG("%s: unimplemented\n", __FUNCTION__);
+ return result;
}
-
-static void*
-remote_screen_surface_map(struct pipe_screen *_screen,
- struct pipe_surface *surface,
- unsigned flags)
+static boolean
+remote_screen_resource_get_handle(struct pipe_screen *_screen,
+ struct pipe_resource *_resource,
+ struct winsys_handle *handle)
{
-
- DBG("Map surface %u (flags: %x)\n", SURFACE_HANDLE(surface), flags);
- DBG("(-->mapping buffer %u, with offset %u)\n", BUFFER_HANDLE(surface->buffer), surface->offset);
-
- char* map = (char*)pipe_buffer_map(_screen, surface->buffer, flags);
-
- return (void*)(map + surface->offset);
-
+ DBG("%s: unimplemented\n", __FUNCTION__);
+ return false;
}
-
-static void
-remote_screen_surface_unmap(struct pipe_screen *_screen,
- struct pipe_surface *surface)
+static void
+remote_screen_resource_destroy(struct pipe_screen *_screen,
+ struct pipe_resource *_resource)
{
-
- DBG("Unmap surface %u\n", SURFACE_HANDLE(surface));
-
- pipe_buffer_unmap(_screen, surface->buffer);
-
+ DBG("%s: unimplemented\n", __FUNCTION__);
}
+/********************************************************************
+ * buffer
+ */
-static void
-remote_screen_destroy(struct pipe_screen *_screen)
+static struct pipe_resource *
+remote_screen_user_buffer_create(struct pipe_screen *_screen,
+ void *data,
+ unsigned size,
+ unsigned usage)
{
- struct remote_screen *tr_scr = remote_screen(_screen);
+ DBG("%s: unimplemented\n", __FUNCTION__);
+ return NULL;
+}
- DBG("Destroying screen %u: closing connection\n", SCREEN_HANDLE(_screen));
- close(tr_scr->socketfd);
+/********************************************************************
+ * fence
+ */
- FREE(tr_scr);
-}
-struct pipe_screen *
-remote_screen_create(struct pipe_winsys* winsys)
+static void
+remote_screen_fence_reference(struct pipe_screen *_screen,
+ struct pipe_fence_handle **pdst,
+ struct pipe_fence_handle *src)
{
-
- struct remote_screen* tr_scr = CALLOC_STRUCT(remote_screen);
+ DBG("%s: unimplemented\n", __FUNCTION__);
+}
- memset(tr_scr, 0, sizeof(struct remote_screen));
- DBG("Creating new screen\n");
-
- if(!tr_scr) {
- debug_printf("Alloc failed in remote_screen_create!\n");
- return NULL;
- }
-
- tr_scr->base.winsys = winsys;
- tr_scr->base.destroy = remote_screen_destroy;
- tr_scr->base.get_name = remote_screen_get_name;
- tr_scr->base.get_vendor = remote_screen_get_vendor;
- tr_scr->base.get_param = remote_screen_get_param;
- tr_scr->base.get_shader_param = remote_screen_get_shader_param;
- tr_scr->base.get_paramf = remote_screen_get_paramf;
- tr_scr->base.is_format_supported = remote_screen_is_format_supported;
- assert(screen->context_create);
- tr_scr->base.context_create = remote_screen_context_create;
- tr_scr->base.resource_create = remote_screen_resource_create;
- tr_scr->base.resource_from_handle = remote_screen_resource_from_handle;
- tr_scr->base.resource_get_handle = remote_screen_resource_get_handle;
- tr_scr->base.resource_destroy = remote_screen_resource_destroy;
- tr_scr->base.user_buffer_create = remote_screen_user_buffer_create;
- tr_scr->base.fence_reference = remote_screen_fence_reference;
- tr_scr->base.fence_signalled = remote_screen_fence_signalled;
- tr_scr->base.fence_finish = remote_screen_fence_finish;
- tr_scr->base.flush_frontbuffer = remote_screen_flush_frontbuffer;
- tr_scr->last_query_handle = 1;
- tr_scr->last_blend_handle = 1;
- tr_scr->last_dsa_handle = 1;
- tr_scr->last_rast_handle = 1;
- tr_scr->last_sampler_handle = 1;
- tr_scr->last_fs_handle = 1;
- tr_scr->last_vs_handle = 1;
- tr_scr->last_texture_handle = 1;
- tr_scr->last_surface_handle = 1;
- tr_scr->last_buffer_handle = 1;
- tr_scr->last_window_handle = 1;
+static boolean
+remote_screen_fence_signalled(struct pipe_screen *_screen,
+ struct pipe_fence_handle *fence)
+{
+ DBG("%s: unimplemented\n", __FUNCTION__);
+ return false;
+}
- // Check if the user requests wait analysis
-
- analyse_waits = 0;
- char* analyse_waits_env = getenv("VG_ANALYSE_WAITS");
- if(analyse_waits_env) {
- if(analyse_waits_env[0] == '1') {
- debug_printf("Enabled wait analysis\n");
- analyse_waits = 1;
- }
- }
+static boolean
+remote_screen_fence_finish(struct pipe_screen *_screen,
+ struct pipe_fence_handle *fence,
+ uint64_t timeout)
+{
+ DBG("%s: unimplemented\n", __FUNCTION__);
+ return false;
+}
+#ifdef XEN_HOST
+// currently broken
+static void setup_xen_connection(struct remote_screen* tr_scr)
+{
// Set up a Xen-IDC connection to describe graphics events to the host
struct sockaddr_un sun;
@@ -743,9 +477,83 @@ remote_screen_create(struct pipe_winsys* winsys)
}
DBG("Successfully relayed that to the compositor\n");
+}
+#endif
+
+static void setup_virtio_connection(struct remote_screen* tr_scr)
+{
+ DBG("%s: unimplemented\n", __FUNCTION__);
+}
+
+static void setup_host_connection(struct remote_screen* tr_scr)
+{
+#ifdef XEN_HOST
+ setup_xen_connection(tr_scr);
+#else
+ setup_virtio_connection(tr_scr);
+#endif
+}
+
+struct pipe_screen *
+remote_screen_create(struct pipe_winsys* winsys)
+{
- return &(tr_scr->base);
+ struct remote_screen* tr_scr = CALLOC_STRUCT(remote_screen);
+
+ memset(tr_scr, 0, sizeof(struct remote_screen));
+
+ DBG("Creating new screen\n");
+
+ if(!tr_scr) {
+ debug_printf("Alloc failed in remote_screen_create!\n");
+ return NULL;
+ }
+
+ tr_scr->base.winsys = winsys;
+ tr_scr->base.destroy = remote_screen_destroy;
+ tr_scr->base.get_name = remote_screen_get_name;
+ tr_scr->base.get_vendor = remote_screen_get_vendor;
+ tr_scr->base.get_param = remote_screen_get_param;
+ tr_scr->base.get_shader_param = remote_screen_get_shader_param;
+ tr_scr->base.get_paramf = remote_screen_get_paramf;
+ tr_scr->base.is_format_supported = remote_screen_is_format_supported;
+ tr_scr->base.context_create = remote_screen_context_create;
+ tr_scr->base.resource_create = remote_screen_resource_create;
+ tr_scr->base.resource_from_handle = remote_screen_resource_from_handle;
+ tr_scr->base.resource_get_handle = remote_screen_resource_get_handle;
+ tr_scr->base.resource_destroy = remote_screen_resource_destroy;
+ tr_scr->base.user_buffer_create = remote_screen_user_buffer_create;
+ tr_scr->base.fence_reference = remote_screen_fence_reference;
+ tr_scr->base.fence_signalled = remote_screen_fence_signalled;
+ tr_scr->base.fence_finish = remote_screen_fence_finish;
+ tr_scr->base.flush_frontbuffer = remote_screen_flush_frontbuffer;
+ tr_scr->last_query_handle = 1;
+ tr_scr->last_blend_handle = 1;
+ tr_scr->last_dsa_handle = 1;
+ tr_scr->last_rast_handle = 1;
+ tr_scr->last_sampler_handle = 1;
+ tr_scr->last_fs_handle = 1;
+ tr_scr->last_vs_handle = 1;
+ tr_scr->last_texture_handle = 1;
+ tr_scr->last_surface_handle = 1;
+ tr_scr->last_buffer_handle = 1;
+ tr_scr->last_window_handle = 1;
+
+ // Check if the user requests wait analysis
+ analyse_waits = 0;
+
+ char* analyse_waits_env = getenv("VG_ANALYSE_WAITS");
+ if(analyse_waits_env) {
+ if(analyse_waits_env[0] == '1') {
+ debug_printf("Enabled wait analysis\n");
+ analyse_waits = 1;
+ }
+ }
+
+ setup_host_connection(tr_scr);
+
+ return &(tr_scr->base);
}
int complete_screen_creation(struct remote_screen* screen) {