UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
dxt_decoder.c File Reference
#include "dxt_common.h"
#include "dxt_decoder.h"
#include "dxt_util.h"
#include "dxt_glsl.h"
Include dependency graph for dxt_decoder.c:

Go to the source code of this file.

Classes

struct  dxt_decoder
 

Functions

int dxt_decoder_buffer_allocate (struct dxt_decoder *decoder, unsigned char **image, int *image_size)
 
int dxt_decoder_buffer_free (unsigned char *image)
 
struct dxt_decoder * dxt_decoder_create (enum dxt_type type, int width, int height, enum dxt_format out_format, int legacy)
 
int dxt_decoder_decompress (struct dxt_decoder *decoder, unsigned char *image_compressed, DXT_IMAGE_TYPE *image)
 
int dxt_decoder_destroy (struct dxt_decoder *decoder)
 

Variables

static GLfloat points []
 

Function Documentation

◆ dxt_decoder_buffer_allocate()

int dxt_decoder_buffer_allocate ( struct dxt_decoder * decoder,
unsigned char ** image,
int * image_size )

Documented at declaration

Definition at line 340 of file dxt_decoder.c.

341{
342 *image_size = decoder->width * decoder->height * 4 * sizeof(DXT_IMAGE_TYPE);
343 *image = (DXT_IMAGE_TYPE*)malloc(*image_size);
344 if ( *image == NULL )
345 return -1;
346 return 0;
347}
#define DXT_IMAGE_TYPE
Definition dxt_common.h:71

References DXT_IMAGE_TYPE, dxt_decoder::height, and dxt_decoder::width.

Referenced by perform_decode().

◆ dxt_decoder_buffer_free()

int dxt_decoder_buffer_free ( unsigned char * image)

Documented at declaration

Definition at line 527 of file dxt_decoder.c.

528{
529 free(image);
530 return 0;
531}

Referenced by perform_decode().

◆ dxt_decoder_create()

struct dxt_decoder * dxt_decoder_create ( enum dxt_type type,
int width,
int height,
enum dxt_format out_format,
int legacy )

Documented at declaration

Todo
Free other stuff as well

Definition at line 106 of file dxt_decoder.c.

