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
00029
00030 #include "pipe/p_inlines.h"
00031
00032 #include "sp_context.h"
00033 #include "sp_state.h"
00034 #include "sp_surface.h"
00035 #include "sp_tile_cache.h"
00036
00037 #include "draw/draw_context.h"
00038
00039
00046 void
00047 softpipe_set_framebuffer_state(struct pipe_context *pipe,
00048 const struct pipe_framebuffer_state *fb)
00049 {
00050 struct softpipe_context *sp = softpipe_context(pipe);
00051 uint i;
00052
00053 for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
00054
00055 if (sp->framebuffer.cbufs[i] != fb->cbufs[i]) {
00056
00057 sp_flush_tile_cache(sp, sp->cbuf_cache[i]);
00058
00059
00060 sp->framebuffer.cbufs[i] = fb->cbufs[i];
00061
00062
00063 sp_tile_cache_set_surface(sp->cbuf_cache[i], fb->cbufs[i]);
00064 }
00065 }
00066
00067 sp->framebuffer.num_cbufs = fb->num_cbufs;
00068
00069
00070 if (sp->framebuffer.zsbuf != fb->zsbuf) {
00071
00072 sp_flush_tile_cache(sp, sp->zsbuf_cache);
00073
00074
00075 sp->framebuffer.zsbuf = fb->zsbuf;
00076
00077
00078 sp_tile_cache_set_surface(sp->zsbuf_cache, fb->zsbuf);
00079 }
00080
00081 #if 0
00082
00083
00084
00085 if (sp->framebuffer.sbuf != fb->sbuf) {
00086
00087 sp_flush_tile_cache(sp, sp->sbuf_cache_sep);
00088
00089
00090 sp->framebuffer.sbuf = fb->sbuf;
00091
00092
00093 if (fb->sbuf != fb->zbuf) {
00094
00095 sp->sbuf_cache = sp->sbuf_cache_sep;
00096 sp_tile_cache_set_surface(sp->sbuf_cache, fb->sbuf);
00097 }
00098 else {
00099
00100 sp->sbuf_cache = sp->zbuf_cache;
00101 sp_tile_cache_set_surface(sp->sbuf_cache, fb->sbuf);
00102 }
00103 }
00104 #endif
00105
00106
00107 {
00108 int depth_bits;
00109 double mrd;
00110 if (sp->framebuffer.zsbuf) {
00111 depth_bits = pf_get_component_bits(sp->framebuffer.zsbuf->format,
00112 PIPE_FORMAT_COMP_Z);
00113 }
00114 else {
00115 depth_bits = 0;
00116 }
00117 if (depth_bits > 16) {
00118 mrd = 0.0000001;
00119 }
00120 else {
00121 mrd = 0.00002;
00122 }
00123 draw_set_mrd(sp->draw, mrd);
00124 }
00125
00126 sp->framebuffer.width = fb->width;
00127 sp->framebuffer.height = fb->height;
00128
00129 sp->dirty |= SP_NEW_FRAMEBUFFER;
00130 }