Documentation
¶
Overview ¶
Package software provides a CPU-based software rendering backend.
Status: IMPLEMENTED (Phase 1 - Headless Rendering)
The software backend implements all HAL interfaces using pure Go CPU rendering. Unlike the noop backend, it actually performs rendering operations in memory.
Use cases:
- Headless rendering (servers, CI/CD)
- Screenshot/image generation without GPU
- Testing rendering logic without GPU hardware
- Embedded systems without GPU
- Fallback when no GPU backend is available
Implemented features (Phase 1):
- Real data storage for buffers and textures
- Clear operations (fill framebuffer/texture with color)
- Buffer/texture copy operations
- Framebuffer readback via Surface.GetFramebuffer()
- Thread-safe resource access
Limitations:
- Much slower than GPU backends (CPU-bound)
- No hardware acceleration
- No compute shaders (returns error)
- No rasterization yet (draw calls are no-op - Phase 2)
- No shader execution (basic resources only)
Always compiled (no build tags required).
Example:
import _ "github.com/gogpu/wgpu/hal/software" // Software backend is registered automatically // Adapter name: "Software Renderer" // Device type: types.DeviceTypeCPU
Backend identifier: types.BackendEmpty
Index ¶
- Variables
- type API
- type Adapter
- type Buffer
- type CommandEncoder
- func (c *CommandEncoder) BeginComputePass(desc *hal.ComputePassDescriptor) hal.ComputePassEncoder
- func (c *CommandEncoder) BeginEncoding(_ string) error
- func (c *CommandEncoder) BeginRenderPass(desc *hal.RenderPassDescriptor) hal.RenderPassEncoder
- func (c *CommandEncoder) ClearBuffer(buffer hal.Buffer, offset, size uint64)
- func (c *CommandEncoder) CopyBufferToBuffer(src, dst hal.Buffer, regions []hal.BufferCopy)
- func (c *CommandEncoder) CopyBufferToTexture(src hal.Buffer, dst hal.Texture, regions []hal.BufferTextureCopy)
- func (c *CommandEncoder) CopyTextureToBuffer(src hal.Texture, dst hal.Buffer, regions []hal.BufferTextureCopy)
- func (c *CommandEncoder) CopyTextureToTexture(src, dst hal.Texture, regions []hal.TextureCopy)
- func (c *CommandEncoder) DiscardEncoding()
- func (c *CommandEncoder) EndEncoding() (hal.CommandBuffer, error)
- func (c *CommandEncoder) ResetAll(_ []hal.CommandBuffer)
- func (c *CommandEncoder) ResolveQuerySet(_ hal.QuerySet, _, _ uint32, _ hal.Buffer, _ uint64)
- func (c *CommandEncoder) TransitionBuffers(_ []hal.BufferBarrier)
- func (c *CommandEncoder) TransitionTextures(_ []hal.TextureBarrier)
- type ComputePassEncoder
- func (c *ComputePassEncoder) Dispatch(_, _, _ uint32)
- func (c *ComputePassEncoder) DispatchIndirect(_ hal.Buffer, _ uint64)
- func (c *ComputePassEncoder) End()
- func (c *ComputePassEncoder) SetBindGroup(_ uint32, _ hal.BindGroup, _ []uint32)
- func (c *ComputePassEncoder) SetPipeline(_ hal.ComputePipeline)
- type Device
- func (d *Device) CreateBindGroup(_ *hal.BindGroupDescriptor) (hal.BindGroup, error)
- func (d *Device) CreateBindGroupLayout(_ *hal.BindGroupLayoutDescriptor) (hal.BindGroupLayout, error)
- func (d *Device) CreateBuffer(desc *hal.BufferDescriptor) (hal.Buffer, error)
- func (d *Device) CreateCommandEncoder(_ *hal.CommandEncoderDescriptor) (hal.CommandEncoder, error)
- func (d *Device) CreateComputePipeline(_ *hal.ComputePipelineDescriptor) (hal.ComputePipeline, error)
- func (d *Device) CreateFence() (hal.Fence, error)
- func (d *Device) CreatePipelineLayout(_ *hal.PipelineLayoutDescriptor) (hal.PipelineLayout, error)
- func (d *Device) CreateQuerySet(_ *hal.QuerySetDescriptor) (hal.QuerySet, error)
- func (d *Device) CreateRenderBundleEncoder(_ *hal.RenderBundleEncoderDescriptor) (hal.RenderBundleEncoder, error)
- func (d *Device) CreateRenderPipeline(_ *hal.RenderPipelineDescriptor) (hal.RenderPipeline, error)
- func (d *Device) CreateSampler(_ *hal.SamplerDescriptor) (hal.Sampler, error)
- func (d *Device) CreateShaderModule(_ *hal.ShaderModuleDescriptor) (hal.ShaderModule, error)
- func (d *Device) CreateTexture(desc *hal.TextureDescriptor) (hal.Texture, error)
- func (d *Device) CreateTextureView(texture hal.Texture, _ *hal.TextureViewDescriptor) (hal.TextureView, error)
- func (d *Device) Destroy()
- func (d *Device) DestroyBindGroup(_ hal.BindGroup)
- func (d *Device) DestroyBindGroupLayout(_ hal.BindGroupLayout)
- func (d *Device) DestroyBuffer(_ hal.Buffer)
- func (d *Device) DestroyComputePipeline(_ hal.ComputePipeline)
- func (d *Device) DestroyFence(_ hal.Fence)
- func (d *Device) DestroyPipelineLayout(_ hal.PipelineLayout)
- func (d *Device) DestroyQuerySet(_ hal.QuerySet)
- func (d *Device) DestroyRenderBundle(_ hal.RenderBundle)
- func (d *Device) DestroyRenderPipeline(_ hal.RenderPipeline)
- func (d *Device) DestroySampler(_ hal.Sampler)
- func (d *Device) DestroyShaderModule(_ hal.ShaderModule)
- func (d *Device) DestroyTexture(_ hal.Texture)
- func (d *Device) DestroyTextureView(_ hal.TextureView)
- func (d *Device) FreeCommandBuffer(_ hal.CommandBuffer)
- func (d *Device) GetFenceStatus(fence hal.Fence) (bool, error)
- func (d *Device) ResetFence(fence hal.Fence) error
- func (d *Device) Wait(fence hal.Fence, value uint64, _ time.Duration) (bool, error)
- func (d *Device) WaitIdle() error
- type Fence
- type Instance
- type Queue
- func (q *Queue) GetTimestampPeriod() float32
- func (q *Queue) Present(_ hal.Surface, _ hal.SurfaceTexture) error
- func (q *Queue) ReadBuffer(buffer hal.Buffer, offset uint64, data []byte) error
- func (q *Queue) Submit(_ []hal.CommandBuffer, fence hal.Fence, fenceValue uint64) error
- func (q *Queue) WriteBuffer(buffer hal.Buffer, offset uint64, data []byte) error
- func (q *Queue) WriteTexture(dst *hal.ImageCopyTexture, data []byte, layout *hal.ImageDataLayout, ...) error
- type RenderPassEncoder
- func (r *RenderPassEncoder) Draw(_, _, _, _ uint32)
- func (r *RenderPassEncoder) DrawIndexed(_, _, _ uint32, _ int32, _ uint32)
- func (r *RenderPassEncoder) DrawIndexedIndirect(_ hal.Buffer, _ uint64)
- func (r *RenderPassEncoder) DrawIndirect(_ hal.Buffer, _ uint64)
- func (r *RenderPassEncoder) End()
- func (r *RenderPassEncoder) ExecuteBundle(_ hal.RenderBundle)
- func (r *RenderPassEncoder) SetBindGroup(_ uint32, _ hal.BindGroup, _ []uint32)
- func (r *RenderPassEncoder) SetBlendConstant(_ *gputypes.Color)
- func (r *RenderPassEncoder) SetIndexBuffer(_ hal.Buffer, _ gputypes.IndexFormat, _ uint64)
- func (r *RenderPassEncoder) SetPipeline(_ hal.RenderPipeline)
- func (r *RenderPassEncoder) SetScissorRect(_, _, _, _ uint32)
- func (r *RenderPassEncoder) SetStencilReference(_ uint32)
- func (r *RenderPassEncoder) SetVertexBuffer(_ uint32, _ hal.Buffer, _ uint64)
- func (r *RenderPassEncoder) SetViewport(_, _, _, _, _, _ float32)
- type Resource
- type Surface
- func (s *Surface) AcquireTexture(_ hal.Fence) (*hal.AcquiredSurfaceTexture, error)
- func (s *Surface) Configure(_ hal.Device, config *hal.SurfaceConfiguration) error
- func (s *Surface) DiscardTexture(_ hal.SurfaceTexture)
- func (s *Surface) GetFramebuffer() []byte
- func (s *Surface) Unconfigure(_ hal.Device)
- type SurfaceTexture
- type Texture
- type TextureView
Constants ¶
This section is empty.
Variables ¶
var ErrComputeNotSupported = errors.New("software: compute shaders not supported")
ErrComputeNotSupported indicates that compute shaders are not available in the software backend. The software backend only supports rasterization; use a GPU-accelerated backend (Vulkan, Metal, DX12) for compute workloads.
Functions ¶
This section is empty.
Types ¶
type API ¶
type API struct{}
API implements hal.Backend for the software backend.
func (API) CreateInstance ¶
CreateInstance creates a new software rendering instance. Always succeeds and returns a CPU-based rendering instance.
type Adapter ¶
type Adapter struct{}
Adapter implements hal.Adapter for the software backend.
func (*Adapter) Open ¶
Open creates a software device with the requested features and limits. Always succeeds and returns a device/queue pair.
func (*Adapter) SurfaceCapabilities ¶
func (a *Adapter) SurfaceCapabilities(_ hal.Surface) *hal.SurfaceCapabilities
SurfaceCapabilities returns default surface capabilities.
func (*Adapter) TextureFormatCapabilities ¶
func (a *Adapter) TextureFormatCapabilities(_ gputypes.TextureFormat) hal.TextureFormatCapabilities
TextureFormatCapabilities returns default capabilities for all formats.
type Buffer ¶
type Buffer struct {
Resource
// contains filtered or unexported fields
}
Buffer implements hal.Buffer with real data storage. All software buffers store their data in memory.
func (*Buffer) NativeHandle ¶
NativeHandle returns 0 for software buffers.
type CommandEncoder ¶
type CommandEncoder struct{}
CommandEncoder implements hal.CommandEncoder for the software backend.
func (*CommandEncoder) BeginComputePass ¶
func (c *CommandEncoder) BeginComputePass(desc *hal.ComputePassDescriptor) hal.ComputePassEncoder
BeginComputePass begins a compute pass and returns an encoder.
func (*CommandEncoder) BeginEncoding ¶
func (c *CommandEncoder) BeginEncoding(_ string) error
BeginEncoding is a no-op.
func (*CommandEncoder) BeginRenderPass ¶
func (c *CommandEncoder) BeginRenderPass(desc *hal.RenderPassDescriptor) hal.RenderPassEncoder
BeginRenderPass begins a render pass and returns an encoder.
func (*CommandEncoder) ClearBuffer ¶
func (c *CommandEncoder) ClearBuffer(buffer hal.Buffer, offset, size uint64)
ClearBuffer clears a buffer region to zero.
func (*CommandEncoder) CopyBufferToBuffer ¶
func (c *CommandEncoder) CopyBufferToBuffer(src, dst hal.Buffer, regions []hal.BufferCopy)
CopyBufferToBuffer copies data between buffers.
func (*CommandEncoder) CopyBufferToTexture ¶
func (c *CommandEncoder) CopyBufferToTexture(src hal.Buffer, dst hal.Texture, regions []hal.BufferTextureCopy)
CopyBufferToTexture copies data from a buffer to a texture.
func (*CommandEncoder) CopyTextureToBuffer ¶
func (c *CommandEncoder) CopyTextureToBuffer(src hal.Texture, dst hal.Buffer, regions []hal.BufferTextureCopy)
CopyTextureToBuffer copies data from a texture to a buffer.
func (*CommandEncoder) CopyTextureToTexture ¶
func (c *CommandEncoder) CopyTextureToTexture(src, dst hal.Texture, regions []hal.TextureCopy)
CopyTextureToTexture copies data between textures.
func (*CommandEncoder) DiscardEncoding ¶
func (c *CommandEncoder) DiscardEncoding()
DiscardEncoding is a no-op.
func (*CommandEncoder) EndEncoding ¶
func (c *CommandEncoder) EndEncoding() (hal.CommandBuffer, error)
EndEncoding returns a placeholder command buffer.
func (*CommandEncoder) ResetAll ¶
func (c *CommandEncoder) ResetAll(_ []hal.CommandBuffer)
ResetAll is a no-op.
func (*CommandEncoder) ResolveQuerySet ¶
ResolveQuerySet is a no-op (query sets not supported in software backend).
func (*CommandEncoder) TransitionBuffers ¶
func (c *CommandEncoder) TransitionBuffers(_ []hal.BufferBarrier)
TransitionBuffers is a no-op (software backend doesn't need explicit transitions).
func (*CommandEncoder) TransitionTextures ¶
func (c *CommandEncoder) TransitionTextures(_ []hal.TextureBarrier)
TransitionTextures is a no-op (software backend doesn't need explicit transitions).
type ComputePassEncoder ¶
type ComputePassEncoder struct {
// contains filtered or unexported fields
}
ComputePassEncoder implements hal.ComputePassEncoder for the software backend.
func (*ComputePassEncoder) Dispatch ¶
func (c *ComputePassEncoder) Dispatch(_, _, _ uint32)
Dispatch is a no-op (compute not supported).
func (*ComputePassEncoder) DispatchIndirect ¶
func (c *ComputePassEncoder) DispatchIndirect(_ hal.Buffer, _ uint64)
DispatchIndirect is a no-op.
func (*ComputePassEncoder) SetBindGroup ¶
func (c *ComputePassEncoder) SetBindGroup(_ uint32, _ hal.BindGroup, _ []uint32)
SetBindGroup is a no-op.
func (*ComputePassEncoder) SetPipeline ¶
func (c *ComputePassEncoder) SetPipeline(_ hal.ComputePipeline)
SetPipeline is a no-op (compute not supported).
type Device ¶
type Device struct{}
Device implements hal.Device for the software backend.
func (*Device) CreateBindGroup ¶
CreateBindGroup creates a software bind group.
func (*Device) CreateBindGroupLayout ¶
func (d *Device) CreateBindGroupLayout(_ *hal.BindGroupLayoutDescriptor) (hal.BindGroupLayout, error)
CreateBindGroupLayout creates a software bind group layout.
func (*Device) CreateBuffer ¶
CreateBuffer creates a software buffer with real data storage.
func (*Device) CreateCommandEncoder ¶
func (d *Device) CreateCommandEncoder(_ *hal.CommandEncoderDescriptor) (hal.CommandEncoder, error)
CreateCommandEncoder creates a software command encoder.
func (*Device) CreateComputePipeline ¶
func (d *Device) CreateComputePipeline(_ *hal.ComputePipelineDescriptor) (hal.ComputePipeline, error)
CreateComputePipeline returns ErrComputeNotSupported. The software backend does not support compute shaders.
func (*Device) CreateFence ¶
CreateFence creates a software fence with atomic counter.
func (*Device) CreatePipelineLayout ¶
func (d *Device) CreatePipelineLayout(_ *hal.PipelineLayoutDescriptor) (hal.PipelineLayout, error)
CreatePipelineLayout creates a software pipeline layout.
func (*Device) CreateQuerySet ¶
CreateQuerySet is not supported in the software backend.
func (*Device) CreateRenderBundleEncoder ¶
func (d *Device) CreateRenderBundleEncoder(_ *hal.RenderBundleEncoderDescriptor) (hal.RenderBundleEncoder, error)
CreateRenderBundleEncoder is not supported in the software backend.
func (*Device) CreateRenderPipeline ¶
func (d *Device) CreateRenderPipeline(_ *hal.RenderPipelineDescriptor) (hal.RenderPipeline, error)
CreateRenderPipeline creates a software render pipeline.
func (*Device) CreateSampler ¶
CreateSampler creates a software sampler.
func (*Device) CreateShaderModule ¶
func (d *Device) CreateShaderModule(_ *hal.ShaderModuleDescriptor) (hal.ShaderModule, error)
CreateShaderModule creates a software shader module.
func (*Device) CreateTexture ¶
CreateTexture creates a software texture with real pixel storage.
func (*Device) CreateTextureView ¶
func (d *Device) CreateTextureView(texture hal.Texture, _ *hal.TextureViewDescriptor) (hal.TextureView, error)
CreateTextureView creates a software texture view.
func (*Device) DestroyBindGroup ¶
DestroyBindGroup is a no-op.
func (*Device) DestroyBindGroupLayout ¶
func (d *Device) DestroyBindGroupLayout(_ hal.BindGroupLayout)
DestroyBindGroupLayout is a no-op.
func (*Device) DestroyBuffer ¶
DestroyBuffer is a no-op (Go GC handles cleanup).
func (*Device) DestroyComputePipeline ¶
func (d *Device) DestroyComputePipeline(_ hal.ComputePipeline)
DestroyComputePipeline is a no-op.
func (*Device) DestroyPipelineLayout ¶
func (d *Device) DestroyPipelineLayout(_ hal.PipelineLayout)
DestroyPipelineLayout is a no-op.
func (*Device) DestroyQuerySet ¶
DestroyQuerySet is a no-op for the software device.
func (*Device) DestroyRenderBundle ¶
func (d *Device) DestroyRenderBundle(_ hal.RenderBundle)
DestroyRenderBundle is a no-op for the software device.
func (*Device) DestroyRenderPipeline ¶
func (d *Device) DestroyRenderPipeline(_ hal.RenderPipeline)
DestroyRenderPipeline is a no-op.
func (*Device) DestroySampler ¶
DestroySampler is a no-op.
func (*Device) DestroyShaderModule ¶
func (d *Device) DestroyShaderModule(_ hal.ShaderModule)
DestroyShaderModule is a no-op.
func (*Device) DestroyTexture ¶
DestroyTexture is a no-op (Go GC handles cleanup).
func (*Device) DestroyTextureView ¶
func (d *Device) DestroyTextureView(_ hal.TextureView)
DestroyTextureView is a no-op.
func (*Device) FreeCommandBuffer ¶
func (d *Device) FreeCommandBuffer(_ hal.CommandBuffer)
FreeCommandBuffer is a no-op for the software device.
func (*Device) GetFenceStatus ¶
GetFenceStatus returns true if the fence is signaled (non-blocking).
func (*Device) ResetFence ¶
ResetFence resets a fence to the unsignaled state.
type Fence ¶
type Fence struct {
Resource
// contains filtered or unexported fields
}
Fence implements hal.Fence with an atomic counter for synchronization.
type Instance ¶
type Instance struct{}
Instance implements hal.Instance for the software backend.
func (*Instance) CreateSurface ¶
CreateSurface creates a software rendering surface. Always succeeds regardless of display/window handles.
func (*Instance) Destroy ¶
func (i *Instance) Destroy()
Destroy is a no-op for the software instance.
func (*Instance) EnumerateAdapters ¶
func (i *Instance) EnumerateAdapters(_ hal.Surface) []hal.ExposedAdapter
EnumerateAdapters returns a single default software adapter. The surfaceHint is ignored.
type Queue ¶
type Queue struct{}
Queue implements hal.Queue for the software backend.
func (*Queue) GetTimestampPeriod ¶
GetTimestampPeriod returns 1.0 nanosecond timestamp period.
func (*Queue) Present ¶
Present simulates surface presentation. In software backend, this is essentially a no-op since framebuffer is already updated.
func (*Queue) ReadBuffer ¶
ReadBuffer reads data from a buffer.
func (*Queue) Submit ¶
Submit simulates command buffer submission. If a fence is provided, it is signaled with the given value.
func (*Queue) WriteBuffer ¶
WriteBuffer performs immediate buffer writes with real data storage.
func (*Queue) WriteTexture ¶
func (q *Queue) WriteTexture(dst *hal.ImageCopyTexture, data []byte, layout *hal.ImageDataLayout, size *hal.Extent3D) error
WriteTexture performs immediate texture writes with real data storage.
type RenderPassEncoder ¶
type RenderPassEncoder struct {
// contains filtered or unexported fields
}
RenderPassEncoder implements hal.RenderPassEncoder for the software backend.
func (*RenderPassEncoder) Draw ¶
func (r *RenderPassEncoder) Draw(_, _, _, _ uint32)
Draw is a no-op (rasterization not implemented in Phase 1).
func (*RenderPassEncoder) DrawIndexed ¶
func (r *RenderPassEncoder) DrawIndexed(_, _, _ uint32, _ int32, _ uint32)
DrawIndexed is a no-op (rasterization not implemented in Phase 1).
func (*RenderPassEncoder) DrawIndexedIndirect ¶
func (r *RenderPassEncoder) DrawIndexedIndirect(_ hal.Buffer, _ uint64)
DrawIndexedIndirect is a no-op.
func (*RenderPassEncoder) DrawIndirect ¶
func (r *RenderPassEncoder) DrawIndirect(_ hal.Buffer, _ uint64)
DrawIndirect is a no-op.
func (*RenderPassEncoder) End ¶
func (r *RenderPassEncoder) End()
End finishes the render pass and performs load/store operations.
func (*RenderPassEncoder) ExecuteBundle ¶
func (r *RenderPassEncoder) ExecuteBundle(_ hal.RenderBundle)
ExecuteBundle is a no-op.
func (*RenderPassEncoder) SetBindGroup ¶
func (r *RenderPassEncoder) SetBindGroup(_ uint32, _ hal.BindGroup, _ []uint32)
SetBindGroup is a no-op.
func (*RenderPassEncoder) SetBlendConstant ¶
func (r *RenderPassEncoder) SetBlendConstant(_ *gputypes.Color)
SetBlendConstant is a no-op.
func (*RenderPassEncoder) SetIndexBuffer ¶
func (r *RenderPassEncoder) SetIndexBuffer(_ hal.Buffer, _ gputypes.IndexFormat, _ uint64)
SetIndexBuffer is a no-op.
func (*RenderPassEncoder) SetPipeline ¶
func (r *RenderPassEncoder) SetPipeline(_ hal.RenderPipeline)
SetPipeline is a no-op.
func (*RenderPassEncoder) SetScissorRect ¶
func (r *RenderPassEncoder) SetScissorRect(_, _, _, _ uint32)
SetScissorRect is a no-op.
func (*RenderPassEncoder) SetStencilReference ¶
func (r *RenderPassEncoder) SetStencilReference(_ uint32)
SetStencilReference is a no-op.
func (*RenderPassEncoder) SetVertexBuffer ¶
func (r *RenderPassEncoder) SetVertexBuffer(_ uint32, _ hal.Buffer, _ uint64)
SetVertexBuffer is a no-op.
func (*RenderPassEncoder) SetViewport ¶
func (r *RenderPassEncoder) SetViewport(_, _, _, _, _, _ float32)
SetViewport is a no-op.
type Resource ¶
type Resource struct{}
Resource is a placeholder implementation for most HAL resource gputypes. It implements the hal.Resource interface with a no-op Destroy method.
func (*Resource) NativeHandle ¶
NativeHandle returns 0 for software resources (no real GPU handle).
type Surface ¶
type Surface struct {
Resource
// contains filtered or unexported fields
}
Surface implements hal.Surface for the software backend.
func (*Surface) AcquireTexture ¶
AcquireTexture returns a surface texture backed by the framebuffer.
func (*Surface) Configure ¶
Configure configures the surface with the given settings.
Returns hal.ErrZeroArea if width or height is zero. This commonly happens when the window is minimized or not yet fully visible. Wait until the window has valid dimensions before calling Configure again.
func (*Surface) DiscardTexture ¶
func (s *Surface) DiscardTexture(_ hal.SurfaceTexture)
DiscardTexture is a no-op (framebuffer stays allocated).
func (*Surface) GetFramebuffer ¶
GetFramebuffer returns a copy of the current framebuffer data (thread-safe). This is the key method for reading rendered results in software backend.
func (*Surface) Unconfigure ¶
Unconfigure removes the surface configuration.
type SurfaceTexture ¶
type SurfaceTexture struct {
Texture
// contains filtered or unexported fields
}
SurfaceTexture implements hal.SurfaceTexture. It shares the framebuffer with the surface.
type Texture ¶
type Texture struct {
Resource
// contains filtered or unexported fields
}
Texture implements hal.Texture with real pixel storage.
func (*Texture) NativeHandle ¶
NativeHandle returns 0 for software textures.
type TextureView ¶
type TextureView struct {
Resource
// contains filtered or unexported fields
}
TextureView implements hal.TextureView. In software backend, views just reference the original texture.
func (*TextureView) NativeHandle ¶
func (v *TextureView) NativeHandle() uintptr
NativeHandle returns 0 for software texture views.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package raster provides CPU-based triangle rasterization for the software backend.
|
Package raster provides CPU-based triangle rasterization for the software backend. |
|
Package shader provides callback-based shader execution for the software backend.
|
Package shader provides callback-based shader execution for the software backend. |