Пример #1
0
static struct pipe_resource *
tex_create(struct pipe_screen *screen,
           const struct pipe_resource *templ,
           const struct winsys_handle *handle)
{
   struct ilo_texture *tex;

   tex = CALLOC_STRUCT(ilo_texture);
   if (!tex)
      return NULL;

   tex->base = *templ;
   tex->base.screen = screen;
   pipe_reference_init(&tex->base.reference, 1);

   tex->imported = (handle != NULL);

   if (!tex_init_layout(tex)) {
      FREE(tex);
      return NULL;
   }

   if (!tex_alloc_bos(tex, handle)) {
      tex_destroy(tex);
      return NULL;
   }

   return &tex->base;
}
Пример #2
0
static void
ilo_resource_destroy(struct pipe_screen *screen,
                     struct pipe_resource *res)
{
   if (res->target == PIPE_BUFFER)
      buf_destroy(ilo_buffer(res));
   else
      tex_destroy(ilo_texture(res));
}
Пример #3
0
static void
tex_destroy(struct ilo_texture *tex)
{
   if (tex->hiz.bo)
      intel_bo_unreference(tex->hiz.bo);

   if (tex->separate_s8)
      tex_destroy(tex->separate_s8);

   intel_bo_unreference(tex->bo);
   tex_free_slices(tex);
   FREE(tex);
}
Пример #4
0
static struct pipe_resource *
tex_create(struct pipe_screen *screen,
           const struct pipe_resource *templ,
           const struct winsys_handle *handle)
{
   struct tex_layout layout;
   struct ilo_texture *tex;

   tex = CALLOC_STRUCT(ilo_texture);
   if (!tex)
      return NULL;

   tex->base = *templ;
   tex->base.screen = screen;
   pipe_reference_init(&tex->base.reference, 1);

   if (!tex_alloc_slices(tex)) {
      FREE(tex);
      return NULL;
   }

   tex->imported = (handle != NULL);

   if (tex->base.bind & (PIPE_BIND_DEPTH_STENCIL |
                         PIPE_BIND_RENDER_TARGET))
      tex->bo_flags |= INTEL_ALLOC_FOR_RENDER;

   tex_layout_init(&layout, screen, templ, tex->slices);

   switch (templ->target) {
   case PIPE_TEXTURE_1D:
   case PIPE_TEXTURE_2D:
   case PIPE_TEXTURE_CUBE:
   case PIPE_TEXTURE_RECT:
   case PIPE_TEXTURE_1D_ARRAY:
   case PIPE_TEXTURE_2D_ARRAY:
   case PIPE_TEXTURE_CUBE_ARRAY:
      tex_layout_2d(&layout);
      break;
   case PIPE_TEXTURE_3D:
      tex_layout_3d(&layout);
      break;
   default:
      assert(!"unknown resource target");
      break;
   }

   tex_layout_validate(&layout);

   /* make sure the bo can be mapped through GTT if tiled */
   if (layout.tiling != INTEL_TILING_NONE) {
      /*
       * Usually only the first 256MB of the GTT is mappable.
       *
       * See also how intel_context::max_gtt_map_object_size is calculated.
       */
      const size_t mappable_gtt_size = 256 * 1024 * 1024;
      const size_t size = tex_layout_estimate_size(&layout);

      /* be conservative */
      if (size > mappable_gtt_size / 4)
         tex_layout_force_linear(&layout);
   }

   tex_layout_apply(&layout, tex);

   if (!tex_create_bo(tex, handle)) {
      tex_free_slices(tex);
      FREE(tex);
      return NULL;
   }

   /* allocate separate stencil resource */
   if (layout.separate_stencil && !tex_create_separate_stencil(tex)) {
      tex_destroy(tex);
      return NULL;
   }

   if (layout.hiz && !tex_create_hiz(tex, &layout)) {
      /* Separate Stencil Buffer requires HiZ to be enabled */
      if (layout.dev->gen == ILO_GEN(6) && layout.separate_stencil) {
         tex_destroy(tex);
         return NULL;
      }
   }

   return &tex->base;
}