static bool tex_import_handle(struct ilo_texture *tex, const struct winsys_handle *handle) { struct ilo_screen *is = ilo_screen(tex->base.screen); const char *name = resource_get_bo_name(&tex->base); enum intel_tiling_mode tiling; unsigned long pitch; tex->bo = intel_winsys_import_handle(is->winsys, name, handle, tex->layout.bo_height, &tiling, &pitch); if (!tex->bo) return false; if (!ilo_layout_update_for_imported_bo(&tex->layout, tiling, pitch)) { ilo_err("imported handle has incompatible tiling/pitch\n"); intel_bo_unreference(tex->bo); tex->bo = NULL; return false; } return true; }
static bool tex_create_bo(struct ilo_texture *tex, const struct winsys_handle *handle) { struct ilo_screen *is = ilo_screen(tex->base.screen); const char *name; struct intel_bo *bo; enum intel_tiling_mode tiling; unsigned long pitch; switch (tex->base.target) { case PIPE_TEXTURE_1D: name = "1D texture"; break; case PIPE_TEXTURE_2D: name = "2D texture"; break; case PIPE_TEXTURE_3D: name = "3D texture"; break; case PIPE_TEXTURE_CUBE: name = "cube texture"; break; case PIPE_TEXTURE_RECT: name = "rectangle texture"; break; case PIPE_TEXTURE_1D_ARRAY: name = "1D array texture"; break; case PIPE_TEXTURE_2D_ARRAY: name = "2D array texture"; break; case PIPE_TEXTURE_CUBE_ARRAY: name = "cube array texture"; break; default: name ="unknown texture"; break; } if (handle) { bo = intel_winsys_import_handle(is->winsys, name, handle, tex->bo_width, tex->bo_height, tex->bo_cpp, &tiling, &pitch); } else { bo = intel_winsys_alloc_texture(is->winsys, name, tex->bo_width, tex->bo_height, tex->bo_cpp, tex->tiling, tex->bo_flags, &pitch); tiling = tex->tiling; } if (!bo) return false; if (tex->bo) intel_bo_unreference(tex->bo); tex->bo = bo; tex->tiling = tiling; tex->bo_stride = pitch; return true; }