mirror of
https://github.com/stevenrobertson/cuburn.git
synced 2025-02-05 11:40:04 -05:00
Fix clamping issues
This commit is contained in:
parent
b073b7e22e
commit
0988f8d5ed
@ -1,7 +1,19 @@
|
|||||||
from util import devlib, ringbuflib
|
from util import devlib, ringbuflib
|
||||||
from mwc import mwclib
|
from mwc import mwclib
|
||||||
|
|
||||||
rgba8lib = devlib(deps=[ringbuflib, mwclib], defs=r'''
|
ditherlib = devlib(deps=[mwclib], defs=r'''
|
||||||
|
// Clamp an input between 0 and a given peak (inclusive), dithering its output,
|
||||||
|
// with full clamping for pixels that are true-black for compressibility.
|
||||||
|
__device__ float dclampf(mwc_st &rctx, float peak, float in) {
|
||||||
|
float ret = 0.0f;
|
||||||
|
if (in > 0.0f) {
|
||||||
|
ret = fminf(peak, fmaxf(0.0f, in * peak + 0.49f * mwc_next_11(rctx)));
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
''')
|
||||||
|
|
||||||
|
rgba8lib = devlib(deps=[ringbuflib, mwclib, ditherlib], defs=r'''
|
||||||
// Perform a conversion from float32 values to uint8 ones, applying
|
// Perform a conversion from float32 values to uint8 ones, applying
|
||||||
// pixel- and channel-independent dithering to reduce suprathreshold banding
|
// pixel- and channel-independent dithering to reduce suprathreshold banding
|
||||||
// artifacts. Clamps values larger than 1.0f.
|
// artifacts. Clamps values larger than 1.0f.
|
||||||
@ -22,10 +34,10 @@ __global__ void f32_to_rgba_u8(
|
|||||||
|
|
||||||
float4 in = src[isrc];
|
float4 in = src[isrc];
|
||||||
uchar4 out = make_uchar4(
|
uchar4 out = make_uchar4(
|
||||||
fminf(1.0f, in.x) * 255.0f + 0.49f * mwc_next_11(rctx),
|
dclampf(rctx, 255.0f, in.x),
|
||||||
fminf(1.0f, in.y) * 255.0f + 0.49f * mwc_next_11(rctx),
|
dclampf(rctx, 255.0f, in.y),
|
||||||
fminf(1.0f, in.z) * 255.0f + 0.49f * mwc_next_11(rctx),
|
dclampf(rctx, 255.0f, in.z),
|
||||||
fminf(1.0f, in.w) * 255.0f + 0.49f * mwc_next_11(rctx)
|
dclampf(rctx, 255.0f, in.w)
|
||||||
);
|
);
|
||||||
|
|
||||||
int idst = dstride * y + x;
|
int idst = dstride * y + x;
|
||||||
@ -34,7 +46,7 @@ __global__ void f32_to_rgba_u8(
|
|||||||
}
|
}
|
||||||
''')
|
''')
|
||||||
|
|
||||||
rgba16lib = devlib(deps=[ringbuflib, mwclib], defs=r'''
|
rgba16lib = devlib(deps=[ringbuflib, mwclib, ditherlib], defs=r'''
|
||||||
// Perform a conversion from float32 values to uint16 ones, as above.
|
// Perform a conversion from float32 values to uint16 ones, as above.
|
||||||
__global__ void f32_to_rgba_u16(
|
__global__ void f32_to_rgba_u16(
|
||||||
ushort4 *dst, const float4 *src,
|
ushort4 *dst, const float4 *src,
|
||||||
@ -51,10 +63,10 @@ __global__ void f32_to_rgba_u16(
|
|||||||
|
|
||||||
float4 in = src[isrc];
|
float4 in = src[isrc];
|
||||||
ushort4 out = make_ushort4(
|
ushort4 out = make_ushort4(
|
||||||
fminf(1.0f, in.x) * 65535.0f + 0.49f * mwc_next_11(rctx),
|
dclampf(rctx, 65535.0f, in.x),
|
||||||
fminf(1.0f, in.y) * 65535.0f + 0.49f * mwc_next_11(rctx),
|
dclampf(rctx, 65535.0f, in.y),
|
||||||
fminf(1.0f, in.z) * 65535.0f + 0.49f * mwc_next_11(rctx),
|
dclampf(rctx, 65535.0f, in.z),
|
||||||
fminf(1.0f, in.w) * 65535.0f + 0.49f * mwc_next_11(rctx)
|
dclampf(rctx, 65535.0f, in.w)
|
||||||
);
|
);
|
||||||
|
|
||||||
int idst = dstride * y + x;
|
int idst = dstride * y + x;
|
||||||
|
Loading…
Reference in New Issue
Block a user