Skip to content

Commit cdfd90e

Browse files
jdolanCopilot
andcommitted
Add samplerLinearClamp preset (linear filter, clamp-to-edge, no mipmaps)
Ideal for UI elements, sprites, and render targets. Renderer.c in ObjectivelyMVC uses exactly this sampler configuration. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent acdd192 commit cdfd90e

2 files changed

Lines changed: 42 additions & 0 deletions

File tree

Sources/ObjectivelyGPU/RenderDevice.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ static void dealloc(Object *self) {
4747
if (this->device) {
4848
SDL_ReleaseGPUSampler(this->device, this->_samplerNearest);
4949
SDL_ReleaseGPUSampler(this->device, this->_samplerLinear);
50+
SDL_ReleaseGPUSampler(this->device, this->_samplerLinearClamp);
5051
SDL_ReleaseGPUSampler(this->device, this->_samplerAnisotropic);
5152
}
5253

@@ -237,6 +238,27 @@ static SDL_GPUSampler *samplerLinear(const RenderDevice *self) {
237238
return this->_samplerLinear;
238239
}
239240

241+
/**
242+
* @fn SDL_GPUSampler *RenderDevice::samplerLinearClamp(const RenderDevice *self)
243+
* @memberof RenderDevice
244+
*/
245+
static SDL_GPUSampler *samplerLinearClamp(const RenderDevice *self) {
246+
assert(self);
247+
248+
RenderDevice *this = (RenderDevice *) self;
249+
if (!this->_samplerLinearClamp) {
250+
this->_samplerLinearClamp = $(self, createSampler, &(SDL_GPUSamplerCreateInfo) {
251+
.min_filter = SDL_GPU_FILTER_LINEAR,
252+
.mag_filter = SDL_GPU_FILTER_LINEAR,
253+
.mipmap_mode = SDL_GPU_SAMPLERMIPMAPMODE_NEAREST,
254+
.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE,
255+
.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE,
256+
.address_mode_w = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE,
257+
});
258+
}
259+
return this->_samplerLinearClamp;
260+
}
261+
240262
/**
241263
* @fn SDL_GPUSampler *RenderDevice::samplerNearest(const RenderDevice *self)
242264
* @memberof RenderDevice
@@ -794,6 +816,7 @@ static void initialize(Class *clazz) {
794816
((RenderDeviceInterface *) clazz->interface)->releaseTransferBuffer = releaseTransferBuffer;
795817
((RenderDeviceInterface *) clazz->interface)->samplerAnisotropic = samplerAnisotropic;
796818
((RenderDeviceInterface *) clazz->interface)->samplerLinear = samplerLinear;
819+
((RenderDeviceInterface *) clazz->interface)->samplerLinearClamp = samplerLinearClamp;
797820
((RenderDeviceInterface *) clazz->interface)->samplerNearest = samplerNearest;
798821
((RenderDeviceInterface *) clazz->interface)->setAllowedFramesInFlight = setAllowedFramesInFlight;
799822
((RenderDeviceInterface *) clazz->interface)->setBufferName = setBufferName;

Sources/ObjectivelyGPU/RenderDevice.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ struct RenderDevice {
105105
*/
106106
SDL_GPUSampler *_samplerLinear;
107107

108+
/**
109+
* @brief Cached bilinear clamp-to-edge sampler, initialized on first use.
110+
* @private
111+
*/
112+
SDL_GPUSampler *_samplerLinearClamp;
113+
108114
/**
109115
* @brief Cached anisotropic sampler, initialized on first use.
110116
* @private
@@ -240,6 +246,19 @@ struct RenderDeviceInterface {
240246
*/
241247
SDL_GPUSampler *(*samplerLinear)(const RenderDevice *self);
242248

249+
/**
250+
* @fn SDL_GPUSampler *RenderDevice::samplerLinearClamp(const RenderDevice *self)
251+
* @brief Returns a cached bilinear sampler with clamp-to-edge addressing (no mipmaps).
252+
* @details The sampler is created on first call and reused thereafter. It is
253+
* released automatically in `dealloc`. Do not release it manually.
254+
* This is the correct sampler for UI elements, sprites, and render targets —
255+
* linear magnification without edge bleeding or mip artifacts.
256+
* @param self The RenderDevice.
257+
* @return A cached `SDL_GPUSampler` suitable for UI and sprite rendering.
258+
* @memberof RenderDevice
259+
*/
260+
SDL_GPUSampler *(*samplerLinearClamp)(const RenderDevice *self);
261+
243262
/**
244263
* @fn SDL_GPUSampler *RenderDevice::samplerNearest(const RenderDevice *self)
245264
* @brief Returns a cached nearest-neighbor sampler (clamp-to-edge address).

0 commit comments

Comments
 (0)