surface abstraction