intel: Add resolve functions for miptrees
Add functions that - set a miptree slice as needing a resolve - resolve a single slice of a miptree - resolve all slices of a miptree Reviewed-by: Eric Anholt <eric@anholt.net> Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
This commit is contained in:
@@ -29,6 +29,7 @@
|
|||||||
#include "intel_context.h"
|
#include "intel_context.h"
|
||||||
#include "intel_mipmap_tree.h"
|
#include "intel_mipmap_tree.h"
|
||||||
#include "intel_regions.h"
|
#include "intel_regions.h"
|
||||||
|
#include "intel_resolve_map.h"
|
||||||
#include "intel_span.h"
|
#include "intel_span.h"
|
||||||
#include "intel_tex_layout.h"
|
#include "intel_tex_layout.h"
|
||||||
#include "intel_tex.h"
|
#include "intel_tex.h"
|
||||||
@@ -41,7 +42,6 @@
|
|||||||
|
|
||||||
#define FILE_DEBUG_FLAG DEBUG_MIPTREE
|
#define FILE_DEBUG_FLAG DEBUG_MIPTREE
|
||||||
|
|
||||||
|
|
||||||
static GLenum
|
static GLenum
|
||||||
target_to_target(GLenum target)
|
target_to_target(GLenum target)
|
||||||
{
|
{
|
||||||
@@ -263,6 +263,7 @@ intel_miptree_release(struct intel_mipmap_tree **mt)
|
|||||||
intel_region_release(&((*mt)->region));
|
intel_region_release(&((*mt)->region));
|
||||||
intel_miptree_release(&(*mt)->stencil_mt);
|
intel_miptree_release(&(*mt)->stencil_mt);
|
||||||
intel_miptree_release(&(*mt)->hiz_mt);
|
intel_miptree_release(&(*mt)->hiz_mt);
|
||||||
|
intel_resolve_map_clear(&(*mt)->hiz_map);
|
||||||
|
|
||||||
for (i = 0; i < MAX_TEXTURE_LEVELS; i++) {
|
for (i = 0; i < MAX_TEXTURE_LEVELS; i++) {
|
||||||
free((*mt)->level[i].slice);
|
free((*mt)->level[i].slice);
|
||||||
@@ -595,3 +596,118 @@ intel_miptree_alloc_hiz(struct intel_context *intel,
|
|||||||
true);
|
true);
|
||||||
return mt->hiz_mt != NULL;
|
return mt->hiz_mt != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
intel_miptree_slice_set_needs_hiz_resolve(struct intel_mipmap_tree *mt,
|
||||||
|
uint32_t level,
|
||||||
|
uint32_t layer)
|
||||||
|
{
|
||||||
|
intel_miptree_check_level_layer(mt, level, layer);
|
||||||
|
|
||||||
|
if (!mt->hiz_mt)
|
||||||
|
return;
|
||||||
|
|
||||||
|
intel_resolve_map_set(&mt->hiz_map,
|
||||||
|
level, layer, INTEL_NEED_HIZ_RESOLVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
intel_miptree_slice_set_needs_depth_resolve(struct intel_mipmap_tree *mt,
|
||||||
|
uint32_t level,
|
||||||
|
uint32_t layer)
|
||||||
|
{
|
||||||
|
intel_miptree_check_level_layer(mt, level, layer);
|
||||||
|
|
||||||
|
if (!mt->hiz_mt)
|
||||||
|
return;
|
||||||
|
|
||||||
|
intel_resolve_map_set(&mt->hiz_map,
|
||||||
|
level, layer, INTEL_NEED_DEPTH_RESOLVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef void (*resolve_func_t)(struct intel_context *intel,
|
||||||
|
struct intel_mipmap_tree *mt,
|
||||||
|
uint32_t level,
|
||||||
|
uint32_t layer);
|
||||||
|
|
||||||
|
static bool
|
||||||
|
intel_miptree_slice_resolve(struct intel_context *intel,
|
||||||
|
struct intel_mipmap_tree *mt,
|
||||||
|
uint32_t level,
|
||||||
|
uint32_t layer,
|
||||||
|
enum intel_need_resolve need,
|
||||||
|
resolve_func_t func)
|
||||||
|
{
|
||||||
|
intel_miptree_check_level_layer(mt, level, layer);
|
||||||
|
|
||||||
|
struct intel_resolve_map *item =
|
||||||
|
intel_resolve_map_get(&mt->hiz_map, level, layer);
|
||||||
|
|
||||||
|
if (!item || item->need != need)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
func(intel, mt, level, layer);
|
||||||
|
intel_resolve_map_remove(item);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
intel_miptree_slice_resolve_hiz(struct intel_context *intel,
|
||||||
|
struct intel_mipmap_tree *mt,
|
||||||
|
uint32_t level,
|
||||||
|
uint32_t layer)
|
||||||
|
{
|
||||||
|
return intel_miptree_slice_resolve(intel, mt, level, layer,
|
||||||
|
INTEL_NEED_HIZ_RESOLVE,
|
||||||
|
intel->vtbl.resolve_hiz_slice);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
intel_miptree_slice_resolve_depth(struct intel_context *intel,
|
||||||
|
struct intel_mipmap_tree *mt,
|
||||||
|
uint32_t level,
|
||||||
|
uint32_t layer)
|
||||||
|
{
|
||||||
|
return intel_miptree_slice_resolve(intel, mt, level, layer,
|
||||||
|
INTEL_NEED_DEPTH_RESOLVE,
|
||||||
|
intel->vtbl.resolve_depth_slice);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
intel_miptree_all_slices_resolve(struct intel_context *intel,
|
||||||
|
struct intel_mipmap_tree *mt,
|
||||||
|
enum intel_need_resolve need,
|
||||||
|
resolve_func_t func)
|
||||||
|
{
|
||||||
|
bool did_resolve = false;
|
||||||
|
struct intel_resolve_map *i;
|
||||||
|
|
||||||
|
for (i = mt->hiz_map.next; i; i = i->next) {
|
||||||
|
if (i->need != need)
|
||||||
|
continue;
|
||||||
|
func(intel, mt, i->level, i->layer);
|
||||||
|
intel_resolve_map_remove(i);
|
||||||
|
did_resolve = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return did_resolve;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
intel_miptree_all_slices_resolve_hiz(struct intel_context *intel,
|
||||||
|
struct intel_mipmap_tree *mt)
|
||||||
|
{
|
||||||
|
return intel_miptree_all_slices_resolve(intel, mt,
|
||||||
|
INTEL_NEED_HIZ_RESOLVE,
|
||||||
|
intel->vtbl.resolve_hiz_slice);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
intel_miptree_all_slices_resolve_depth(struct intel_context *intel,
|
||||||
|
struct intel_mipmap_tree *mt)
|
||||||
|
{
|
||||||
|
return intel_miptree_all_slices_resolve(intel, mt,
|
||||||
|
INTEL_NEED_DEPTH_RESOLVE,
|
||||||
|
intel->vtbl.resolve_depth_slice);
|
||||||
|
}
|
||||||
|
@@ -284,15 +284,72 @@ intel_miptree_s8z24_gather(struct intel_context *intel,
|
|||||||
uint32_t level,
|
uint32_t level,
|
||||||
uint32_t layer);
|
uint32_t layer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name Miptree HiZ functions
|
||||||
|
* \{
|
||||||
|
*
|
||||||
|
* It is safe to call the "slice_set_need_resolve" and "slice_resolve"
|
||||||
|
* functions on a miptree without HiZ. In that case, each function is a no-op.
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Allocate the miptree's embedded HiZ miptree.
|
* \brief Allocate the miptree's embedded HiZ miptree.
|
||||||
* \see intel_mipmap_tree:hiz_mt
|
* \see intel_mipmap_tree:hiz_mt
|
||||||
* \return false if allocation failed
|
* \return false if allocation failed
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool
|
bool
|
||||||
intel_miptree_alloc_hiz(struct intel_context *intel,
|
intel_miptree_alloc_hiz(struct intel_context *intel,
|
||||||
struct intel_mipmap_tree *mt);
|
struct intel_mipmap_tree *mt);
|
||||||
|
|
||||||
|
void
|
||||||
|
intel_miptree_slice_set_needs_hiz_resolve(struct intel_mipmap_tree *mt,
|
||||||
|
uint32_t level,
|
||||||
|
uint32_t depth);
|
||||||
|
void
|
||||||
|
intel_miptree_slice_set_needs_depth_resolve(struct intel_mipmap_tree *mt,
|
||||||
|
uint32_t level,
|
||||||
|
uint32_t depth);
|
||||||
|
void
|
||||||
|
intel_miptree_all_slices_set_need_hiz_resolve(struct intel_mipmap_tree *mt);
|
||||||
|
|
||||||
|
void
|
||||||
|
intel_miptree_all_slices_set_need_depth_resolve(struct intel_mipmap_tree *mt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \return false if no resolve was needed
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
intel_miptree_slice_resolve_hiz(struct intel_context *intel,
|
||||||
|
struct intel_mipmap_tree *mt,
|
||||||
|
unsigned int level,
|
||||||
|
unsigned int depth);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \return false if no resolve was needed
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
intel_miptree_slice_resolve_depth(struct intel_context *intel,
|
||||||
|
struct intel_mipmap_tree *mt,
|
||||||
|
unsigned int level,
|
||||||
|
unsigned int depth);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \return false if no resolve was needed
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
intel_miptree_all_slices_resolve_hiz(struct intel_context *intel,
|
||||||
|
struct intel_mipmap_tree *mt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \return false if no resolve was needed
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
intel_miptree_all_slices_resolve_depth(struct intel_context *intel,
|
||||||
|
struct intel_mipmap_tree *mt);
|
||||||
|
|
||||||
|
/**\}*/
|
||||||
|
|
||||||
/* i915_mipmap_tree.c:
|
/* i915_mipmap_tree.c:
|
||||||
*/
|
*/
|
||||||
void i915_miptree_layout(struct intel_mipmap_tree *mt);
|
void i915_miptree_layout(struct intel_mipmap_tree *mt);
|
||||||
|
Reference in New Issue
Block a user