/** * Create new pipe_resource given the template information. */ static struct pipe_resource * softpipe_resource_create(struct pipe_screen *screen, const struct pipe_resource *templat) { struct softpipe_resource *spr = CALLOC_STRUCT(softpipe_resource); if (!spr) return NULL; assert(templat->format != PIPE_FORMAT_NONE); spr->base = *templat; pipe_reference_init(&spr->base.reference, 1); spr->base.screen = screen; spr->pot = (util_is_power_of_two(templat->width0) && util_is_power_of_two(templat->height0) && util_is_power_of_two(templat->depth0)); if (spr->base.bind & (PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT | PIPE_BIND_SHARED)) { if (!softpipe_displaytarget_layout(screen, spr)) goto fail; } else { if (!softpipe_resource_layout(screen, spr)) goto fail; } return &spr->base; fail: FREE(spr); return NULL; }
/** * Check the size of the texture specified by 'res'. * \return TRUE if OK, FALSE if too large. */ static boolean softpipe_can_create_resource(struct pipe_screen *screen, const struct pipe_resource *res) { struct softpipe_resource spr; memset(&spr, 0, sizeof(spr)); spr.base = *res; return softpipe_resource_layout(screen, &spr, FALSE); }