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 );
}
示例#2
0
/**
 * 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);
            }
         }
      }
   }
}
示例#3
0
/**
 * 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;
}