void stw_pixelformat_init( void ) { struct pipe_screen *screen = stw_dev->screen; unsigned i, j, k, l; assert( !stw_dev->pixelformat_count ); assert( !stw_dev->pixelformat_extended_count ); for(i = 0; i < Elements(stw_pf_multisample); ++i) { unsigned samples = stw_pf_multisample[i]; /* FIXME: re-enabled MSAA when we can query it */ if(samples) continue; for(j = 0; j < Elements(stw_pf_color); ++j) { const struct stw_pf_color_info *color = &stw_pf_color[j]; if(!screen->is_format_supported(screen, color->format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET | PIPE_BIND_DISPLAY_TARGET, 0)) continue; for(k = 0; k < Elements(stw_pf_doublebuffer); ++k) { unsigned doublebuffer = stw_pf_doublebuffer[k]; for(l = 0; l < Elements(stw_pf_depth_stencil); ++l) { const struct stw_pf_depth_info *depth = &stw_pf_depth_stencil[l]; if(!screen->is_format_supported(screen, depth->format, PIPE_TEXTURE_2D, 0, PIPE_BIND_DEPTH_STENCIL, 0)) continue; stw_pixelformat_add( stw_dev, color, depth, 0, doublebuffer, samples ); stw_pixelformat_add( stw_dev, color, depth, 16, doublebuffer, samples ); } } } } assert( stw_dev->pixelformat_count <= stw_dev->pixelformat_extended_count ); assert( stw_dev->pixelformat_extended_count <= STW_MAX_PIXELFORMATS ); }
/** * Add the depth/stencil/accum/ms variants for a particular color format. */ static void add_color_format_variants(const struct stw_pf_color_info *color, boolean extended) { struct pipe_screen *screen = stw_dev->screen; unsigned ms, db, ds, acc; unsigned bind_flags = PIPE_BIND_RENDER_TARGET; if (!extended) { bind_flags |= PIPE_BIND_DISPLAY_TARGET; } if (!screen->is_format_supported(screen, color->format, PIPE_TEXTURE_2D, 0, bind_flags)) { return; } for (ms = 0; ms < Elements(stw_pf_multisample); ms++) { unsigned samples = stw_pf_multisample[ms]; /* FIXME: re-enabled MSAA when we can query it */ if (samples) continue; for (db = 0; db < Elements(stw_pf_doublebuffer); db++) { unsigned doublebuffer = stw_pf_doublebuffer[db]; for (ds = 0; ds < Elements(stw_pf_depth_stencil); ds++) { const struct stw_pf_depth_info *depth = &stw_pf_depth_stencil[ds]; if (!screen->is_format_supported(screen, depth->format, PIPE_TEXTURE_2D, 0, PIPE_BIND_DEPTH_STENCIL)) { continue; } for (acc = 0; acc < 2; acc++) { stw_pixelformat_add(stw_dev, extended, color, depth, acc * 16, doublebuffer, samples); } } } } }
/** * Add the depth/stencil/accum/ms variants for a list of color formats. */ static unsigned add_color_format_variants(const struct stw_pf_color_info *color_formats, unsigned num_color_formats, boolean extended) { struct pipe_screen *screen = stw_dev->screen; unsigned cfmt, ms, db, ds, acc; unsigned bind_flags = PIPE_BIND_RENDER_TARGET; unsigned num_added = 0; int force_samples = 0; /* Since GLUT for Windows doesn't support MSAA we have an env var * to force all pixel formats to have a particular number of samples. */ { const char *samples= getenv("SVGA_FORCE_MSAA"); if (samples) force_samples = atoi(samples); } if (!extended) { bind_flags |= PIPE_BIND_DISPLAY_TARGET; } for (ms = 0; ms < ARRAY_SIZE(stw_pf_multisample); ms++) { unsigned samples = stw_pf_multisample[ms]; if (force_samples && samples != force_samples) continue; for (cfmt = 0; cfmt < num_color_formats; cfmt++) { if (!screen->is_format_supported(screen, color_formats[cfmt].format, PIPE_TEXTURE_2D, samples, bind_flags)) { continue; } for (db = 0; db < ARRAY_SIZE(stw_pf_doublebuffer); db++) { unsigned doublebuffer = stw_pf_doublebuffer[db]; for (ds = 0; ds < ARRAY_SIZE(stw_pf_depth_stencil); ds++) { const struct stw_pf_depth_info *depth = &stw_pf_depth_stencil[ds]; if (!screen->is_format_supported(screen, depth->format, PIPE_TEXTURE_2D, samples, PIPE_BIND_DEPTH_STENCIL)) { continue; } for (acc = 0; acc < 2; acc++) { stw_pixelformat_add(stw_dev, extended, &color_formats[cfmt], depth, acc * 16, doublebuffer, samples); num_added++; } } } } } return num_added; }