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 : }
|