"glBindFramebufferEXT",
])
+ # Names of the functions that can pack into the current pixel buffer
+ # object. See also the ARB_pixel_buffer_object specification.
+ pack_function_names = set([
+ 'glGetCompressedTexImage',
+ 'glGetConvolutionFilter',
+ 'glGetHistogram',
+ 'glGetMinmax',
+ 'glGetPixelMapfv',
+ 'glGetPixelMapuiv',
+ 'glGetPixelMapusv',
+ 'glGetPolygonStipple',
+ 'glGetSeparableFilter,',
+ 'glGetTexImage',
+ 'glReadPixels',
+ 'glGetnCompressedTexImageARB',
+ 'glGetnConvolutionFilterARB',
+ 'glGetnHistogramARB',
+ 'glGetnMinmaxARB',
+ 'glGetnPixelMapfvARB',
+ 'glGetnPixelMapuivARB',
+ 'glGetnPixelMapusvARB',
+ 'glGetnPolygonStippleARB',
+ 'glGetnSeparableFilterARB',
+ 'glGetnTexImageARB',
+ 'glReadnPixelsARB',
+ ])
+
def retrace_function_body(self, function):
is_array_pointer = function.name in self.array_pointer_function_names
is_draw_array = function.name in self.draw_array_function_names
print ' }'
+ # When no pack buffer object is bound, the pack functions are no-ops.
+ if function.name in self.pack_function_names:
+ print ' GLint __pack_buffer = 0;'
+ print ' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &__pack_buffer);'
+ print ' if (!__pack_buffer) {'
+ print ' return;'
+ print ' }'
+
# Pre-snapshots
if function.name in self.bind_framebuffer_function_names:
print ' if (glretrace::snapshot_frequency == glretrace::FREQUENCY_FRAMEBUFFER) {'
def call_function(self, function):
if function.name == "glViewport":
- print ' if (glretrace::drawable) {'
- print ' int drawable_width = x + width;'
- print ' int drawable_height = y + height;'
- print ' if (drawable_width > (int)glretrace::drawable->width ||'
- print ' drawable_height > (int)glretrace::drawable->height) {'
- print ' glretrace::drawable->resize(drawable_width, drawable_height);'
- print ' if (!glretrace::drawable->visible) {'
- print ' glretrace::drawable->show();'
+ print ' GLint draw_framebuffer = 0;'
+ print ' glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &draw_framebuffer);'
+ print ' if (draw_framebuffer == 0) {'
+ print ' if (glretrace::drawable) {'
+ print ' int drawable_width = x + width;'
+ print ' int drawable_height = y + height;'
+ print ' if (drawable_width > (int)glretrace::drawable->width ||'
+ print ' drawable_height > (int)glretrace::drawable->height) {'
+ print ' glretrace::drawable->resize(drawable_width, drawable_height);'
+ print ' if (!glretrace::drawable->visible) {'
+ print ' glretrace::drawable->show();'
+ print ' }'
+ print ' glScissor(0, 0, drawable_width, drawable_height);'
print ' }'
- print ' glScissor(0, 0, drawable_width, drawable_height);'
print ' }'
print ' }'
self.extract_opaque_arg(function, arg, arg_type, lvalue, rvalue)
return
+ # Handle pointer with offsets into the current pack pixel buffer
+ # object.
+ if function.name in self.pack_function_names and arg.output:
+ self.extract_opaque_arg(function, arg, arg_type, lvalue, rvalue)
+ return
+
if arg.type is glapi.GLlocation \
and 'program' not in [arg.name for arg in function.args]:
print ' GLint program = -1;'