st/mesa: remove st_texture_object::pipe field
[mesa.git] / src / mesa / state_tracker / st_manager.c
index 9475704121c8595c28ebb06b4594cd6725651f02..5cf17fe530a02fbb366a453c7e9c12f4a7614f90 100644 (file)
  * The above copyright notice and this permission notice 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,
+ * 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 NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL 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.
+ * THE AUTHORS OR COPYRIGHT HOLDERS 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.
  *
  * Authors:
  *    Chia-I Wu <olv@lunarg.com>
@@ -40,7 +41,6 @@
 #include "main/teximage.h"
 #include "main/texstate.h"
 #include "main/texfetch.h"
-#include "main/fbobject.h"
 #include "main/framebuffer.h"
 #include "main/renderbuffer.h"
 #include "st_texture.h"
@@ -59,6 +59,19 @@ void st_destroy_context(struct st_context *st);
 void st_flush(struct st_context *st, uint pipeFlushFlags,
               struct pipe_fence_handle **fence);
 
+/**
+ * Cast wrapper to convert a GLframebuffer to an st_framebuffer.
+ * Return NULL if the GLframebuffer is a user-created framebuffer.
+ * We'll only return non-null for window system framebuffers.
+ * Note that this function may fail.
+ */
+static INLINE struct st_framebuffer *
+st_ws_framebuffer(GLframebuffer *fb)
+{
+   /* FBO cannot be casted.  See st_new_framebuffer */
+   return (struct st_framebuffer *) ((fb && !fb->Name) ? fb : NULL);
+}
+
 /**
  * Map an attachment to a buffer index.
  */
@@ -131,13 +144,13 @@ buffer_index_to_attachment(gl_buffer_index index)
 }
 
 /**
- * Validate a framebuffer and update the states of the context.
+ * Validate a framebuffer to make sure up-to-date pipe_textures are used.
  */
 static void
 st_framebuffer_validate(struct st_framebuffer *stfb, struct st_context *st)
 {
    struct pipe_screen *screen = st->pipe->screen;
-   struct pipe_texture *textures[ST_ATTACHMENT_COUNT];
+   struct pipe_resource *textures[ST_ATTACHMENT_COUNT];
    uint width, height;
    unsigned i;
    boolean changed = FALSE;
@@ -162,22 +175,22 @@ st_framebuffer_validate(struct st_framebuffer *stfb, struct st_context *st)
 
       idx = attachment_to_buffer_index(stfb->statts[i]);
       if (idx >= BUFFER_COUNT) {
-         pipe_texture_reference(&textures[i], NULL);
+         pipe_resource_reference(&textures[i], NULL);
          continue;
       }
 
       strb = st_renderbuffer(stfb->Base.Attachment[idx].Renderbuffer);
       assert(strb);
       if (strb->texture == textures[i]) {
-         pipe_texture_reference(&textures[i], NULL);
+         pipe_resource_reference(&textures[i], NULL);
          continue;
       }
 
       ps = screen->get_tex_surface(screen, textures[i], 0, 0, 0,
-            PIPE_BUFFER_USAGE_GPU_READ | PIPE_BUFFER_USAGE_GPU_WRITE);
+                                  PIPE_BIND_RENDER_TARGET);
       if (ps) {
          pipe_surface_reference(&strb->surface, ps);
-         pipe_texture_reference(&strb->texture, ps->texture);
+         pipe_resource_reference(&strb->texture, ps->texture);
          /* ownership transfered */
          pipe_surface_reference(&ps, NULL);
 
@@ -190,7 +203,7 @@ st_framebuffer_validate(struct st_framebuffer *stfb, struct st_context *st)
          height = strb->Base.Height;
       }
 