107{
108 struct dxt_decoder* decoder = (struct dxt_decoder*)malloc(sizeof(struct dxt_decoder));
109
110#ifndef HAVE_MACOSX
111 glewExperimental = GL_TRUE;
112 GLenum err = glewInit();
113 assert(err == GLEW_OK);
114#endif
115
117 assert(out_format == DXT_FORMAT_RGBA ||
118 (out_format == DXT_FORMAT_YUV422 && width % 2 == 0)); /* width % 2 for YUV422 */
119
120 if ( decoder == NULL )
121 return NULL;
122 decoder->type = type;
123 decoder->width = width;
124 decoder->height = height;
125 decoder->out_format = out_format;
126 decoder->legacy = legacy;
127 //glutReshapeWindow(1, 1);
128
129 if(legacy) {
130 glEnable(GL_TEXTURE_2D);
131 }
132
133 // Create empty texture
134 glGenTextures(1, &decoder->compressed_tex);
135 glBindTexture(GL_TEXTURE_2D, decoder->compressed_tex);
136 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
137 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
138 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
139 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
140
141 GLenum internalformat;
142 size_t size;
143
144 if ( decoder->type == DXT_TYPE_DXT5_YCOCG ) {
145 internalformat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
146 size = ((decoder->width + 3) / 4 * 4) * ((decoder->height + 3) / 4 * 4);
147 } else {
148 internalformat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
149 size = ((decoder->width + 3) / 4 * 4) * ((decoder->height + 3) / 4 * 4) / 2;
150 }
151
152 GLvoid *tmp_data = malloc(size); // data pointer to glCompressedTexImage2D shouldn't be 0
153 glCompressedTexImage2DARB(GL_TEXTURE_2D, 0, internalformat, decoder->width, decoder->height, 0,
154 size, tmp_data);
155 free(tmp_data);
156
157 // Create fbo
158 glGenFramebuffers(1, &decoder->fbo_rgba);
159 glBindFramebuffer(GL_FRAMEBUFFER, decoder->fbo_rgba);
160
161 glGenTextures(1, &decoder->uncompressed_rgba_tex);
162 glBindTexture(GL_TEXTURE_2D, decoder->uncompressed_rgba_tex);
163 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
164 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
165 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
166 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
167 glTexImage2D(GL_TEXTURE_2D, 0 , DXT_IMAGE_GL_FORMAT, decoder->width, decoder->height, 0, GL_RGBA, DXT_IMAGE_GL_TYPE, 0);
168 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, decoder->uncompressed_rgba_tex, 0);
169 glBindFramebuffer(GL_FRAMEBUFFER, 0);
170
171 // Create program [display] and its shader
172 decoder->program_display = glCreateProgram();
173 // Create shader from file
174 decoder->shader_fragment_display = 0;
175 switch(decoder->type)
176 {
178 if(legacy)
179 decoder->shader_fragment_display = dxt_shader_create_from_source(fp_display_dxt5ycocg_legacy, GL_FRAGMENT_SHADER);
180 else
182 break;
183 case DXT_TYPE_DXT1:
184 if(legacy)
185 decoder->shader_fragment_display = dxt_shader_create_from_source(fp_display_legacy, GL_FRAGMENT_SHADER);
186 else
187 decoder->shader_fragment_display = dxt_shader_create_from_source(fp_display, GL_FRAGMENT_SHADER);
188 break;
190 if(legacy)
191 decoder->shader_fragment_display = dxt_shader_create_from_source(fp_display_dxt1_yuv_legacy, GL_FRAGMENT_SHADER);
192 else
194 break;
195 }
196 if(legacy) {
197 decoder->shader_vertex_display = dxt_shader_create_from_source(vp_compress_legacy, GL_VERTEX_SHADER);
198 } else {
199 decoder->shader_vertex_display = dxt_shader_create_from_source(vp_compress, GL_VERTEX_SHADER);
200 }
201 if ( decoder->shader_fragment_display == 0 || decoder->shader_vertex_display == 0 ) {
203 free(decoder);
204 return NULL;
205 }
206 // Attach shader to program and link the program
207 glAttachShader(decoder->program_display, decoder->shader_fragment_display);
208 glAttachShader(decoder->program_display, decoder->shader_vertex_display);
209 glLinkProgram(decoder->program_display);
210
212 glGenTextures(1, &decoder->uncompressed_yuv422_tex);
213 glBindTexture(GL_TEXTURE_2D, decoder->uncompressed_yuv422_tex);
214 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
215 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
216 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
217 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
218 glTexImage2D(GL_TEXTURE_2D, 0 , GL_RGBA, decoder->width / 2, decoder->height, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
219
220 glGenFramebuffers(1, &decoder->fbo_yuv422);
221
222 if(legacy) {
224 decoder->shader_vertex_rgba_to_yuv422 = dxt_shader_create_from_source(vp_compress_legacy, GL_VERTEX_SHADER);
225 } else {
226 decoder->shader_fragment_rgba_to_yuv422 = dxt_shader_create_from_source(fp_display_rgba_to_yuv422, GL_FRAGMENT_SHADER);
227 decoder->shader_vertex_rgba_to_yuv422 = dxt_shader_create_from_source(vp_compress, GL_VERTEX_SHADER);
228 }
229
230 decoder->program_rgba_to_yuv422 = glCreateProgram();
231 glAttachShader(decoder->program_rgba_to_yuv422, decoder->shader_fragment_rgba_to_yuv422);
232 glAttachShader(decoder->program_rgba_to_yuv422, decoder->shader_vertex_rgba_to_yuv422);
233 glLinkProgram(decoder->program_rgba_to_yuv422);
234
235 glUseProgram(decoder->program_rgba_to_yuv422);
236 glUniform1i(glGetUniformLocation(decoder->program_rgba_to_yuv422, "image"), 0);
237 glUniform1f(glGetUniformLocation(decoder->program_rgba_to_yuv422, "imageWidth"),
238 (GLfloat) decoder->width);
239
240 if(!decoder->legacy) {
241#if ! defined __APPLE__ || defined __MAC_10_11
242 GLint g_vertexLocation;
243 GLuint g_vertices;
244
245 // ToDo:
246 glGenVertexArrays(1, &decoder->g_vao_422);
247
248 // ToDo:
249 glBindVertexArray(decoder->g_vao_422);
250
251 // http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml
252 g_vertexLocation = glGetAttribLocation(decoder->program_rgba_to_yuv422, "position");
253
254 // http://www.opengl.org/sdk/docs/man/xhtml/glGenBuffers.xml
255 glGenBuffers(1, &g_vertices);
256
257 // http://www.opengl.org/sdk/docs/man/xhtml/glBindBuffer.xml
258 glBindBuffer(GL_ARRAY_BUFFER, g_vertices);
259
260 // http://www.opengl.org/sdk/docs/man/xhtml/glBufferData.xml
261 //glBufferData(GL_ARRAY_BUFFER, 3 * 4 * sizeof(GLfloat), (GLfloat*) points, GL_STATIC_DRAW);
262 glBufferData(GL_ARRAY_BUFFER, 8 * 4 * sizeof(GLfloat), (GLfloat*) points, GL_STATIC_DRAW);
263
264 // http://www.opengl.org/sdk/docs/man/xhtml/glUseProgram.xml
265 glUseProgram(decoder->program_rgba_to_yuv422);
266
267 // http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml
268 glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
269
270 // http://www.opengl.org/sdk/docs/man/xhtml/glEnableVertexAttribArray.xml
271 glEnableVertexAttribArray(g_vertexLocation);
272
273 glBindFragDataLocation(decoder->program_rgba_to_yuv422, 0, "colorOut");
274#endif
275 }
276
277 glUseProgram(0);
278 }
279 if(!decoder->legacy) {
280#if ! defined __APPLE__ || defined __MAC_10_11
281 GLint g_vertexLocation;
282 GLuint g_vertices;
283
284 // ToDo:
285 glGenVertexArrays(1, &decoder->g_vao);
286
287 // ToDo:
288 glBindVertexArray(decoder->g_vao);
289
290 // http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml
291 g_vertexLocation = glGetAttribLocation(decoder->program_display, "position");
292
293 // http://www.opengl.org/sdk/docs/man/xhtml/glGenBuffers.xml
294 glGenBuffers(1, &g_vertices);
295
296 // http://www.opengl.org/sdk/docs/man/xhtml/glBindBuffer.xml
297 glBindBuffer(GL_ARRAY_BUFFER, g_vertices);
298
299 // http://www.opengl.org/sdk/docs/man/xhtml/glBufferData.xml
300 //glBufferData(GL_ARRAY_BUFFER, 3 * 4 * sizeof(GLfloat), (GLfloat*) points, GL_STATIC_DRAW);
301 glBufferData(GL_ARRAY_BUFFER, 8 * 4 * sizeof(GLfloat), (GLfloat*) points, GL_STATIC_DRAW);
302
303 // http://www.opengl.org/sdk/docs/man/xhtml/glUseProgram.xml
304 glUseProgram(decoder->program_display);
305
306 // http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml
307 glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
308
309 // http://www.opengl.org/sdk/docs/man/xhtml/glEnableVertexAttribArray.xml
310 glEnableVertexAttribArray(g_vertexLocation);
311
312 glBindFragDataLocation(decoder->program_display, 0, "colorOut");
313
314 glUseProgram(0);
315#endif
316
317
318#ifdef USE_PBO_DXT_DECODER
319 glGenBuffersARB(1, &decoder->pbo_in); //Allocate PBO
320 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, decoder->pbo_in);
321 glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB,
322 ((width + 3) / 4 * 4) * ((height + 3) / 4 * 4) / (decoder->type == DXT_TYPE_DXT5_YCOCG ? 1 : 2),
323 0,
324 GL_STREAM_DRAW_ARB);
325 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
326
327 glGenBuffersARB(1, &decoder->pbo_out); //Allocate PBO
328 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
329 glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, ((width + 3) / 4 * 4) * ((height + 3) / 4 * 4) * (out_format == DXT_FORMAT_YUV422 ? 2 : 4), 0, GL_STREAM_READ_ARB);
330 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
331#endif
332
333 }
334
335 return decoder;
336}
#define DXT_IMAGE_GL_TYPE
Definition dxt_common.h:72
#define DXT_IMAGE_GL_FORMAT
Definition dxt_common.h:73
@ DXT_FORMAT_RGBA
Definition dxt_common.h:80
@ DXT_FORMAT_YUV422
Definition dxt_common.h:82
@ DXT_TYPE_DXT1_YUV
Definition dxt_common.h:90
@ DXT_TYPE_DXT1
Definition dxt_common.h:89
@ DXT_TYPE_DXT5_YCOCG
Definition dxt_common.h:91
static GLfloat points[]
Definition dxt_decoder.c:50
GLuint dxt_shader_create_from_source(const char *source, GLenum type)
Definition dxt_util.c:32
static const char * fp_display_dxt1_yuv
Definition gl.cpp:283
static const char fp_display_dxt5ycocg[]
Definition gl.cpp:310
Option::OptType type
Definition settings.cpp:194
GLuint shader_vertex_rgba_to_yuv422
Definition dxt_decoder.c:88
GLuint uncompressed_yuv422_tex
Definition dxt_decoder.c:75
GLuint uncompressed_rgba_tex
Definition dxt_decoder.c:74
GLuint fbo_yuv422
Definition dxt_decoder.c:79
unsigned int legacy
GLuint shader_vertex_display
Definition dxt_decoder.c:84
GLuint program_display
Definition dxt_decoder.c:82
GLuint g_vao_422
Definition dxt_decoder.c:94
GLuint shader_fragment_display
Definition dxt_decoder.c:83
enum dxt_type type
Definition dxt_decoder.c:63
GLuint fbo_rgba
Definition dxt_decoder.c:78
GLuint shader_fragment_rgba_to_yuv422
Definition dxt_decoder.c:87
enum dxt_format out_format
Definition dxt_decoder.c:64
GLuint g_vao
Definition dxt_decoder.c:93
GLuint compressed_tex
Definition dxt_decoder.c:73
GLuint program_rgba_to_yuv422
Definition dxt_decoder.c:86
static const char fp_display_rgba_to_yuv422_legacy[]
Definition syphon.m:76

