struct pipe_resource *si_texture_create(struct pipe_screen *screen, const struct pipe_resource *templ) { struct r600_screen *rscreen = (struct r600_screen*)screen; struct radeon_surface surface; unsigned array_mode = V_009910_ARRAY_LINEAR_ALIGNED; int r; #if 0 if (!(templ->flags & R600_RESOURCE_FLAG_TRANSFER) && !(templ->bind & PIPE_BIND_SCANOUT)) { if (permit_hardware_blit(screen, templ)) { array_mode = V_009910_ARRAY_2D_TILED_THIN1; } } #endif r = r600_init_surface(&surface, templ, array_mode); if (r) { return NULL; } r = rscreen->ws->surface_best(rscreen->ws, &surface); if (r) { return NULL; } return (struct pipe_resource *)r600_texture_create_object(screen, templ, array_mode, 0, 0, NULL, TRUE, &surface); }
struct pipe_resource *si_texture_create(struct pipe_screen *screen, const struct pipe_resource *templ) { struct r600_screen *rscreen = (struct r600_screen*)screen; struct radeon_surface surface; unsigned array_mode = V_009910_ARRAY_LINEAR_ALIGNED; int r; if (!(templ->flags & R600_RESOURCE_FLAG_TRANSFER) && !(templ->bind & PIPE_BIND_SCANOUT)) { if (util_format_is_compressed(templ->format)) { array_mode = V_009910_ARRAY_1D_TILED_THIN1; } else { if (rscreen->chip_class >= CIK) array_mode = V_009910_ARRAY_1D_TILED_THIN1; /* XXX fix me */ else array_mode = V_009910_ARRAY_2D_TILED_THIN1; } } r = r600_init_surface(rscreen, &surface, templ, array_mode, templ->flags & R600_RESOURCE_FLAG_FLUSHED_DEPTH); if (r) { return NULL; } r = rscreen->ws->surface_best(rscreen->ws, &surface); if (r) { return NULL; } return (struct pipe_resource *)r600_texture_create_object(screen, templ, array_mode, 0, 0, NULL, TRUE, &surface); }
static struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen, const struct pipe_resource *templ, struct winsys_handle *whandle) { struct r600_common_screen *rscreen = (struct r600_common_screen*)screen; struct pb_buffer *buf = NULL; unsigned stride = 0; unsigned array_mode; enum radeon_bo_layout micro, macro; struct radeon_surf surface; bool scanout; int r; /* Support only 2D textures without mipmaps */ if ((templ->target != PIPE_TEXTURE_2D && templ->target != PIPE_TEXTURE_RECT) || templ->depth0 != 1 || templ->last_level != 0) return NULL; buf = rscreen->ws->buffer_from_handle(rscreen->ws, whandle, &stride); if (!buf) return NULL; rscreen->ws->buffer_get_tiling(buf, µ, ¯o, &surface.bankw, &surface.bankh, &surface.tile_split, &surface.stencil_tile_split, &surface.mtilea, &scanout); if (macro == RADEON_LAYOUT_TILED) array_mode = RADEON_SURF_MODE_2D; else if (micro == RADEON_LAYOUT_TILED) array_mode = RADEON_SURF_MODE_1D; else array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED; r = r600_init_surface(rscreen, &surface, templ, array_mode, false); if (r) { return NULL; } if (scanout) surface.flags |= RADEON_SURF_SCANOUT; return (struct pipe_resource *)r600_texture_create_object(screen, templ, stride, buf, &surface); }
struct pipe_resource *r600_texture_create(struct pipe_screen *screen, const struct pipe_resource *templ) { struct r600_common_screen *rscreen = (struct r600_common_screen*)screen; struct radeon_surf surface = {0}; int r; r = r600_init_surface(rscreen, &surface, templ, r600_choose_tiling(rscreen, templ), templ->flags & R600_RESOURCE_FLAG_FLUSHED_DEPTH); if (r) { return NULL; } r = rscreen->ws->surface_best(rscreen->ws, &surface); if (r) { return NULL; } return (struct pipe_resource *)r600_texture_create_object(screen, templ, 0, NULL, &surface); }
struct pipe_resource *si_texture_from_handle(struct pipe_screen *screen, const struct pipe_resource *templ, struct winsys_handle *whandle) { struct r600_screen *rscreen = (struct r600_screen*)screen; struct pb_buffer *buf = NULL; unsigned stride = 0; unsigned array_mode = V_009910_ARRAY_LINEAR_ALIGNED; enum radeon_bo_layout micro, macro; struct radeon_surface surface; int r; /* Support only 2D textures without mipmaps */ if ((templ->target != PIPE_TEXTURE_2D && templ->target != PIPE_TEXTURE_RECT) || templ->depth0 != 1 || templ->last_level != 0) return NULL; buf = rscreen->ws->buffer_from_handle(rscreen->ws, whandle, &stride); if (!buf) return NULL; rscreen->ws->buffer_get_tiling(buf, µ, ¯o, &surface.bankw, &surface.bankh, &surface.tile_split, &surface.stencil_tile_split, &surface.mtilea); if (macro == RADEON_LAYOUT_TILED) array_mode = V_009910_ARRAY_2D_TILED_THIN1; else if (micro == RADEON_LAYOUT_TILED) array_mode = V_009910_ARRAY_1D_TILED_THIN1; else array_mode = V_009910_ARRAY_LINEAR_ALIGNED; r = r600_init_surface(&surface, templ, array_mode); if (r) { return NULL; } return (struct pipe_resource *)r600_texture_create_object(screen, templ, array_mode, stride, 0, buf, FALSE, &surface); }