intel: Add hiz_region to intel_renderbuffer
A hiz surface must be supplied to the hardware when rendering to a depth buffer with hiz. There are three potential places to store that surface: 1. Allocate a larger intel_region for the depthbuffer, and let the region's tail be the hiz surface. 2. Allocate a separate intel_region for hiz, and store it as brw_context state. 3. Allocate a separate intel_region for hiz, and store it in intel_renderbuffer. We choose method 3. Method 1 has not been chosen due to future complications it might cause when requesting a DRI drawable's depth buffer attachment from X. Method 2 has not been chosen because storing the hiz region apart from the depth region makes lazy hiz/depth resolves difficult to implement. Reviewed-by: Eric Anholt <eric@anholt.net> Signed-off-by: Chad Versace <chad@chad-versace.us>
This commit is contained in:
@@ -79,6 +79,9 @@ intel_delete_renderbuffer(struct gl_renderbuffer *rb)
|
|||||||
if (intel && irb->region) {
|
if (intel && irb->region) {
|
||||||
intel_region_release(&irb->region);
|
intel_region_release(&irb->region);
|
||||||
}
|
}
|
||||||
|
if (intel && irb->hiz_region) {
|
||||||
|
intel_region_release(&irb->hiz_region);
|
||||||
|
}
|
||||||
|
|
||||||
free(irb);
|
free(irb);
|
||||||
}
|
}
|
||||||
@@ -148,6 +151,9 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
|
|||||||
if (irb->region) {
|
if (irb->region) {
|
||||||
intel_region_release(&irb->region);
|
intel_region_release(&irb->region);
|
||||||
}
|
}
|
||||||
|
if (irb->hiz_region) {
|
||||||
|
intel_region_release(&irb->hiz_region);
|
||||||
|
}
|
||||||
|
|
||||||
/* allocate new memory region/renderbuffer */
|
/* allocate new memory region/renderbuffer */
|
||||||
|
|
||||||
@@ -194,6 +200,19 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
|
|||||||
|
|
||||||
ASSERT(irb->region->buffer);
|
ASSERT(irb->region->buffer);
|
||||||
|
|
||||||
|
if (intel->vtbl.is_hiz_depth_format(intel, rb->Format)) {
|
||||||
|
irb->hiz_region = intel_region_alloc(intel->intelScreen,
|
||||||
|
I915_TILING_Y,
|
||||||
|
irb->region->cpp,
|
||||||
|
irb->region->width,
|
||||||
|
irb->region->height,
|
||||||
|
GL_TRUE);
|
||||||
|
if (!irb->hiz_region) {
|
||||||
|
intel_region_release(&irb->region);
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rb->Width = width;
|
rb->Width = width;
|
||||||
rb->Height = height;
|
rb->Height = height;
|
||||||
|
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
#ifndef INTEL_FBO_H
|
#ifndef INTEL_FBO_H
|
||||||
#define INTEL_FBO_H
|
#define INTEL_FBO_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include "main/formats.h"
|
#include "main/formats.h"
|
||||||
#include "intel_screen.h"
|
#include "intel_screen.h"
|
||||||
|
|
||||||
@@ -40,6 +41,9 @@ struct intel_renderbuffer
|
|||||||
{
|
{
|
||||||
struct gl_renderbuffer Base;
|
struct gl_renderbuffer Base;
|
||||||
struct intel_region *region;
|
struct intel_region *region;
|
||||||
|
|
||||||
|
/** Only used by depth renderbuffers for which HiZ is enabled. */
|
||||||
|
struct intel_region *hiz_region;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -80,6 +84,29 @@ intel_get_renderbuffer(struct gl_framebuffer *fb, int attIndex)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the framebuffer has a depth buffer attached, then return its HiZ region.
|
||||||
|
* The HiZ region may be null.
|
||||||
|
*/
|
||||||
|
static INLINE struct intel_region*
|
||||||
|
intel_framebuffer_get_hiz_region(struct gl_framebuffer *fb)
|
||||||
|
{
|
||||||
|
struct intel_renderbuffer *rb = NULL;
|
||||||
|
if (fb)
|
||||||
|
rb = intel_get_renderbuffer(fb, BUFFER_DEPTH);
|
||||||
|
|
||||||
|
if (rb)
|
||||||
|
return rb->hiz_region;
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INLINE bool
|
||||||
|
intel_framebuffer_has_hiz(struct gl_framebuffer *fb)
|
||||||
|
{
|
||||||
|
return intel_framebuffer_get_hiz_region(fb) != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
intel_renderbuffer_set_region(struct intel_context *intel,
|
intel_renderbuffer_set_region(struct intel_context *intel,
|
||||||
|
Reference in New Issue
Block a user