References dxt_decoder::compressed_tex, DXT_FORMAT_RGBA, DXT_FORMAT_YUV422, DXT_IMAGE_GL_FORMAT, DXT_IMAGE_GL_TYPE, dxt_shader_create_from_source(), DXT_TYPE_DXT1, DXT_TYPE_DXT1_YUV, DXT_TYPE_DXT5_YCOCG, dxt_decoder::fbo_rgba, dxt_decoder::fbo_yuv422, fp_display_dxt1_yuv, fp_display_dxt5ycocg, fp_display_rgba_to_yuv422_legacy, dxt_decoder::g_vao, dxt_decoder::g_vao_422, dxt_decoder::height, dxt_decoder::legacy, dxt_decoder::out_format, points, dxt_decoder::program_display, dxt_decoder::program_rgba_to_yuv422, dxt_decoder::shader_fragment_display, dxt_decoder::shader_fragment_rgba_to_yuv422, dxt_decoder::shader_vertex_display, dxt_decoder::shader_vertex_rgba_to_yuv422, dxt_decoder::type, type, dxt_decoder::uncompressed_rgba_tex, dxt_decoder::uncompressed_yuv422_tex, and dxt_decoder::width.

Referenced by configure_with(), and perform_decode().

Here is the call graph for this function:

◆ dxt_decoder_decompress()

