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 0 : const Compressor::Functions& _findFunctions( const unsigned name )
31 : {
32 0 : for( Compressors::const_iterator i = _functions->begin();
33 0 : i != _functions->end(); ++i )
34 : {
35 0 : const Compressor::Functions& functions = *i;
36 0 : if( functions.name == name )
37 0 : return functions;
38 : }
39 :
40 0 : assert( 0 ); // UNREACHABLE
41 : return _functions->front();
42 : }
43 : }
44 :
45 0 : Compressor::Compressor()
46 0 : : _nResults( 0 )
47 0 : {}
48 :
49 0 : Compressor::~Compressor()
50 : {
51 0 : for ( size_t i = 0; i < _results.size(); i++ )
52 0 : delete ( _results[i] );
53 :
54 0 : _results.clear();
55 0 : }
56 :
57 420 : 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 420 : , isCompatible( isCompatible_ )
69 420 : {}
70 :
71 420 : void Compressor::registerEngine( const Compressor::Functions& functions )
72 : {
73 420 : if( !_functions ) // resolve 'static initialization order fiasco'
74 14 : _functions = new Compressors;
75 420 : _functions->push_back( functions );
76 420 : }
77 :
78 : }
79 : }
80 :
81 5 : size_t EqCompressorGetNumCompressors()
82 : {
83 5 : return eq::plugin::_functions->size();
84 : }
85 :
86 150 : void EqCompressorGetInfo( const size_t n, EqCompressorInfo* const info )
87 : {
88 150 : assert( eq::plugin::_functions->size() > n );
89 150 : (*eq::plugin::_functions)[ n ].getInfo( info );
90 150 : }
91 :
92 0 : void* EqCompressorNewCompressor( const unsigned name )
93 : {
94 : const eq::plugin::Compressor::Functions& functions =
95 0 : eq::plugin::_findFunctions( name );
96 :
97 0 : 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 0 : void* EqCompressorNewDecompressor( const unsigned name )
106 : {
107 : const eq::plugin::Compressor::Functions& functions =
108 0 : eq::plugin::_findFunctions( name );
109 :
110 0 : return functions.newDecompressor( name );
111 : }
112 :
113 0 : void EqCompressorDeleteDecompressor( void* const decompressor )
114 : {
115 0 : delete reinterpret_cast< eq::plugin::Compressor* >( decompressor );
116 0 : }
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 0 : bool EqCompressorIsCompatible( const unsigned name,
175 : const GLEWContext* glewContext )
176 : {
177 : const eq::plugin::Compressor::Functions& functions =
178 0 : eq::plugin::_findFunctions( name );
179 :
180 0 : if ( functions.isCompatible == 0 )
181 : {
182 0 : assert( false );
183 : return false;
184 : }
185 :
186 0 : 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 0 : 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 0 : assert( ptr );
215 : eq::plugin::Compressor* compressor =
216 0 : reinterpret_cast< eq::plugin::Compressor* >( ptr );
217 : compressor->upload( glewContext, buffer, inDims, flags, outDims,
218 0 : destination );
219 0 : }
220 :
221 :
222 0 : 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 0 : assert( ptr );
230 : eq::plugin::Compressor* compressor =
231 0 : reinterpret_cast< eq::plugin::Compressor* >( ptr );
232 0 : compressor->startDownload( glewContext, inDims, source, flags );
233 0 : }
234 :
235 :
236 0 : 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 0 : assert( ptr );
245 : eq::plugin::Compressor* compressor =
246 0 : reinterpret_cast< eq::plugin::Compressor* >( ptr );
247 0 : compressor->finishDownload( glewContext, inDims, flags, outDims, out );
248 42 : }
|