LCOV - code coverage report
Current view: top level - eq/client/compressor - compressor.cpp (source / functions) Hit Total Coverage
Test: lcov2.info Lines: 55 94 58.5 %
Date: 2014-06-18 Functions: 16 23 69.6 %

          Line data    Source code
       1             : 
       2             : /* Copyright (c) 2009-2014, Cedric Stalder <cedric.stalder@gmail.com>
       3             :  *               2009-2012, Stefan Eilemann <eile@equalizergraphics.com>
       4             :  *
       5             :  * This library is free software; you can redistribute it and/or modify it under
       6             :  * the terms of the GNU Lesser General Public License version 2.1 as published
       7             :  * by the Free Software Foundation.
       8             :  *
       9             :  * This library is distributed in the hope that it will be useful, but WITHOUT
      10             :  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
      11             :  * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
      12             :  * details.
      13             :  *
      14             :  * You should have received a copy of the GNU Lesser General Public License
      15             :  * along with this library; if not, write to the Free Software Foundation, Inc.,
      16             :  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
      17             :  */
      18             : 
      19             : #include "compressor.h"
      20             : 
      21             : namespace eq
      22             : {
      23             : namespace plugin
      24             : {
      25             : namespace
      26             : {
      27             :     typedef std::vector< Compressor::Functions > Compressors;
      28             :     static Compressors* _functions;
      29             : 
      30          24 :     const Compressor::Functions& _findFunctions( const unsigned name )
      31             :     {
      32         162 :         for( Compressors::const_iterator i = _functions->begin();
      33         108 :              i != _functions->end(); ++i )
      34             :         {
      35          54 :             const Compressor::Functions& functions = *i;
      36          54 :             if( functions.name == name )
      37          24 :                 return functions;
      38             :         }
      39             : 
      40           0 :         assert( 0 ); // UNREACHABLE
      41             :         return _functions->front();
      42             :     }
      43             : }
      44             : 
      45           5 : Compressor::Compressor()
      46           5 :     : _nResults( 0 )
      47           5 : {}
      48             : 
      49          10 : Compressor::~Compressor()
      50             : {
      51           5 :     for ( size_t i = 0; i < _results.size(); i++ )
      52           0 :         delete ( _results[i] );
      53             : 
      54           5 :     _results.clear();
      55           5 : }
      56             : 
      57         360 : Compressor::Functions::Functions( const unsigned name_,
      58             :                                   CompressorGetInfo_t getInfo_,
      59             :                                   NewCompressor_t newCompressor_,
      60             :                                   NewCompressor_t newDecompressor_,
      61             :                                   Decompress_t decompress_,
      62             :                                   IsCompatible_t isCompatible_ )
      63             :         : name( name_ )
      64             :         , getInfo( getInfo_ )
      65             :         , newCompressor( newCompressor_ )
      66             :         , newDecompressor( newDecompressor_ )
      67             :         , decompress( decompress_ )
      68         360 :         , isCompatible( isCompatible_ )
      69         360 : {}
      70             : 
      71         360 : void Compressor::registerEngine( const Compressor::Functions& functions )
      72             : {
      73         360 :     if( !_functions ) // resolve 'static initialization order fiasco'
      74          12 :         _functions = new Compressors;
      75         360 :     _functions->push_back( functions );
      76         360 : }
      77             : 
      78             : }
      79             : }
      80             : 
      81           9 : size_t EqCompressorGetNumCompressors()
      82             : {
      83           9 :     return eq::plugin::_functions->size();
      84             : }
      85             : 
      86         270 : void EqCompressorGetInfo( const size_t n, EqCompressorInfo* const info )
      87             : {
      88         270 :     assert( eq::plugin::_functions->size() > n );
      89         270 :     (*eq::plugin::_functions)[ n ].getInfo( info );
      90         270 : }
      91             : 
      92           2 : void* EqCompressorNewCompressor( const unsigned name )
      93             : {
      94             :     const eq::plugin::Compressor::Functions& functions =
      95           2 :         eq::plugin::_findFunctions( name );
      96             : 
      97           2 :     return functions.newCompressor( name );
      98             : }
      99             : 
     100           0 : void EqCompressorDeleteCompressor( void* const compressor )
     101             : {
     102           0 :     delete reinterpret_cast< eq::plugin::Compressor* >( compressor );
     103           0 : }
     104             : 
     105           3 : void* EqCompressorNewDecompressor( const unsigned name )
     106             : {
     107             :     const eq::plugin::Compressor::Functions& functions =
     108           3 :         eq::plugin::_findFunctions( name );
     109             : 
     110           3 :     return functions.newDecompressor( name );
     111             : }
     112             : 
     113           5 : void EqCompressorDeleteDecompressor( void* const decompressor )
     114             : {
     115           5 :     delete reinterpret_cast< eq::plugin::Compressor* >( decompressor );
     116           5 : }
     117             : 
     118           0 : void EqCompressorCompress( void* const ptr, const unsigned /*name*/,
     119             :                            void* const in, const eq_uint64_t* inDims,
     120             :                            const eq_uint64_t flags )
     121             : {
     122           0 :     assert( ptr );
     123           0 :     const bool useAlpha = !(flags & EQ_COMPRESSOR_IGNORE_ALPHA);
     124           0 :     const eq_uint64_t nPixels = (flags & EQ_COMPRESSOR_DATA_1D) ?
     125           0 :                                   inDims[1]: inDims[1] * inDims[3];
     126             : 
     127             :     eq::plugin::Compressor* compressor =
     128           0 :         reinterpret_cast< eq::plugin::Compressor* >( ptr );
     129           0 :     compressor->compress( in, nPixels, useAlpha );
     130           0 : }
     131             : 
     132           0 : unsigned EqCompressorGetNumResults( void* const ptr,
     133             :                                     const unsigned /*name*/ )
     134             : {
     135           0 :     assert( ptr );
     136             :     eq::plugin::Compressor* compressor =
     137           0 :         reinterpret_cast< eq::plugin::Compressor* >( ptr );
     138           0 :     return compressor->getNResults();
     139             : }
     140             : 
     141           0 : void EqCompressorGetResult( void* const ptr, const unsigned /*name*/,
     142             :                             const unsigned i, void** const out,
     143             :                             eq_uint64_t* const outSize )
     144             : {
     145           0 :     assert( ptr );
     146             :     eq::plugin::Compressor* compressor =
     147           0 :         reinterpret_cast< eq::plugin::Compressor* >( ptr );
     148           0 :     eq::plugin::Compressor::Result* result = compressor->getResults()[ i ];
     149             : 
     150           0 :     *out = result->getData();
     151           0 :     *outSize = result->getSize();
     152           0 :     assert( result->getMaxSize() >= result->getSize( ));
     153           0 : }
     154             : 
     155             : 
     156           0 : void EqCompressorDecompress( void* const decompressor LB_UNUSED,
     157             :                              const unsigned name,
     158             :                              const void* const* in,
     159             :                              const eq_uint64_t* const inSizes,
     160             :                              const unsigned nInputs,
     161             :                              void* const out, eq_uint64_t* const outDims,
     162             :                              const eq_uint64_t flags )
     163             : {
     164           0 :     assert( !decompressor );
     165           0 :     const bool useAlpha = !(flags & EQ_COMPRESSOR_IGNORE_ALPHA);
     166           0 :     const eq_uint64_t nPixels = ( flags & EQ_COMPRESSOR_DATA_1D) ?
     167           0 :                            outDims[1] : outDims[1] * outDims[3];
     168             : 
     169             :     const eq::plugin::Compressor::Functions& functions =
     170           0 :         eq::plugin::_findFunctions( name );
     171           0 :     functions.decompress( in, inSizes, nInputs, out, nPixels, useAlpha );
     172           0 : }
     173             : 
     174          19 : bool EqCompressorIsCompatible( const unsigned     name,
     175             :                                const GLEWContext* glewContext )
     176             : {
     177             :     const eq::plugin::Compressor::Functions& functions =
     178          19 :         eq::plugin::_findFunctions( name );
     179             : 
     180          19 :     if ( functions.isCompatible == 0 )
     181             :     {
     182           0 :         assert( false );
     183             :         return false;
     184             :     }
     185             : 
     186          19 :     return functions.isCompatible( glewContext );
     187             : }
     188             : 
     189           0 : void EqCompressorDownload( void* const        ptr,
     190             :                            const unsigned     /*name*/,
     191             :                            const GLEWContext* glewContext,
     192             :                            const eq_uint64_t  inDims[4],
     193             :                            const unsigned     source,
     194             :                            const eq_uint64_t  flags,
     195             :                            eq_uint64_t        outDims[4],
     196             :                            void**             out )
     197             : {
     198           0 :     assert( ptr );
     199             :     eq::plugin::Compressor* compressor =
     200           0 :         reinterpret_cast< eq::plugin::Compressor* >( ptr );
     201           0 :     compressor->download( glewContext, inDims, source, flags, outDims, out );
     202           0 : }
     203             : 
     204             : 
     205           2 : void EqCompressorUpload( void* const        ptr,
     206             :                          const unsigned     /*name*/,
     207             :                          const GLEWContext* glewContext,
     208             :                          const void*        buffer,
     209             :                          const eq_uint64_t  inDims[4],
     210             :                          const eq_uint64_t  flags,
     211             :                          const eq_uint64_t  outDims[4],
     212             :                          const unsigned     destination )
     213             : {
     214           2 :     assert( ptr );
     215             :     eq::plugin::Compressor* compressor =
     216           2 :         reinterpret_cast< eq::plugin::Compressor* >( ptr );
     217             :     compressor->upload( glewContext, buffer, inDims, flags, outDims,
     218           2 :                         destination );
     219           2 : }
     220             : 
     221             : 
     222           3 : void EqCompressorStartDownload( void* const        ptr,
     223             :                                 const unsigned     /*name*/,
     224             :                                 const GLEWContext* glewContext,
     225             :                                 const eq_uint64_t  inDims[4],
     226             :                                 const unsigned     source,
     227             :                                 const eq_uint64_t  flags )
     228             : {
     229           3 :     assert( ptr );
     230             :     eq::plugin::Compressor* compressor =
     231           3 :         reinterpret_cast< eq::plugin::Compressor* >( ptr );
     232           3 :     compressor->startDownload( glewContext, inDims, source, flags );
     233           3 : }
     234             : 
     235             : 
     236           3 : void EqCompressorFinishDownload( void* const        ptr,
     237             :                                  const unsigned     /*name*/,
     238             :                                  const GLEWContext* glewContext,
     239             :                                  const eq_uint64_t  inDims[4],
     240             :                                  const eq_uint64_t  flags,
     241             :                                  eq_uint64_t        outDims[4],
     242             :                                  void**             out )
     243             : {
     244           3 :     assert( ptr );
     245             :     eq::plugin::Compressor* compressor =
     246           3 :         reinterpret_cast< eq::plugin::Compressor* >( ptr );
     247           3 :     compressor->finishDownload( glewContext, inDims, flags, outDims, out );
     248          39 : }

Generated by: LCOV version 1.10