int dxt_decoder_decompress ( struct dxt_decoder * decoder,
unsigned char * image_compressed,
DXT_IMAGE_TYPE * image )

Documented at declaration

Definition at line 351 of file dxt_decoder.c.

352{
353#ifdef USE_PBO_DXT_DECODER
354 GLubyte *ptr;
355#endif
356
357#ifdef RTDXT_DEBUG
358 TIMER_INIT();
359
360 TIMER_START();
361#endif
362 glBindTexture(GL_TEXTURE_2D, decoder->compressed_tex);
363 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
364 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
365 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
366 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
367
368 int data_size = ((decoder->width + 3) / 4 * 4) * ((decoder->height + 3) / 4 * 4) /
369 (decoder->type == DXT_TYPE_DXT5_YCOCG ? 1 : 2);
370#ifdef USE_PBO_DXT_DECODER
371 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, decoder->pbo_in); // current pbo
372 glCompressedTexSubImage2DARB (GL_TEXTURE_2D, 0, 0, 0,
373 (decoder->width + 3) / 4 * 4,
374 (decoder->height + 3) / 4 * 4,
375 decoder->type == DXT_TYPE_DXT5_YCOCG ? GL_COMPRESSED_RGBA_S3TC_DXT5_EXT : GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
376 data_size,
377 0);
378 glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, data_size, 0, GL_STREAM_DRAW_ARB);
379 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB);
380 if(ptr)
381 {
382 // update data directly on the mapped buffer
383 memcpy(ptr, image_compressed, data_size);
384 glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); // release pointer to mapping buffer
385 }
386#else
387 glCompressedTexSubImage2DARB (GL_TEXTURE_2D, 0, 0, 0,
388 (decoder->width + 3) / 4 * 4,
389 (decoder->height + 3) / 4 * 4,
390 decoder->type == DXT_TYPE_DXT5_YCOCG ? GL_COMPRESSED_RGBA_S3TC_DXT5_EXT : GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
391 data_size,
392 image_compressed);
393#endif
394
395
396#ifdef RTDXT_DEBUG
397 glFinish();
398 TIMER_STOP_PRINT("Texture Load: ");
399
400 TIMER_START();
401#endif
402
403 // Render to framebuffer
404 glBindFramebuffer(GL_FRAMEBUFFER, decoder->fbo_rgba);
405
406 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
407 glViewport(0, 0, decoder->width, decoder->height);
408
409 glUseProgram(decoder->program_display);
410
411 glBindTexture(GL_TEXTURE_2D, decoder->compressed_tex);
412
413 if(decoder->legacy) {
414 glBegin(GL_QUADS);
415 glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, -1.0);
416 glTexCoord2f(1.0, 0.0); glVertex2f(1.0, -1.0);
417 glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
418 glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0);
419 glEnd();
420 } else {
421#if ! defined __APPLE__ || defined __MAC_10_11
422 glBindVertexArray(decoder->g_vao);
423 glDrawArrays(GL_TRIANGLES, 0, 6);
424 glBindVertexArray(0);
425#endif
426 }
427
428 glUseProgram(0);
429#ifdef RTDXT_DEBUG
430 glFinish();
431 TIMER_STOP_PRINT("Texture Decompress:");
432
433 TIMER_START();
434#endif
435 if(decoder->out_format != DXT_FORMAT_YUV422) { /* so RGBA */
436 // Disable framebuffer
437
438#ifdef USE_PBO_DXT_DECODER
439 // glReadPixels() should return immediately.
440 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
441 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
442 glReadPixels(0, 0, decoder->width, decoder->height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
443
444 // map the PBO to process its data by CPU
445 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
446 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
447 GL_READ_ONLY_ARB);
448 if(ptr)
449 {
450 memcpy(image, ptr, decoder->width * decoder->height * 4);
451 glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
452 }
453
454 // back to conventional pixel operation
455 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
456#else
457 glReadPixels(0, 0, decoder->width, decoder->height, GL_RGBA, DXT_IMAGE_GL_TYPE, image);
458#endif
459
460 glBindFramebuffer(GL_FRAMEBUFFER, 0);
461 } else {
462
463 glBindFramebuffer(GL_FRAMEBUFFER, decoder->fbo_yuv422);
464 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, decoder->uncompressed_yuv422_tex, 0);
465
466 glBindTexture(GL_TEXTURE_2D, decoder->uncompressed_rgba_tex); /* to texturing unit 0 */
467
468 glPushAttrib(GL_VIEWPORT_BIT);
469 glViewport( 0, 0, decoder->width / 2, decoder->height);
470
471 glUseProgram(decoder->program_rgba_to_yuv422);
472
473 if(decoder->legacy) {
474 glBegin(GL_QUADS);
475 glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, -1.0);
476 glTexCoord2f(1.0, 0.0); glVertex2f(1.0, -1.0);
477 glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
478 glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0);
479 glEnd();
480 } else {
481#if ! defined __APPLE__ || defined __MAC_10_11
482 glBindVertexArray(decoder->g_vao_422);
483 glDrawArrays(GL_TRIANGLES, 0, 6);
484 glBindVertexArray(0);
485#endif
486 }
487
488 glPopAttrib();
489
490#ifdef USE_PBO_DXT_DECODER
491 // glReadPixels() should return immediately.
492 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
493 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
494 glReadPixels(0, 0, decoder->width / 2, decoder->height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
495
496 // map the PBO to process its data by CPU
497 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
498 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
499 GL_READ_ONLY_ARB);
500 if(ptr)
501 {
502 memcpy(image, ptr, decoder->width * decoder->height * (decoder->out_format == DXT_FORMAT_YUV422 ? 2 : 4));
503 glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
504 }
505
506 // back to conventional pixel operation
507 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
508#else
509 glReadPixels(0, 0, decoder->width / 2, decoder->height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, image);
510#endif
511
512 //glReadPixels(0, 0, decoder->width / 2, decoder->height, GL_RGBA, DXT_IMAGE_GL_TYPE, image);
513 glBindFramebuffer(GL_FRAMEBUFFER, 0);
514 glUseProgram(0);
515 }
516
517#ifdef RTDXT_DEBUG
518 glFinish();
519 TIMER_STOP_PRINT("Texture Save: ");
520#endif
521
522 return 0;
523}
#define TIMER_STOP_PRINT(text)
Definition dxt_common.h:64
#define TIMER_START()
Definition dxt_common.h:56
#define TIMER_INIT()
Definition dxt_common.h:52

