# GPU Resources
A key role of the `Device` class is to let the application create GPU resources.
The main GPU resources that luma.gl applications will typically be creating directly are
`Buffer` and `Texture` objects.
However there is a number of other GPU resource objects. These are usually created
automatically behind the scenes, e.g. by the `Model` and `Transform` classes, but can
be created directly if needed.
## Types of GPU Resources
GPU resources correspond to data on the GPU and/or a state object in the GPU driver.
- Resources that represent actual memory uploaded to the GPU are `Buffer` and `Texture`.
- Resources that hold executable GPU code, such as `Shader`, `Renderpipeline` and `ComputePipeline`.
- Other GPU resources tend to hold validated settings or state (usually these are GPU driver objects rather)
## Creating GPU Resources
The [`Device`](/docs//api-reference/core/device) class provides methods for creating GPU resources
luma.gl provides a consistent API
| Resource creation method | Description |
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `device.createBuffer(props: BufferProps)`
`device.createBuffer(props: ArrayBuffer)`
`device.createBuffer(props: ArrayBufferView)` | Create a [`Buffer`](/docs/api-reference/core/resources/buffer). |
| `device.createTexture(props: TextureProps)`
`device.createTexture(Promise)`| Create a [`Texture`](/docs/api-reference/core/resources/texture). |
| `device.createSampler(props: SamplerProps)` | Create a [`Sampler`](/docs/api-reference/core/resources/sampler). |
| `device.createFramebuffer(props: FramebufferProps)` | Create a [`Framebuffer`](/docs/api-reference/core/resources/framebuffer). |
| `device.createShader(props: ShaderProps)` | Create a [`Shader`](/docs/api-reference/core/resources/shader). |
| `device.createRenderPipeline(props: RenderPipelineProps)` | Create a [`RenderPipeline`](/docs/api-reference/core/resources/render-pipeline) (aka program) |
| `device.createComputePipeline(props: ComputePipelineProps)` | Create a [`ComputePipeline`](/docs/api-reference/core/resources/compute-pipeline) (aka program) |
| `beginRenderPass(props: RenderPassProps)` | Create a [`RenderPass`](/docs/api-reference/core/resources/render-pass). |
| `beginComputePass(props?: ComputePassProps)` | Create a [`ComputePass`](/docs/api-reference/core/resources/compute-pass) which can be used to bind data and run compute operations using compute pipelines. |
| `getDefaultRenderPass()` | A default `RenderPass` is provided for applications that don't need to create multiple or specially configured render passes. |