-      pipe_texture_reference(&textures[i], NULL);
+      pipe_resource_reference(&textures[i], NULL);
    }
 
    if (changed) {
@@ -205,7 +218,7 @@ st_framebuffer_validate(struct st_framebuffer *stfb, struct st_context *st)
 }
 
 /**
- * Update the attachments to validate.
+ * Update the attachments to validate by looping the existing renderbuffers.
  */
 static void
 st_framebuffer_update_attachments(struct st_framebuffer *stfb)
@@ -321,15 +334,15 @@ st_visual_to_context_mode(const struct st_visual *visual,
    }
 
    if (visual->depth_stencil_format != PIPE_FORMAT_NONE) {
-      mode->haveDepthBuffer = GL_TRUE;
-      mode->haveStencilBuffer = GL_TRUE;
-
       mode->depthBits =
          util_format_get_component_bits(visual->depth_stencil_format,
                UTIL_FORMAT_COLORSPACE_ZS, 0);
       mode->stencilBits =
          util_format_get_component_bits(visual->depth_stencil_format,
                UTIL_FORMAT_COLORSPACE_ZS, 1);
+
+      mode->haveDepthBuffer = mode->depthBits > 0;
+      mode->haveStencilBuffer = mode->stencilBits > 0;
    }
 
    if (visual->accum_format != PIPE_FORMAT_NONE) {
@@ -464,9 +477,9 @@ st_context_notify_invalid_framebuffer(struct st_context_iface *stctxi,
    struct st_framebuffer *stfb;
 
    /* either draw or read winsys fb */
-   stfb = (struct st_framebuffer *) st->ctx->WinSysDrawBuffer;
+   stfb = st_ws_framebuffer(st->ctx->WinSysDrawBuffer);
    if (!stfb || stfb->iface != stfbi)
-      stfb = (struct st_framebuffer *) st->ctx->WinSysReadBuffer;
+      stfb = st_ws_framebuffer(st->ctx->WinSysReadBuffer);
    assert(stfb && stfb->iface == stfbi);
 
    p_atomic_set(&stfb->revalidate, TRUE);
@@ -485,7 +498,7 @@ st_context_flush(struct st_context_iface *stctxi, unsigned flags,
 static boolean
 st_context_teximage(struct st_context_iface *stctxi, enum st_texture_type target,
                     int level, enum pipe_format internal_format,
-                    struct pipe_texture *tex, boolean mipmap)
+                    struct pipe_resource *tex, boolean mipmap)
 {
    struct st_context *st = (struct st_context *) stctxi;
    GLcontext *ctx = st->ctx;
@@ -543,7 +556,7 @@ st_context_teximage(struct st_context_iface *stctxi, enum st_texture_type target
       _mesa_clear_texture_image(ctx, texImage);
    }
 
-   pipe_texture_reference(&stImage->pt, tex);
+   pipe_resource_reference(&stImage->pt, tex);
 
    _mesa_dirty_texobj(ctx, texObj, GL_TRUE);
    _mesa_unlock_texture(ctx, texObj);
@@ -606,7 +619,7 @@ st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
 
    if (st) {
       /* reuse/create the draw fb */
-      stfb = (struct st_framebuffer * ) st->ctx->DrawBuffer;
+      stfb = st_ws_framebuffer(st->ctx->WinSysDrawBuffer);
       if (stfb && stfb->iface == stdrawi) {
          stdraw = NULL;
          st_framebuffer_reference(&stdraw, stfb);
@@ -616,7 +629,7 @@ st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
       }
 
       /* reuse/create the read fb */
-      stfb = (struct st_framebuffer * ) st->ctx->ReadBuffer;
+      stfb = st_ws_framebuffer(st->ctx->WinSysReadBuffer);
       if (!stfb || stfb->iface != streadi)
          stfb = stdraw;
       if (stfb && stfb->iface == streadi) {
@@ -688,7 +701,7 @@ st_api_destroy(struct st_api *stapi)
 void
 st_manager_flush_frontbuffer(struct st_context *st)
 {
-   struct st_framebuffer *stfb = (struct st_framebuffer *) st->ctx->DrawBuffer;
+   struct st_framebuffer *stfb = st_ws_framebuffer(st->ctx->DrawBuffer);
    struct st_renderbuffer *strb = NULL;
 
    if (stfb)
@@ -696,35 +709,45 @@ st_manager_flush_frontbuffer(struct st_context *st)
    if (!strb)
       return;
 
-   /* st_public.h or FBO */
-   if (!stfb->iface) {
-      struct pipe_surface *front_surf = strb->surface;
-      st->pipe->screen->flush_frontbuffer(st->pipe->screen,
-            front_surf, st->winsys_drawable_handle);
-      return;
-   }
-
    stfb->iface->flush_front(stfb->iface, ST_ATTACHMENT_FRONT_LEFT);
 }
 
 /**
- * Re-validate the framebuffer.
+ * Return the surface of an EGLImage.
  */
-void
-st_manager_validate_framebuffers(struct st_context *st)
+struct pipe_surface *
+st_manager_get_egl_image_surface(struct st_context *st,
+                                 void *eglimg, unsigned usage)
 {
-   struct st_framebuffer *stdraw, *stread;
+   struct st_manager *smapi =
+      (struct st_manager *) st->iface.st_context_private;
+   struct st_egl_image stimg;
+   struct pipe_surface *ps;
 
-   stdraw = (struct st_framebuffer *) st->ctx->DrawBuffer;
-   stread = (struct st_framebuffer *) st->ctx->ReadBuffer;
+   if (!smapi || !smapi->get_egl_image)
+      return NULL;
 
-   /* st_public.h or FBO */
-   if ((stdraw && !stdraw->iface) || (stread && !stread->iface)) {
-      struct pipe_screen *screen = st->pipe->screen;
-      if (screen->update_buffer)
-         screen->update_buffer(screen, st->pipe->priv);
-      return;
-   }
+   memset(&stimg, 0, sizeof(stimg));
+   stimg.stctxi = &st->iface;
+   stimg.egl_image = eglimg;
+   if (!smapi->get_egl_image(smapi, &stimg))
+      return NULL;
+
+   ps = smapi->screen->get_tex_surface(smapi->screen,
+         stimg.texture, stimg.face, stimg.level, stimg.zslice, usage);
+   pipe_resource_reference(&stimg.texture, NULL);
+
+   return ps;
+}
+
+/**
+ * Re-validate the framebuffers.
+ */
+void
+st_manager_validate_framebuffers(struct st_context *st)
+{
+   struct st_framebuffer *stdraw = st_ws_framebuffer(st->ctx->DrawBuffer);
+   struct st_framebuffer *stread = st_ws_framebuffer(st->ctx->ReadBuffer);
 
    if (stdraw)
       st_framebuffer_validate(stdraw, st);
@@ -733,21 +756,21 @@ st_manager_validate_framebuffers(struct st_context *st)
 }
 
 /**
- * Add a color buffer on demand.
+ * Add a color renderbuffer on demand.
  */
 boolean
 st_manager_add_color_renderbuffer(struct st_context *st, GLframebuffer *fb,
                                   gl_buffer_index idx)
 {
-   struct st_framebuffer *stfb = (struct st_framebuffer *) fb;
+   struct st_framebuffer *stfb = st_ws_framebuffer(fb);
+
+   /* FBO */
+   if (!stfb)
+      return FALSE;
 
    if (stfb->Base.Attachment[idx].Renderbuffer)
       return TRUE;
 
-   /* st_public.h or FBO */
-   if (!stfb->iface)
-      return FALSE;
-
    switch (idx) {
    case BUFFER_FRONT_LEFT:
    case BUFFER_BACK_LEFT:
@@ -768,6 +791,9 @@ st_manager_add_color_renderbuffer(struct st_context *st, GLframebuffer *fb,
    return TRUE;
 }
 
+/**
+ * Create an st_api to manage the state tracker.
+ */
 struct st_api *
 st_manager_create_api(void)
 {