Merge branch 'mesa_7_7_branch'
[mesa.git] / src / mesa / drivers / dri / intel / intel_fbo.h
index 9d15582d78c8d1da410a3f83ce8bf4b3b3a2e6b0..586dbbbb25a198863ea957cf52d0758f77907df9 100644 (file)
 #ifndef INTEL_FBO_H
 #define INTEL_FBO_H
 
+#include "main/formats.h"
 #include "intel_screen.h"
 
 struct intel_context;
 
 /**
- * Intel framebuffer, derived from gl_framebuffer.
+ * Intel renderbuffer, derived from gl_renderbuffer.
  */
-struct intel_framebuffer
+struct intel_renderbuffer
 {
-   struct gl_framebuffer Base;
-
-   struct intel_renderbuffer *color_rb[3];
-
-   /* Drawable page flipping state */
-   GLboolean pf_active;
-   GLuint pf_seq;
-   GLint pf_planes;
-   GLint pf_current_page;
-   GLint pf_num_pages;
-
-   /* VBI
-    */
-   GLuint vbl_waited;
-
-   int64_t swap_ust;
-   int64_t swap_missed_ust;
+   struct gl_renderbuffer Base;
+   struct intel_region *region;
 
-   GLuint swap_count;
-   GLuint swap_missed_count;
+   uint8_t *span_cache;
+   unsigned long span_cache_offset;
 };
 
 
 /**
- * Intel renderbuffer, derived from gl_renderbuffer.
- * Note: The PairedDepth and PairedStencil fields use renderbuffer IDs,
- * not pointers because in some circumstances a deleted renderbuffer could
- * result in a dangling pointer here.
+ * gl_renderbuffer is a base class which we subclass.  The Class field
+ * is used for simple run-time type checking.
  */
-struct intel_renderbuffer
-{
-   struct gl_renderbuffer Base;
-   struct intel_region *region;
-   GLuint pfPitch;              /* possibly paged flipped pitch */
-   GLboolean RenderToTexture;   /* RTT? */
+#define INTEL_RB_CLASS 0x12345678
 
-   GLuint PairedDepth;   /**< only used if this is a depth renderbuffer */
-   GLuint PairedStencil; /**< only used if this is a stencil renderbuffer */
 
-   GLuint pf_pending;  /**< sequence number of pending flip */
+/**
+ * Return a gl_renderbuffer ptr casted to intel_renderbuffer.
+ * NULL will be returned if the rb isn't really an intel_renderbuffer.
+ * This is determined by checking the ClassID.
+ */
+static INLINE struct intel_renderbuffer *
+intel_renderbuffer(struct gl_renderbuffer *rb)
+{
+   struct intel_renderbuffer *irb = (struct intel_renderbuffer *) rb;
+   if (irb && irb->Base.ClassID == INTEL_RB_CLASS) {
+      /*_mesa_warning(NULL, "Returning non-intel Rb\n");*/
+      return irb;
+   }
+   else
+      return NULL;
+}
 
-   GLuint vbl_pending;   /**< vblank sequence number of pending flip */
 
-   uint8_t *span_cache;
-   unsigned long span_cache_offset;
-};
+/**
+ * Return a framebuffer's renderbuffer, named by a BUFFER_x index.
+ */
+static INLINE struct intel_renderbuffer *
+intel_get_renderbuffer(struct gl_framebuffer *fb, int attIndex)
+{
+   if (attIndex >= 0)
+      return intel_renderbuffer(fb->Attachment[attIndex].Renderbuffer);
+   else
+      return NULL;
+}
 
-extern struct intel_renderbuffer *intel_renderbuffer(struct gl_renderbuffer
-                                                     *rb);
 
 extern void
 intel_renderbuffer_set_region(struct intel_renderbuffer *irb,
                              struct intel_region *region);
 
-extern struct intel_renderbuffer *
-intel_create_renderbuffer(GLenum intFormat);
-
-extern void intel_fbo_init(struct intel_context *intel);
 
+extern struct intel_renderbuffer *
+intel_create_renderbuffer(gl_format format);
 
-/* XXX make inline or macro */
-extern struct intel_renderbuffer *intel_get_renderbuffer(struct gl_framebuffer
-                                                         *fb,
-                                                         int attIndex);
 
-extern void intel_flip_renderbuffers(struct intel_framebuffer *intel_fb);
+extern void
+intel_fbo_init(struct intel_context *intel);
 
 
-/* XXX make inline or macro */
-extern struct intel_region *intel_get_rb_region(struct gl_framebuffer *fb,
-                                                GLuint attIndex);
+extern void
+intel_flip_renderbuffers(struct gl_framebuffer *fb);
 
 
+static INLINE struct intel_region *
+intel_get_rb_region(struct gl_framebuffer *fb, GLuint attIndex)
+{
+   struct intel_renderbuffer *irb = intel_get_renderbuffer(fb, attIndex);
+   if (irb)
+      return irb->region;
+   else
+      return NULL;
+}
 
 
 #endif /* INTEL_FBO_H */