148 if (
encoder->yuv422_to_444_fp == 0) {
149 fprintf(stderr,
"Failed to compile YUV422->YUV444 fragment program!\n");
159 encoder->yuv422_to_444_program = glCreateProgram();
160 glAttachShader(
encoder->yuv422_to_444_program,
encoder->yuv422_to_444_fp);
161 glAttachShader(
encoder->yuv422_to_444_program,
encoder->yuv422_to_444_vp);
162 glLinkProgram(
encoder->yuv422_to_444_program);
165#if ! defined __APPLE__ || defined __MAC_10_11
166 GLint g_vertexLocation;
170 glGenVertexArrays(1, &
encoder->g_vao_422);
173 glBindVertexArray(
encoder->g_vao_422);
176 g_vertexLocation = glGetAttribLocation(
encoder->yuv422_to_444_program,
"position");
179 glGenBuffers(1, &g_vertices);
182 glBindBuffer(GL_ARRAY_BUFFER, g_vertices);
186 glBufferData(GL_ARRAY_BUFFER, 8 * 4 *
sizeof(GLfloat), (GLfloat*)
points, GL_STATIC_DRAW);
189 glUseProgram(
encoder->yuv422_to_444_program);
192 glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
195 glEnableVertexAttribArray(g_vertexLocation);
197 glBindFragDataLocation(
encoder->yuv422_to_444_program, 0,
"colorOut");
204 glGetProgramInfoLog(
encoder->yuv422_to_444_program, 32768, NULL, (GLchar*)log);
205 if ( strlen(log) > 0 )
206 printf(
"Link Log: %s\n", log);
208 glGenTextures(1, &
encoder->texture_yuv422);
209 glBindTexture(GL_TEXTURE_2D,
encoder->texture_yuv422);
210 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
211 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
212 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
213 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
214 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
encoder->width / 2,
encoder->height,
215 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
217 glUseProgram(
encoder->yuv422_to_444_program);
218 glUniform1i(glGetUniformLocation(
encoder->yuv422_to_444_program,
"image"), 0);
219 glUniform1f(glGetUniformLocation(
encoder->yuv422_to_444_program,
"imageWidth"),
223 glGenFramebuffers(1, &
encoder->fbo444_id);
235 glewExperimental = GL_TRUE;
236 GLenum err = glewInit();
237 assert(err == GLEW_OK);
249 glEnable(GL_TEXTURE_2D);
253#ifdef HAVE_GPUPERFAPI
254 GPA_EnableAllCounters();
257 glGenFramebuffers(1, &
encoder->fbo_id);
258 glBindFramebuffer(GL_FRAMEBUFFER,
encoder->fbo_id);
260#ifdef USE_PBO_DXT_ENCODER
268 glGenBuffersARB(1, &
encoder->pbo_in);
269 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB,
encoder->pbo_in);
270 glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB,
width*
height*bpp,0,GL_STREAM_DRAW_ARB);
271 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
273 glGenBuffersARB(1, &
encoder->pbo_out);
274 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
encoder->pbo_out);
276 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
281 glGenTextures(1, &fbo_tex);
282 glBindTexture(GL_TEXTURE_2D, fbo_tex);
283 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
284 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
285 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
286 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
288 glTexImage2D(GL_TEXTURE_2D, 0 , GL_RGBA32UI_EXT, (
encoder->width + 3) / 4 * 4, (
encoder->height + 3) / 4, 0, GL_RGBA_INTEGER_EXT, GL_INT, 0);
290 glTexImage2D(GL_TEXTURE_2D, 0 , GL_RGBA16UI_EXT, (
encoder->width + 3) / 4 * 4, (
encoder->height + 3) / 4, 0, GL_RGBA_INTEGER_EXT, GL_INT, 0);
291 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fbo_tex, 0);
292 glBindFramebuffer(GL_FRAMEBUFFER, 0);
295 encoder->program_compress = glCreateProgram();
297 encoder->shader_fragment_compress = 0;
319 fprintf(stderr,
"RGB(A) to DXT1_YUV is not supported!\n");
322 if (
encoder->shader_fragment_compress == 0 ) {
323 fprintf(stderr,
"Failed to compile fragment compress program!\n");
328 encoder->shader_vertex_compress = 0;
334 if (
encoder->shader_vertex_compress == 0 ) {
335 fprintf(stderr,
"Failed to compile vertex compress program!\n");
340 glAttachShader(
encoder->program_compress,
encoder->shader_fragment_compress);
341 glAttachShader(
encoder->program_compress,
encoder->shader_vertex_compress);
342 glLinkProgram(
encoder->program_compress);
345 glGetProgramInfoLog(
encoder->program_compress, 32768, NULL, (GLchar*)log);
346 if ( strlen(log) > 0 )
347 printf(
"Link Log: %s\n", log);
350 glGenTextures(1, &
encoder->texture_id);
351 glBindTexture(GL_TEXTURE_2D,
encoder->texture_id);
352 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
353 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
354 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
355 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
357 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
encoder->width,
encoder->height, 0, GL_RGB, GL_BYTE, NULL);
359 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
encoder->width,
encoder->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
372 glBindTexture(GL_TEXTURE_2D,
encoder->texture_id);
376 glDisable(GL_DEPTH_TEST);
379 glUseProgram(
encoder->program_compress);
381 glUniform1i(glGetUniformLocation(
encoder->program_compress,
"image"), 0);
384 glUniform1i(glGetUniformLocation(
encoder->program_compress,
"imageFormat"),
FORMAT_YUV);
386 glUniform1i(glGetUniformLocation(
encoder->program_compress,
"imageFormat"),
FORMAT_RGB);
388 glUniform2f(glGetUniformLocation(
encoder->program_compress,
"imageSize"),
encoder->width, (
encoder->height + 3) / 4 * 4);
389 glUniform1f(glGetUniformLocation(
encoder->program_compress,
"textureWidth"), (
encoder->width + 3) / 4 * 4);
392#if ! defined __APPLE__ || defined __MAC_10_11
393 GLint g_vertexLocation;
396 glGenVertexArrays(1, &
encoder->g_vao);
399 glBindVertexArray(
encoder->g_vao);
402 g_vertexLocation = glGetAttribLocation(
encoder->program_compress,
"position");
405 glGenBuffers(1, &
encoder->g_vertices);
408 glBindBuffer(GL_ARRAY_BUFFER,
encoder->g_vertices);
412 glBufferData(GL_ARRAY_BUFFER, 8 * 4 *
sizeof(GLfloat), (GLfloat*)
points, GL_STATIC_DRAW);
418 glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
421 glEnableVertexAttribArray(g_vertexLocation);
423 glBindFragDataLocation(
encoder->program_compress, 0,
"colorOut");
428 glBindFramebuffer(GL_FRAMEBUFFER,
encoder->fbo_id);
430#ifdef HAVE_GPUPERFAPI
431 GPA_BeginSession( &
encoder->sessionID );
432 GPA_GetPassCount( &
encoder->numRequiredPasses );
433 encoder->currentWaitSessionID = 0;
436 glGenQueries(4,
encoder->queries);
469 glBeginQuery(GL_TIME_ELAPSED_EXT,
encoder->queries[0]);
471#ifdef RTDXT_DEBUG_HOST
476#ifdef HAVE_GPUPERFAPI
480#ifdef USE_PBO_DXT_ENCODER
500 glBindFramebuffer(GL_FRAMEBUFFER,
encoder->fbo444_id);
501 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D,
encoder->texture_id, 0);
502 glBindTexture(GL_TEXTURE_2D,
encoder->texture_yuv422);
504 glPushAttrib(GL_VIEWPORT_BIT);
507#ifdef USE_PBO_DXT_ENCODER
508 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB,
encoder->pbo_in);
509 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
encoder->width / 2,
encoder->height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
510 glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, data_size, 0, GL_STREAM_DRAW_ARB);
511 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB);
515 memcpy(ptr, image, data_size);
516 glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);
519 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
encoder->width / 2,
encoder->height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, image);
521 glUseProgram(
encoder->yuv422_to_444_program);
523 glEndQuery(GL_TIME_ELAPSED_EXT);
524 glBeginQuery(GL_TIME_ELAPSED_EXT,
encoder->queries[1]);
526#ifdef HAVE_GPUPERFAPI
533 glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, -1.0);
534 glTexCoord2f(1.0, 0.0); glVertex2f(1.0, -1.0);
535 glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
536 glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0);
539#if ! defined __APPLE__ || defined __MAC_10_11
541 glBindVertexArray(
encoder->g_vao_422);
543 glDrawArrays(GL_TRIANGLES, 0, 6);
544 glBindVertexArray(0);
554 glUseProgram(
encoder->program_compress);
555 glBindFramebuffer(GL_FRAMEBUFFER,
encoder->fbo_id);
556 glBindTexture(GL_TEXTURE_2D,
encoder->texture_id);
562 glBindTexture(GL_TEXTURE_2D,
encoder->texture_id);
563#ifdef USE_PBO_DXT_ENCODER
564 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB,
encoder->pbo_in);
566 glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, data_size, 0, GL_STREAM_DRAW_ARB);
567 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB);
571 memcpy(ptr, image, data_size);
572 glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);
580 glBindTexture(GL_TEXTURE_2D,
encoder->texture_id);
581#ifdef USE_PBO_DXT_ENCODER
582 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB,
encoder->pbo_in);
583 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
encoder->width,
encoder->height, GL_RGB, GL_UNSIGNED_BYTE, 0);
584 glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, data_size, 0, GL_STREAM_DRAW_ARB);
585 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB);
589 memcpy(ptr, image, data_size);
590 glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);
593 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
encoder->width,
encoder->height, GL_RGB, GL_UNSIGNED_BYTE, image);
598 glEndQuery(GL_TIME_ELAPSED_EXT);
599 glBeginQuery(GL_TIME_ELAPSED_EXT,
encoder->queries[2]);
601#ifdef RTDXT_DEBUG_HOST
607#ifdef HAVE_GPUPERFAPI
619#ifdef USE_PBO_DXT_ENCODER
623 glBindTexture(GL_TEXTURE_2D, texture);
625 glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
626 assert(GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER));
628 glClearColor(1,0,0,1);
629 glClear(GL_COLOR_BUFFER_BIT);
633 glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, -1.0);
634 glTexCoord2f(1.0, 0.0); glVertex2f(1.0, -1.0);
635 glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
636 glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0);
639#if ! defined __APPLE__ || defined __MAC_10_11
641 glBindVertexArray(
encoder->g_vao);
643 glDrawArrays(GL_TRIANGLES, 0, 6);
644 glBindVertexArray(0);
647#ifdef HAVE_GPUPERFAPI
652 glEndQuery(GL_TIME_ELAPSED_EXT);
653 glBeginQuery(GL_TIME_ELAPSED_EXT,
encoder->queries[3]);
655#ifdef RTDXT_DEBUG_HOST
662 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
664#ifdef USE_PBO_DXT_ENCODER
668 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
encoder->pbo_out);
670 glReadPixels(0, 0, (
encoder->width + 3) / 4, (
encoder->height + 3) / 4, GL_RGBA_INTEGER_EXT, GL_UNSIGNED_INT, 0);
672 glReadPixels(0, 0, (
encoder->width + 3) / 4, (
encoder->height + 3) / 4 , GL_RGBA_INTEGER_EXT, GL_UNSIGNED_SHORT, 0);
675 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
encoder->pbo_out);
676 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
681 glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
685 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
687 glReadPixels(0, 0, (
encoder->width + 3) / 4, (
encoder->height + 3) / 4, GL_RGBA_INTEGER_EXT,
692#ifdef RTDXT_DEBUG_HOST
697 glEndQuery(GL_TIME_ELAPSED_EXT);
705 glGetQueryObjectiv(
encoder->queries[3], GL_QUERY_RESULT_AVAILABLE, &available);
707 glGetQueryObjectui64vEXT(
encoder->queries[0], GL_QUERY_RESULT, &load);
708 glGetQueryObjectui64vEXT(
encoder->queries[1], GL_QUERY_RESULT, &
convert);
709 glGetQueryObjectui64vEXT(
encoder->queries[2], GL_QUERY_RESULT, &compress);
710 glGetQueryObjectui64vEXT(
encoder->queries[3], GL_QUERY_RESULT, &store);
711 printf(
"Load: %8lu; YUV444->YUV422: %8lu; compress: %8lu; store: %8lu\n",
712 load,
convert, compress, store);
715#ifdef HAVE_GPUPERFAPI