00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "util/u_memory.h"
00029 #include "sp_context.h"
00030 #include "sp_headers.h"
00031 #include "sp_surface.h"
00032 #include "sp_quad.h"
00033 #include "sp_tile_cache.h"
00034
00035
00040 static void
00041 output_quad(struct quad_stage *qs, struct quad_header *quad)
00042 {
00043
00044 const int itx = quad->input.x0 % TILE_SIZE;
00045 const int ity = quad->input.y0 % TILE_SIZE;
00046
00047 struct softpipe_context *softpipe = qs->softpipe;
00048 uint cbuf;
00049
00050
00051 for (cbuf = 0; cbuf < softpipe->framebuffer.num_cbufs; cbuf++) {
00052 struct softpipe_cached_tile *tile
00053 = sp_get_cached_tile(softpipe,
00054 softpipe->cbuf_cache[cbuf],
00055 quad->input.x0, quad->input.y0);
00056 float (*quadColor)[4] = quad->output.color[cbuf];
00057 int i, j;
00058
00059
00060 for (j = 0; j < QUAD_SIZE; j++) {
00061 if (quad->inout.mask & (1 << j)) {
00062 int x = itx + (j & 1);
00063 int y = ity + (j >> 1);
00064 for (i = 0; i < 4; i++) {
00065 tile->data.color[y][x][i] = quadColor[i][j];
00066 }
00067 if (0) {
00068 debug_printf("sp write pixel %d,%d: %g, %g, %g\n",
00069 quad->input.x0 + x,
00070 quad->input.y0 + y,
00071 quadColor[0][j],
00072 quadColor[1][j],
00073 quadColor[2][j]);
00074 }
00075 }
00076 }
00077 }
00078 }
00079
00080
00081 static void output_begin(struct quad_stage *qs)
00082 {
00083 assert(qs->next == NULL);
00084 }
00085
00086
00087 static void output_destroy(struct quad_stage *qs)
00088 {
00089 FREE( qs );
00090 }
00091
00092
00093 struct quad_stage *sp_quad_output_stage( struct softpipe_context *softpipe )
00094 {
00095 struct quad_stage *stage = CALLOC_STRUCT(quad_stage);
00096
00097 stage->softpipe = softpipe;
00098 stage->begin = output_begin;
00099 stage->run = output_quad;
00100 stage->destroy = output_destroy;
00101
00102 return stage;
00103 }