From: José Fonseca Date: Thu, 1 Apr 2010 16:35:46 +0000 (+0100) Subject: st/python: Allow to sample only in the [0,1] range. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f14c5adbc78b010d1b07eee9f0f65a99d0df4248;p=mesa.git st/python: Allow to sample only in the [0,1] range. --- diff --git a/src/gallium/state_trackers/python/p_context.i b/src/gallium/state_trackers/python/p_context.i index bccaeead015..02ce5647eb6 100644 --- a/src/gallium/state_trackers/python/p_context.i +++ b/src/gallium/state_trackers/python/p_context.i @@ -589,9 +589,10 @@ error1: void surface_sample_rgba(struct st_surface *surface, - float *rgba) + float *rgba, + int norm = 0) { - st_sample_surface($self->pipe, surface, rgba); + st_sample_surface($self->pipe, surface, rgba, norm != 0); } unsigned diff --git a/src/gallium/state_trackers/python/st_sample.c b/src/gallium/state_trackers/python/st_sample.c index e2c1e060174..218a77fb0a1 100644 --- a/src/gallium/state_trackers/python/st_sample.c +++ b/src/gallium/state_trackers/python/st_sample.c @@ -50,7 +50,7 @@ static uint32_t st_random(void) { seed = UINT64_C(134775813) * seed + UINT64_C(1); - return (uint16_t)(seed >> 32); + return (uint32_t)(seed >> 32); } @@ -470,25 +470,42 @@ static INLINE void st_sample_generic_pixel_block(enum pipe_format format, uint8_t *raw, float *rgba, unsigned rgba_stride, - unsigned w, unsigned h) + unsigned w, unsigned h, + boolean norm) { unsigned i; unsigned x, y, ch; int blocksize = util_format_get_blocksize(format); - for(i = 0; i < blocksize; ++i) - raw[i] = (uint8_t)st_random(); - - - pipe_tile_raw_to_rgba(format, - raw, - w, h, - rgba, rgba_stride); - - if(format == PIPE_FORMAT_UYVY || format == PIPE_FORMAT_YUYV) { - for(y = 0; y < h; ++y) { - for(x = 0; x < w; ++x) { - for(ch = 0; ch < 4; ++ch) { + if (norm) { + for (y = 0; y < h; ++y) { + for (x = 0; x < w; ++x) { + for (ch = 0; ch < 4; ++ch) { + unsigned offset = y*rgba_stride + x*4 + ch; + rgba[offset] = (st_random() & 0xff) / (double)0xff; + } + } + } + + util_format_write_4f(format, + rgba, rgba_stride * sizeof(float), + raw, util_format_get_stride(format, w), + 0, 0, w, h); + + } else { + for (i = 0; i < blocksize; ++i) + raw[i] = (uint8_t)st_random(); + } + + util_format_read_4f(format, + rgba, rgba_stride * sizeof(float), + raw, util_format_get_stride(format, w), + 0, 0, w, h); + + if (format == PIPE_FORMAT_UYVY || format == PIPE_FORMAT_YUYV) { + for (y = 0; y < h; ++y) { + for (x = 0; x < w; ++x) { + for (ch = 0; ch < 4; ++ch) { unsigned offset = y*rgba_stride + x*4 + ch; rgba[offset] = CLAMP(rgba[offset], 0.0f, 1.0f); } @@ -505,7 +522,8 @@ void st_sample_pixel_block(enum pipe_format format, void *raw, float *rgba, unsigned rgba_stride, - unsigned w, unsigned h) + unsigned w, unsigned h, + boolean norm) { switch(format) { case PIPE_FORMAT_DXT1_RGB: @@ -516,7 +534,7 @@ st_sample_pixel_block(enum pipe_format format, break; default: - st_sample_generic_pixel_block(format, raw, rgba, rgba_stride, w, h); + st_sample_generic_pixel_block(format, raw, rgba, rgba_stride, w, h, norm); break; } } @@ -525,7 +543,8 @@ st_sample_pixel_block(enum pipe_format format, void st_sample_surface(struct pipe_context *pipe, struct st_surface *surface, - float *rgba) + float *rgba, + boolean norm) { struct pipe_texture *texture = surface->texture; unsigned width = u_minify(texture->width0, surface->level); @@ -564,7 +583,8 @@ st_sample_surface(struct pipe_context *pipe, rgba + y * blockheight * rgba_stride + x * blockwidth * 4, rgba_stride, MIN2(blockwidth, width - x*blockwidth), - MIN2(blockheight, height - y*blockheight)); + MIN2(blockheight, height - y*blockheight), + norm); } } diff --git a/src/gallium/state_trackers/python/st_sample.h b/src/gallium/state_trackers/python/st_sample.h index 6fb8417add8..2fdbb391f36 100644 --- a/src/gallium/state_trackers/python/st_sample.h +++ b/src/gallium/state_trackers/python/st_sample.h @@ -40,12 +40,14 @@ void st_sample_pixel_block(enum pipe_format format, void *raw, float *rgba, unsigned rgba_stride, - unsigned w, unsigned h); + unsigned w, unsigned h, + boolean norm); void st_sample_surface(struct pipe_context *pipe, struct st_surface *surface, - float *rgba); + float *rgba, + boolean norm); #endif /* ST_SAMPLE_H_ */