diff options
Diffstat (limited to 'src/gallium/drivers/nvfx/nvfx_miptree.c')
-rw-r--r-- | src/gallium/drivers/nvfx/nvfx_miptree.c | 214 |
1 files changed, 0 insertions, 214 deletions
diff --git a/src/gallium/drivers/nvfx/nvfx_miptree.c b/src/gallium/drivers/nvfx/nvfx_miptree.c deleted file mode 100644 index dd9ad350089..00000000000 --- a/src/gallium/drivers/nvfx/nvfx_miptree.c +++ /dev/null @@ -1,214 +0,0 @@ -#include "pipe/p_state.h" -#include "pipe/p_defines.h" -#include "util/u_inlines.h" -#include "util/u_format.h" -#include "util/u_memory.h" -#include "util/u_math.h" -#include "util/u_staging.h" -#include "state_tracker/drm_driver.h" -#include "nouveau/nouveau_winsys.h" -#include "nouveau/nouveau_screen.h" -#include "nvfx_screen.h" -#include "nvfx_resource.h" - -static void -nvfx_miptree_choose_format(struct nvfx_miptree *mt) -{ - struct pipe_resource *pt = &mt->base.base; - unsigned uniform_pitch = 0; - static int no_swizzle = -1; - if(no_swizzle < 0) - no_swizzle = debug_get_bool_option("NV40_NO_SWIZZLE", FALSE); /* this will break things on nv30 */ - - if (!util_is_power_of_two(pt->width0) || - !util_is_power_of_two(pt->height0) || - !util_is_power_of_two(pt->depth0) || - (!nvfx_screen(pt->screen)->is_nv4x && pt->target == PIPE_TEXTURE_RECT) - ) - uniform_pitch = 1; - - if ( - (pt->bind & (PIPE_BIND_SCANOUT | PIPE_BIND_DISPLAY_TARGET)) - || (pt->usage & PIPE_USAGE_DYNAMIC) || (pt->usage & PIPE_USAGE_STAGING) - || util_format_is_compressed(pt->format) - || no_swizzle - ) - mt->base.base.flags |= NOUVEAU_RESOURCE_FLAG_LINEAR; - - /* non compressed formats with uniform pitch must be linear, and vice versa */ - if(!util_format_is_s3tc(pt->format) - && (uniform_pitch || mt->base.base.flags & NOUVEAU_RESOURCE_FLAG_LINEAR)) - { - mt->base.base.flags |= NOUVEAU_RESOURCE_FLAG_LINEAR; - uniform_pitch = 1; - } - - if(uniform_pitch) - { - mt->linear_pitch = util_format_get_stride(pt->format, pt->width0); - - // TODO: this is only a constraint for rendering and not sampling, apparently - // we may also want this unconditionally - if(pt->bind & (PIPE_BIND_SAMPLER_VIEW | - PIPE_BIND_DEPTH_STENCIL | - PIPE_BIND_RENDER_TARGET | - PIPE_BIND_DISPLAY_TARGET | - PIPE_BIND_SCANOUT)) - mt->linear_pitch = align(mt->linear_pitch, 64); - } - else - mt->linear_pitch = 0; -} - -static unsigned -nvfx_miptree_layout(struct nvfx_miptree *mt) -{ - struct pipe_resource* pt = &mt->base.base; - uint offset = 0; - - if(!nvfx_screen(pt->screen)->is_nv4x) - { - assert(pt->target == PIPE_TEXTURE_RECT - || (util_is_power_of_two(pt->width0) && util_is_power_of_two(pt->height0))); - } - - for (unsigned l = 0; l <= pt->last_level; l++) - { - unsigned size; - mt->level_offset[l] = offset; - - if(mt->linear_pitch) - size = mt->linear_pitch; - else - size = util_format_get_stride(pt->format, u_minify(pt->width0, l)); - size = util_format_get_2d_size(pt->format, size, u_minify(pt->height0, l)); - - if(pt->target == PIPE_TEXTURE_3D) - size *= u_minify(pt->depth0, l); - - offset += size; - } - - offset = align(offset, 128); - mt->face_size = offset; - if(mt->base.base.target == PIPE_TEXTURE_CUBE) - offset += 5 * mt->face_size; - return offset; -} - -static void -nvfx_miptree_surface_final_destroy(struct pipe_surface* ps) -{ - pipe_resource_reference(&ps->texture, 0); - FREE(ps); -} - -void -nvfx_miptree_destroy(struct pipe_screen *screen, struct pipe_resource *pt) -{ - struct nvfx_miptree *mt = (struct nvfx_miptree *)pt; - util_surfaces_destroy(&mt->surfaces, pt, nvfx_miptree_surface_final_destroy); - nouveau_screen_bo_release(screen, mt->base.bo); - FREE(mt); -} - -static struct nvfx_miptree* -nvfx_miptree_create_skeleton(struct pipe_screen *pscreen, const struct pipe_resource *pt) -{ - struct nvfx_miptree *mt; - - if(pt->width0 > 4096 || pt->height0 > 4096) - return NULL; - - mt = CALLOC_STRUCT(nvfx_miptree); - if (!mt) - return NULL; - - mt->base.base = *pt; - - pipe_reference_init(&mt->base.base.reference, 1); - mt->base.base.screen = pscreen; - - // set this to the actual capabilities, we use it to decide whether to use the 3D engine for copies - // TODO: is this the correct way to use Gallium? - mt->base.base.bind = pt->bind | PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_DEPTH_STENCIL; - - // on our current driver (and the driver too), format support does not depend on geometry, so don't bother computing it - // TODO: may want to revisit this - if(!pscreen->is_format_supported(pscreen, pt->format, pt->target, 0, PIPE_BIND_RENDER_TARGET)) - mt->base.base.bind &=~ PIPE_BIND_RENDER_TARGET; - if(!pscreen->is_format_supported(pscreen, pt->format, pt->target, 0, PIPE_BIND_SAMPLER_VIEW)) - mt->base.base.bind &=~ PIPE_BIND_SAMPLER_VIEW; - if(!pscreen->is_format_supported(pscreen, pt->format, pt->target, 0, PIPE_BIND_DEPTH_STENCIL)) - mt->base.base.bind &=~ PIPE_BIND_DEPTH_STENCIL; - - return mt; -} - - -struct pipe_resource * -nvfx_miptree_create(struct pipe_screen *pscreen, const struct pipe_resource *pt) -{ - struct nvfx_miptree* mt = nvfx_miptree_create_skeleton(pscreen, pt); - unsigned size; - nvfx_miptree_choose_format(mt); - - size = nvfx_miptree_layout(mt); - - mt->base.bo = nouveau_screen_bo_new(pscreen, 256, pt->usage, pt->bind, size); - - if (!mt->base.bo) { - FREE(mt); - return NULL; - } - return &mt->base.base; -} - -// TODO: redo this, just calling miptree_layout -struct pipe_resource * -nvfx_miptree_from_handle(struct pipe_screen *pscreen, const struct pipe_resource *template, struct winsys_handle *whandle) -{ - struct nvfx_miptree* mt = nvfx_miptree_create_skeleton(pscreen, template); - unsigned stride; - if(whandle->stride) { - mt->linear_pitch = whandle->stride; - mt->base.base.flags |= NOUVEAU_RESOURCE_FLAG_LINEAR; - } else - nvfx_miptree_choose_format(mt); - - nvfx_miptree_layout(mt); - - mt->base.bo = nouveau_screen_bo_from_handle(pscreen, whandle, &stride); - if (mt->base.bo == NULL) { - FREE(mt); - return NULL; - } - return &mt->base.base; -} - -struct pipe_surface * -nvfx_miptree_surface_new(struct pipe_context *pipe, struct pipe_resource *pt, - const struct pipe_surface *surf_tmpl) -{ - struct nvfx_miptree *mt = (struct nvfx_miptree *)pt; - unsigned level = surf_tmpl->u.tex.level; - struct nvfx_surface *ns = NULL; - - assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer); - if(util_surfaces_get(&mt->surfaces, sizeof(struct nvfx_surface), pipe, - pt, level, surf_tmpl->u.tex.first_layer, - surf_tmpl->usage, (struct pipe_surface **)&ns)) { - ns->pitch = nvfx_subresource_pitch(pt, level); - ns->offset = nvfx_subresource_offset(pt, surf_tmpl->u.tex.first_layer, level, surf_tmpl->u.tex.first_layer); - } - - return &ns->base; -} - -void -nvfx_miptree_surface_del(struct pipe_context *pipe, struct pipe_surface *ps) -{ - util_surfaces_detach(&((struct nvfx_miptree*)ps->texture)->surfaces, ps); - pipe_resource_reference(&ps->texture, 0); - FREE(ps); -} |