References dxt_decoder::compressed_tex, DXT_FORMAT_YUV422, DXT_IMAGE_GL_TYPE, DXT_TYPE_DXT5_YCOCG, dxt_decoder::fbo_rgba, dxt_decoder::fbo_yuv422, dxt_decoder::g_vao, dxt_decoder::g_vao_422, dxt_decoder::height, dxt_decoder::legacy, dxt_decoder::out_format, dxt_decoder::program_display, dxt_decoder::program_rgba_to_yuv422, TIMER_INIT, TIMER_START, TIMER_STOP_PRINT, dxt_decoder::type, dxt_decoder::uncompressed_rgba_tex, dxt_decoder::uncompressed_yuv422_tex, and dxt_decoder::width.

Referenced by dxt_glsl_decompress(), and perform_decode().

◆ dxt_decoder_destroy()

int dxt_decoder_destroy ( struct dxt_decoder * decoder)

Documented at declaration

Definition at line 535 of file dxt_decoder.c.

536{
537 glDeleteShader(decoder->shader_fragment_display);
538 glDeleteProgram(decoder->program_display);
539 glDeleteTextures(1, &decoder->compressed_tex);
540 glDeleteTextures(1, &decoder->uncompressed_rgba_tex);
541 glDeleteFramebuffers(1, &decoder->fbo_rgba);
542
543 if(decoder->out_format == DXT_FORMAT_YUV422) {
544 glDeleteTextures(1, &decoder->uncompressed_yuv422_tex);
545 glDeleteFramebuffers(1, &decoder->fbo_yuv422);
546 }
547 free(decoder);
548 return 0;
549}

