[Mesa-dev] [PATCH 3/3][RFC v2] mesa/main: Clamp rgba with streamed sse
Juha-Pekka Heikkila
juhapekka.heikkila at gmail.com
Tue Nov 4 04:05:31 PST 2014
Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
---
src/mesa/main/pixeltransfer.c | 62 ++++++++++++++++++++++++++++++-------------
1 file changed, 43 insertions(+), 19 deletions(-)
diff --git a/src/mesa/main/pixeltransfer.c b/src/mesa/main/pixeltransfer.c
index 8bbeeb8..99eed38 100644
--- a/src/mesa/main/pixeltransfer.c
+++ b/src/mesa/main/pixeltransfer.c
@@ -35,7 +35,8 @@
#include "pixeltransfer.h"
#include "imports.h"
#include "mtypes.h"
-
+#include "x86/common_x86_asm.h"
+#include "main/x86/sse2_clamping.h"
/*
* Apply scale and bias factors to an array of RGBA pixels.
@@ -80,25 +81,39 @@ _mesa_scale_and_bias_rgba(GLuint n, GLfloat rgba[][4],
void
_mesa_map_rgba( const struct gl_context *ctx, GLuint n, GLfloat rgba[][4] )
{
- const GLfloat rscale = (GLfloat) (ctx->PixelMaps.RtoR.Size - 1);
- const GLfloat gscale = (GLfloat) (ctx->PixelMaps.GtoG.Size - 1);
- const GLfloat bscale = (GLfloat) (ctx->PixelMaps.BtoB.Size - 1);
- const GLfloat ascale = (GLfloat) (ctx->PixelMaps.AtoA.Size - 1);
const GLfloat *rMap = ctx->PixelMaps.RtoR.Map;
const GLfloat *gMap = ctx->PixelMaps.GtoG.Map;
const GLfloat *bMap = ctx->PixelMaps.BtoB.Map;
const GLfloat *aMap = ctx->PixelMaps.AtoA.Map;
GLuint i;
- for (i=0;i<n;i++) {
- GLfloat r = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
- GLfloat g = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
- GLfloat b = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
- GLfloat a = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
- rgba[i][RCOMP] = rMap[F_TO_I(r * rscale)];
- rgba[i][GCOMP] = gMap[F_TO_I(g * gscale)];
- rgba[i][BCOMP] = bMap[F_TO_I(b * bscale)];
- rgba[i][ACOMP] = aMap[F_TO_I(a * ascale)];
+ GLfloat scale[4];
+
+ scale[RCOMP] = (GLfloat) (ctx->PixelMaps.RtoR.Size - 1);
+ scale[GCOMP] = (GLfloat) (ctx->PixelMaps.GtoG.Size - 1);
+ scale[BCOMP] = (GLfloat) (ctx->PixelMaps.BtoB.Size - 1);
+ scale[ACOMP] = (GLfloat) (ctx->PixelMaps.AtoA.Size - 1);
+
+#if defined(USE_SSE2)
+ if (cpu_has_xmm2) {
+ _mesa_clamp_float_rgba_scale_and_map(n, rgba, rgba, 0.0F, 1.0F, scale,
+ rMap, gMap, bMap, aMap);
}
+ else {
+#endif
+ for (i=0;i<n;i++) {
+ GLfloat rgba_temp[4];
+ rgba_temp[RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
+ rgba_temp[GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
+ rgba_temp[BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
+ rgba_temp[ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
+ rgba[i][RCOMP] = rMap[F_TO_I(rgba_temp[RCOMP] * scale[RCOMP])];
+ rgba[i][GCOMP] = gMap[F_TO_I(rgba_temp[GCOMP] * scale[GCOMP])];
+ rgba[i][BCOMP] = bMap[F_TO_I(rgba_temp[BCOMP] * scale[BCOMP])];
+ rgba[i][ACOMP] = aMap[F_TO_I(rgba_temp[ACOMP] * scale[ACOMP])];
+ }
+#if defined(USE_SSE2)
+ }
+#endif
}
/*
@@ -179,12 +194,21 @@ _mesa_apply_rgba_transfer_ops(struct gl_context *ctx, GLbitfield transferOps,
/* clamping to [0,1] */
if (transferOps & IMAGE_CLAMP_BIT) {
GLuint i;
- for (i = 0; i < n; i++) {
- rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
- rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
- rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
- rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
+#if defined(USE_SSE2)
+ if (cpu_has_xmm2) {
+ _mesa_streaming_clamp_float_rgba(n, rgba, rgba, 0.0F, 1.0F);
+ }
+ else {
+#endif
+ for (i = 0; i < n; i++) {
+ rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
+ rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
+ rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
+ rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
+ }
+#if defined(USE_SSE2)
}
+#endif
}
}
--
1.8.5.1
More information about the mesa-dev
mailing list