docs: Update status of GL 3.x related extensions
[mesa.git] / src / gallium / drivers / nvfx / nvfx_resource.c
index 10cdeed2a372e21b9cff773eaf884dbec95801ab..39ae893f1b3b8c589453f2080e810c1ef4c96051 100644 (file)
@@ -1,23 +1,15 @@
 
 #include "pipe/p_context.h"
+#include "util/u_staging.h"
 #include "nvfx_resource.h"
 #include "nouveau/nouveau_screen.h"
 
-
-/* This doesn't look quite right - this query is supposed to ask
- * whether the particular context has references to the resource in
- * any unflushed rendering command buffer, and hence requires a
- * pipe->flush() for serializing some modification to that resource.
- *
- * This seems to be answering the question of whether the resource is
- * currently on hardware.
- */
 static unsigned int
 nvfx_resource_is_referenced(struct pipe_context *pipe,
-                           struct pipe_resource *resource,
+                           struct pipe_resource *pr,
                            unsigned face, unsigned level)
 {
-       return nouveau_reference_flags(nvfx_resource(resource)->bo);
+       return !!nouveau_reference_flags(nvfx_resource(pr)->bo);
 }
 
 static struct pipe_resource *
@@ -30,6 +22,15 @@ nvfx_resource_create(struct pipe_screen *screen,
                return nvfx_miptree_create(screen, template);
 }
 
+static void
+nvfx_resource_destroy(struct pipe_screen *screen, struct pipe_resource *pr)
+{
+       if (pr->target == PIPE_BUFFER)
+               return nvfx_buffer_destroy(screen, pr);
+       else
+               return nvfx_miptree_destroy(screen, pr);
+}
+
 static struct pipe_resource *
 nvfx_resource_from_handle(struct pipe_screen * screen,
                          const struct pipe_resource *template,
@@ -41,15 +42,22 @@ nvfx_resource_from_handle(struct pipe_screen * screen,
                return nvfx_miptree_from_handle(screen, template, whandle);
 }
 
+static boolean
+nvfx_resource_get_handle(struct pipe_screen *pscreen,
+                        struct pipe_resource *pr,
+                        struct winsys_handle *whandle)
+{
+       struct nvfx_resource* res = (struct nvfx_resource*)pr;
+
+       if (!res || !res->bo)
+               return FALSE;
+
+       return nouveau_screen_bo_get_handle(pscreen, res->bo, nvfx_subresource_pitch(pr, 0), whandle);
+}
+
 void
 nvfx_init_resource_functions(struct pipe_context *pipe)
 {
-       pipe->get_transfer = u_get_transfer_vtbl;
-       pipe->transfer_map = u_transfer_map_vtbl;
-       pipe->transfer_flush_region = u_transfer_flush_region_vtbl;
-       pipe->transfer_unmap = u_transfer_unmap_vtbl;
-       pipe->transfer_destroy = u_transfer_destroy_vtbl;
-       pipe->transfer_inline_write = u_transfer_inline_write_vtbl;
        pipe->is_resource_referenced = nvfx_resource_is_referenced;
 }
 
@@ -58,10 +66,10 @@ nvfx_screen_init_resource_functions(struct pipe_screen *pscreen)
 {
        pscreen->resource_create = nvfx_resource_create;
        pscreen->resource_from_handle = nvfx_resource_from_handle;
-       pscreen->resource_get_handle = u_resource_get_handle_vtbl;
-       pscreen->resource_destroy = u_resource_destroy_vtbl;
+       pscreen->resource_get_handle = nvfx_resource_get_handle;
+       pscreen->resource_destroy = nvfx_resource_destroy;
        pscreen->user_buffer_create = nvfx_user_buffer_create;
-   
+
        pscreen->get_tex_surface = nvfx_miptree_surface_new;
        pscreen->tex_surface_destroy = nvfx_miptree_surface_del;
 }