References dxt_decoder::compressed_tex, DXT_FORMAT_YUV422, dxt_decoder::fbo_rgba, dxt_decoder::fbo_yuv422, dxt_decoder::out_format, dxt_decoder::program_display, dxt_decoder::shader_fragment_display, dxt_decoder::uncompressed_rgba_tex, and dxt_decoder::uncompressed_yuv422_tex.

Referenced by dxt_glsl_decompress_done(), dxt_glsl_decompress_reconfigure(), and perform_decode().

Variable Documentation

◆ points

GLfloat points[]
static
Initial value:
= { -1.0f, -1.0f, 0.0f, 1.0f,
1.0f, -1.0f, 0.0f, 1.0f,
-1.0f, 1.0f, 0.0f, 1.0f,
1.0f, -1.0f, 0.0f, 1.0f,
-1.0f, 1.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f
}

Copyright (c) 2011, Martin Srom All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright
  notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
  notice, this list of conditions and the following disclaimer in the
  documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Definition at line 50 of file dxt_decoder.c.

50 { -1.0f, -1.0f, 0.0f, 1.0f,
51 1.0f, -1.0f, 0.0f, 1.0f,
52 -1.0f, 1.0f, 0.0f, 1.0f,
53 /* second triangle */
54 1.0f, -1.0f, 0.0f, 1.0f,
55 -1.0f, 1.0f, 0.0f, 1.0f,
56 1.0f, 1.0f, 0.0f, 1.0f
57};

Referenced by dxt_decoder_create().