From 41d95fe954deb386dab61a5ec908caca8431b7c5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Sat, 19 May 2012 20:53:37 +0100 Subject: [PATCH] Test trimming. --- tool_driver.py | 20 ++- traces/.gitignore | 1 + traces/dump-thread-ids.script | 242 ++++++++++++++++++++++++++++++++++ traces/glthreads.trace | Bin 0 -> 39420 bytes traces/trim-identity.script | 36 +++++ traces/trim-range.script | 8 ++ traces/trim-thread.script | 91 +++++++++++++ 7 files changed, 393 insertions(+), 5 deletions(-) create mode 100644 traces/dump-thread-ids.script create mode 100644 traces/glthreads.trace create mode 100644 traces/trim-identity.script create mode 100644 traces/trim-range.script create mode 100644 traces/trim-thread.script diff --git a/tool_driver.py b/tool_driver.py index 962db1e..60ad5d9 100755 --- a/tool_driver.py +++ b/tool_driver.py @@ -58,7 +58,7 @@ class AsciiComparer: try: refLine = refLines[lineNo] except IndexError: - fail('unexpected junk: %r' % self.srcLines[lineNo]) + fail('unexpected junk: %r' % srcLines[lineNo]) try: srcLine = srcLines[lineNo] @@ -77,10 +77,20 @@ class ToolDriver(Driver): some reason.''' refStream = open(refScript, 'rt') - - args = refStream.readline().split() - cmd = [self.options.apitrace] + args cwd = os.path.dirname(os.path.abspath(refScript)) + + while True: + args = refStream.readline().split() + cmd = [self.options.apitrace] + args + + if args[0] == 'dump': + break + + p = popen(cmd, cwd=cwd, universal_newlines=True) + p.wait() + if p.returncode != 0: + fail('`apitrace %s` returned code %i' % (args[0], p.returncode)) + p = popen(cmd, cwd=cwd, stdout=subprocess.PIPE, universal_newlines=True) comparer = AsciiComparer(p.stdout, refStream, self.options.verbose) @@ -88,7 +98,7 @@ class ToolDriver(Driver): p.wait() if p.returncode != 0: - fail('tool returned code %i' % p.returncode) + fail('`apitrace %s` returned code %i' % (args[0], p.returncode)) def run(self): self.parseOptions() diff --git a/traces/.gitignore b/traces/.gitignore index 6ef65c1..a0f8a41 100644 --- a/traces/.gitignore +++ b/traces/.gitignore @@ -1 +1,2 @@ !*.trace +*.src.trace diff --git a/traces/dump-thread-ids.script b/traces/dump-thread-ids.script new file mode 100644 index 0000000..6f8f584 --- /dev/null +++ b/traces/dump-thread-ids.script @@ -0,0 +1,242 @@ +dump --thread-ids glthreads.trace +0 0 glXChooseVisual(dpy = 0x751280, screen = 0, attribList = {GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DEPTH_SIZE, 1, GLX_DOUBLEBUFFER, 0}) = &{visual = 0x75c010, visualid = 151, screen = 0, depth = 24, c_class = 4, red_mask = 16711680, green_mask = 65280, blue_mask = 255, colormap_size = 256, bits_per_rgb = 8} +0 1 glXCreateContext(dpy = 0x751280, vis = &{visual = 0x75c010, visualid = 151, screen = 0, depth = 24, c_class = 4, red_mask = 16711680, green_mask = 65280, blue_mask = 255, colormap_size = 256, bits_per_rgb = 8}, shareList = NULL, direct = True) = 0x75e3e0 +0 2 glXChooseVisual(dpy = 0x751280, screen = 0, attribList = {GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DEPTH_SIZE, 1, GLX_DOUBLEBUFFER, 0}) = &{visual = 0x75c010, visualid = 151, screen = 0, depth = 24, c_class = 4, red_mask = 16711680, green_mask = 65280, blue_mask = 255, colormap_size = 256, bits_per_rgb = 8} +0 3 glXCreateContext(dpy = 0x751280, vis = &{visual = 0x75c010, visualid = 151, screen = 0, depth = 24, c_class = 4, red_mask = 16711680, green_mask = 65280, blue_mask = 255, colormap_size = 256, bits_per_rgb = 8}, shareList = NULL, direct = True) = 0xa99be0 +1 4 glXMakeCurrent(dpy = 0x751280, drawable = 62914565, ctx = 0xa99be0) = True +1 7 glEnable(cap = GL_DEPTH_TEST) +1 8 glViewport(x = 0, y = 0, width = 160, height = 160) +1 9 glMatrixMode(mode = GL_PROJECTION) +1 10 glLoadIdentity() +1 11 glFrustum(left = -1, right = 1, bottom = -1, top = 1, zNear = 1.5, zFar = 10) +1 12 glMatrixMode(mode = GL_MODELVIEW) +1 13 glLoadIdentity() +1 14 glTranslatef(x = 0, y = 0, z = -2.5) +2 6 glXMakeCurrent(dpy = 0x751280, drawable = 62914562, ctx = 0x75e3e0) = True +2 17 glEnable(cap = GL_DEPTH_TEST) +2 18 glViewport(x = 0, y = 0, width = 160, height = 160) +2 19 glMatrixMode(mode = GL_PROJECTION) +2 20 glLoadIdentity() +2 21 glFrustum(left = -1, right = 1, bottom = -1, top = 1, zNear = 1.5, zFar = 10) +2 22 glMatrixMode(mode = GL_MODELVIEW) +2 23 glLoadIdentity() +2 24 glTranslatef(x = 0, y = 0, z = -2.5) +1 15 glClear(mask = GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT) +1 26 glPushMatrix() +1 27 glRotatef(angle = 0, x = 0, y = 1, z = 0) +1 28 glRotatef(angle = 0, x = 1, y = 0, z = 0) +1 29 glScalef(x = 0.7, y = 0.7, z = 0.7) +1 30 glPushMatrix() +1 31 glScalef(x = 0.75, y = 0.75, z = 0.75) +1 32 glColor3f(red = 1, green = 0, blue = 0) +1 33 glDisable(cap = GL_TEXTURE_2D) +1 34 glBegin(mode = GL_QUADS) +1 35 glColor3f(red = 0, green = 1, blue = 1) +1 36 glTexCoord2f(s = 0, t = 0) +1 37 glVertex3f(x = -1, y = -1, z = -1) +1 38 glTexCoord2f(s = 1, t = 0) +1 39 glVertex3f(x = -1, y = 1, z = -1) +1 40 glTexCoord2f(s = 1, t = 1) +1 41 glVertex3f(x = -1, y = 1, z = 1) +1 42 glTexCoord2f(s = 0, t = 1) +1 43 glVertex3f(x = -1, y = -1, z = 1) +1 44 glColor3f(red = 1, green = 0, blue = 0) +1 45 glTexCoord2f(s = 0, t = 0) +1 46 glVertex3f(x = 1, y = -1, z = -1) +1 47 glTexCoord2f(s = 1, t = 0) +1 48 glVertex3f(x = 1, y = 1, z = -1) +1 49 glTexCoord2f(s = 1, t = 1) +1 50 glVertex3f(x = 1, y = 1, z = 1) +1 51 glTexCoord2f(s = 0, t = 1) +1 52 glVertex3f(x = 1, y = -1, z = 1) +1 53 glColor3f(red = 1, green = 0, blue = 1) +1 54 glTexCoord2f(s = 0, t = 0) +1 55 glVertex3f(x = -1, y = -1, z = -1) +1 56 glTexCoord2f(s = 1, t = 0) +1 57 glVertex3f(x = 1, y = -1, z = -1) +1 58 glTexCoord2f(s = 1, t = 1) +1 59 glVertex3f(x = 1, y = -1, z = 1) +1 60 glTexCoord2f(s = 0, t = 1) +1 61 glVertex3f(x = -1, y = -1, z = 1) +1 62 glColor3f(red = 0, green = 1, blue = 0) +1 63 glTexCoord2f(s = 0, t = 0) +1 64 glVertex3f(x = -1, y = 1, z = -1) +1 65 glTexCoord2f(s = 1, t = 0) +1 66 glVertex3f(x = 1, y = 1, z = -1) +1 67 glTexCoord2f(s = 1, t = 1) +1 68 glVertex3f(x = 1, y = 1, z = 1) +1 69 glTexCoord2f(s = 0, t = 1) +1 70 glVertex3f(x = -1, y = 1, z = 1) +1 71 glColor3f(red = 1, green = 1, blue = 0) +1 72 glTexCoord2f(s = 0, t = 0) +1 73 glVertex3f(x = -1, y = -1, z = -1) +1 74 glTexCoord2f(s = 1, t = 0) +1 75 glVertex3f(x = 1, y = -1, z = -1) +1 76 glTexCoord2f(s = 1, t = 1) +1 77 glVertex3f(x = 1, y = 1, z = -1) +1 78 glTexCoord2f(s = 0, t = 1) +1 79 glVertex3f(x = -1, y = 1, z = -1) +1 80 glColor3f(red = 0, green = 0, blue = 1) +1 81 glTexCoord2f(s = 0, t = 0) +1 82 glVertex3f(x = -1, y = -1, z = 1) +1 83 glTexCoord2f(s = 1, t = 0) +1 84 glVertex3f(x = 1, y = -1, z = 1) +1 85 glTexCoord2f(s = 1, t = 1) +1 86 glVertex3f(x = 1, y = 1, z = 1) +1 87 glTexCoord2f(s = 0, t = 1) +1 88 glVertex3f(x = -1, y = 1, z = 1) +1 89 glEnd() +1 90 glPopMatrix() +1 91 glPopMatrix() +2 25 glClear(mask = GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT) +2 93 glPushMatrix() +2 94 glRotatef(angle = 0, x = 0, y = 1, z = 0) +2 95 glRotatef(angle = 0, x = 1, y = 0, z = 0) +2 96 glScalef(x = 0.7, y = 0.7, z = 0.7) +2 97 glPushMatrix() +2 98 glScalef(x = 0.75, y = 0.75, z = 0.75) +2 99 glColor3f(red = 1, green = 0, blue = 0) +2 100 glDisable(cap = GL_TEXTURE_2D) +2 101 glBegin(mode = GL_QUADS) +2 102 glColor3f(red = 0, green = 1, blue = 1) +2 103 glTexCoord2f(s = 0, t = 0) +2 104 glVertex3f(x = -1, y = -1, z = -1) +2 105 glTexCoord2f(s = 1, t = 0) +2 106 glVertex3f(x = -1, y = 1, z = -1) +2 107 glTexCoord2f(s = 1, t = 1) +2 108 glVertex3f(x = -1, y = 1, z = 1) +2 109 glTexCoord2f(s = 0, t = 1) +2 110 glVertex3f(x = -1, y = -1, z = 1) +2 111 glColor3f(red = 1, green = 0, blue = 0) +2 112 glTexCoord2f(s = 0, t = 0) +2 113 glVertex3f(x = 1, y = -1, z = -1) +2 114 glTexCoord2f(s = 1, t = 0) +2 115 glVertex3f(x = 1, y = 1, z = -1) +2 116 glTexCoord2f(s = 1, t = 1) +2 117 glVertex3f(x = 1, y = 1, z = 1) +2 118 glTexCoord2f(s = 0, t = 1) +2 119 glVertex3f(x = 1, y = -1, z = 1) +2 120 glColor3f(red = 1, green = 0, blue = 1) +2 121 glTexCoord2f(s = 0, t = 0) +2 122 glVertex3f(x = -1, y = -1, z = -1) +2 123 glTexCoord2f(s = 1, t = 0) +2 124 glVertex3f(x = 1, y = -1, z = -1) +2 125 glTexCoord2f(s = 1, t = 1) +2 126 glVertex3f(x = 1, y = -1, z = 1) +2 127 glTexCoord2f(s = 0, t = 1) +2 128 glVertex3f(x = -1, y = -1, z = 1) +2 129 glColor3f(red = 0, green = 1, blue = 0) +2 130 glTexCoord2f(s = 0, t = 0) +2 131 glVertex3f(x = -1, y = 1, z = -1) +2 132 glTexCoord2f(s = 1, t = 0) +2 133 glVertex3f(x = 1, y = 1, z = -1) +2 134 glTexCoord2f(s = 1, t = 1) +2 135 glVertex3f(x = 1, y = 1, z = 1) +2 136 glTexCoord2f(s = 0, t = 1) +2 137 glVertex3f(x = -1, y = 1, z = 1) +2 138 glColor3f(red = 1, green = 1, blue = 0) +2 139 glTexCoord2f(s = 0, t = 0) +2 140 glVertex3f(x = -1, y = -1, z = -1) +2 141 glTexCoord2f(s = 1, t = 0) +2 142 glVertex3f(x = 1, y = -1, z = -1) +2 143 glTexCoord2f(s = 1, t = 1) +2 144 glVertex3f(x = 1, y = 1, z = -1) +2 145 glTexCoord2f(s = 0, t = 1) +2 146 glVertex3f(x = -1, y = 1, z = -1) +2 147 glColor3f(red = 0, green = 0, blue = 1) +2 148 glTexCoord2f(s = 0, t = 0) +2 149 glVertex3f(x = -1, y = -1, z = 1) +2 150 glTexCoord2f(s = 1, t = 0) +2 151 glVertex3f(x = 1, y = -1, z = 1) +2 152 glTexCoord2f(s = 1, t = 1) +2 153 glVertex3f(x = 1, y = 1, z = 1) +2 154 glTexCoord2f(s = 0, t = 1) +2 155 glVertex3f(x = -1, y = 1, z = 1) +2 156 glEnd() +2 157 glPopMatrix() +2 158 glPopMatrix() +1 92 glXSwapBuffers(dpy = 0x751280, drawable = 62914565) + +2 159 glXSwapBuffers(dpy = 0x751280, drawable = 62914562) + +2 160 glXMakeCurrent(dpy = 0x751280, drawable = 62914562, ctx = 0x75e3e0) = True +2 161 glEnable(cap = GL_DEPTH_TEST) +1 163 glXMakeCurrent(dpy = 0x751280, drawable = 62914565, ctx = 0xa99be0) = True +1 164 glEnable(cap = GL_DEPTH_TEST) +1 165 glViewport(x = 0, y = 0, width = 160, height = 160) +1 166 glMatrixMode(mode = GL_PROJECTION) +1 167 glLoadIdentity() +1 168 glFrustum(left = -1, right = 1, bottom = -1, top = 1, zNear = 1.5, zFar = 10) +1 169 glMatrixMode(mode = GL_MODELVIEW) +1 170 glLoadIdentity() +1 171 glTranslatef(x = 0, y = 0, z = -2.5) +2 162 glClear(mask = GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT) +2 173 glPushMatrix() +2 174 glRotatef(angle = 1, x = 0, y = 1, z = 0) +2 175 glRotatef(angle = 1, x = 1, y = 0, z = 0) +2 176 glScalef(x = 0.7, y = 0.7, z = 0.7) +2 177 glPushMatrix() +2 178 glScalef(x = 0.75, y = 0.75, z = 0.75) +2 179 glColor3f(red = 1, green = 0, blue = 0) +2 180 glDisable(cap = GL_TEXTURE_2D) +2 181 glBegin(mode = GL_QUADS) +2 182 glColor3f(red = 0, green = 1, blue = 1) +2 183 glTexCoord2f(s = 0, t = 0) +2 184 glVertex3f(x = -1, y = -1, z = -1) +2 185 glTexCoord2f(s = 1, t = 0) +2 186 glVertex3f(x = -1, y = 1, z = -1) +2 187 glTexCoord2f(s = 1, t = 1) +2 188 glVertex3f(x = -1, y = 1, z = 1) +2 189 glTexCoord2f(s = 0, t = 1) +2 190 glVertex3f(x = -1, y = -1, z = 1) +2 191 glColor3f(red = 1, green = 0, blue = 0) +2 192 glTexCoord2f(s = 0, t = 0) +2 193 glVertex3f(x = 1, y = -1, z = -1) +2 194 glTexCoord2f(s = 1, t = 0) +2 195 glVertex3f(x = 1, y = 1, z = -1) +2 196 glTexCoord2f(s = 1, t = 1) +2 197 glVertex3f(x = 1, y = 1, z = 1) +2 198 glTexCoord2f(s = 0, t = 1) +2 199 glVertex3f(x = 1, y = -1, z = 1) +2 200 glColor3f(red = 1, green = 0, blue = 1) +2 201 glTexCoord2f(s = 0, t = 0) +2 202 glVertex3f(x = -1, y = -1, z = -1) +2 203 glTexCoord2f(s = 1, t = 0) +2 204 glVertex3f(x = 1, y = -1, z = -1) +2 205 glTexCoord2f(s = 1, t = 1) +2 206 glVertex3f(x = 1, y = -1, z = 1) +2 207 glTexCoord2f(s = 0, t = 1) +2 208 glVertex3f(x = -1, y = -1, z = 1) +2 209 glColor3f(red = 0, green = 1, blue = 0) +2 210 glTexCoord2f(s = 0, t = 0) +2 211 glVertex3f(x = -1, y = 1, z = -1) +2 212 glTexCoord2f(s = 1, t = 0) +2 213 glVertex3f(x = 1, y = 1, z = -1) +2 214 glTexCoord2f(s = 1, t = 1) +2 215 glVertex3f(x = 1, y = 1, z = 1) +2 216 glTexCoord2f(s = 0, t = 1) +2 217 glVertex3f(x = -1, y = 1, z = 1) +2 218 glColor3f(red = 1, green = 1, blue = 0) +2 219 glTexCoord2f(s = 0, t = 0) +2 220 glVertex3f(x = -1, y = -1, z = -1) +2 221 glTexCoord2f(s = 1, t = 0) +2 222 glVertex3f(x = 1, y = -1, z = -1) +2 223 glTexCoord2f(s = 1, t = 1) +2 224 glVertex3f(x = 1, y = 1, z = -1) +2 225 glTexCoord2f(s = 0, t = 1) +2 226 glVertex3f(x = -1, y = 1, z = -1) +2 227 glColor3f(red = 0, green = 0, blue = 1) +2 228 glTexCoord2f(s = 0, t = 0) +2 229 glVertex3f(x = -1, y = -1, z = 1) +2 230 glTexCoord2f(s = 1, t = 0) +2 231 glVertex3f(x = 1, y = -1, z = 1) +2 232 glTexCoord2f(s = 1, t = 1) +2 233 glVertex3f(x = 1, y = 1, z = 1) +2 234 glTexCoord2f(s = 0, t = 1) +2 235 glVertex3f(x = -1, y = 1, z = 1) +2 236 glEnd() +2 237 glPopMatrix() +2 238 glPopMatrix() +1 172 glClear(mask = GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT) // incomplete +2 239 glXSwapBuffers(dpy = 0x751280, drawable = 62914562) // incomplete + diff --git a/traces/glthreads.trace b/traces/glthreads.trace new file mode 100644 index 0000000000000000000000000000000000000000..3dbc5349c961f01cd26148ac0a7230dd3f3a0776 GIT binary patch literal 39420 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 literal 0 HcmV?d00001 diff --git a/traces/trim-identity.script b/traces/trim-identity.script new file mode 100644 index 0000000..4370211 --- /dev/null +++ b/traces/trim-identity.script @@ -0,0 +1,36 @@ +trim -o trim-identity.src.trace tri.trace +dump --verbose trim-identity.src.trace +0 glXQueryExtension(dpy = 0xfc52b0, errorb = NULL, event = NULL) = True +1 glXChooseFBConfig(dpy = 0xfc52b0, screen = 0, attribList = {GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_ALPHA_SIZE, 1, GLX_DOUBLEBUFFER, 1, 0}, nitems = &12) = {0xfe3620, 0xfe3710, 0xfe53e0, 0xfe54d0, 0xfe38f0, 0xfe39e0, 0xfe3e90, 0xfe56b0, 0xfe57a0, 0xfe5c50, 0xfe3f80, 0xfe5d40} +2 glXGetVisualFromFBConfig(dpy = 0xfc52b0, config = 0xfe3620) = &{visual = 0xfd00e8, visualid = 154, screen = 0, depth = 24, c_class = 4, red_mask = 16711680, green_mask = 65280, blue_mask = 255, colormap_size = 256, bits_per_rgb = 8} +3 glXCreateNewContext(dpy = 0xfc52b0, config = 0xfe3620, renderType = GLX_RGBA_TYPE, shareList = NULL, direct = True) = 0xfdd650 +4 glXIsDirect(dpy = 0xfc52b0, ctx = 0xfdd650) = True +5 glXMakeContextCurrent(dpy = 0xfc52b0, draw = 44040194, read = 44040194, ctx = 0xfdd650) = True +6 glXMakeContextCurrent(dpy = 0xfc52b0, draw = 44040194, read = 44040194, ctx = 0xfdd650) = True +7 glGetString(name = GL_RENDERER) = "Mesa DRI Mobile Intel\2\556 GM45 Express Chipset " +8 glGetString(name = GL_VERSION) = "2.1 Mesa 7.11.2" +9 glGetString(name = GL_VENDOR) = "Tungsten Graphics, Inc" +10 glClearColor(red = 0.3, green = 0.1, blue = 0.3, alpha = 0) +11 glXMakeContextCurrent(dpy = 0xfc52b0, draw = 44040194, read = 44040194, ctx = 0xfdd650) = True +12 glViewport(x = 0, y = 0, width = 250, height = 250) +13 glMatrixMode(mode = GL_PROJECTION) +14 glLoadIdentity() +15 glOrtho(left = -1, right = 1, bottom = -1, top = 1, zNear = -0.5, zFar = 1000) +16 glMatrixMode(mode = GL_MODELVIEW) +17 glXMakeContextCurrent(dpy = 0xfc52b0, draw = 44040194, read = 44040194, ctx = 0xfdd650) = True +18 glXMakeContextCurrent(dpy = 0xfc52b0, draw = 44040194, read = 44040194, ctx = 0xfdd650) = True +19 glClear(mask = GL_COLOR_BUFFER_BIT) +20 glBegin(mode = GL_TRIANGLES) +21 glColor3f(red = 0.8, green = 0, blue = 0) +22 glVertex3f(x = -0.9, y = -0.9, z = -30) +23 glColor3f(red = 0, green = 0.9, blue = 0) +24 glVertex3f(x = 0.9, y = -0.9, z = -30) +25 glColor3f(red = 0, green = 0, blue = 0.7) +26 glVertex3f(x = 0, y = 0.9, z = -30) +27 glEnd() +28 glFlush() +29 glFlush() +30 glXSwapBuffers(dpy = 0xfc52b0, drawable = 44040194) + +31 glXMakeContextCurrent(dpy = 0xfc52b0, draw = 44040194, read = 44040194, ctx = 0xfdd650) = True +32 glXMakeContextCurrent(dpy = 0xfc52b0, draw = 44040194, read = 44040194, ctx = 0xfdd650) = True diff --git a/traces/trim-range.script b/traces/trim-range.script new file mode 100644 index 0000000..a511eda --- /dev/null +++ b/traces/trim-range.script @@ -0,0 +1,8 @@ +trim -o trim-range.src.trace --calls=2-7 tri.trace +dump --verbose trim-range.src.trace +0 glXGetVisualFromFBConfig(dpy = 0xfc52b0, config = 0xfe3620) = &{visual = 0xfd00e8, visualid = 154, screen = 0, depth = 24, c_class = 4, red_mask = 16711680, green_mask = 65280, blue_mask = 255, colormap_size = 256, bits_per_rgb = 8} +1 glXCreateNewContext(dpy = 0xfc52b0, config = 0xfe3620, renderType = GLX_RGBA_TYPE, shareList = NULL, direct = True) = 0xfdd650 +2 glXIsDirect(dpy = 0xfc52b0, ctx = 0xfdd650) = True +3 glXMakeContextCurrent(dpy = 0xfc52b0, draw = 44040194, read = 44040194, ctx = 0xfdd650) = True +4 glXMakeContextCurrent(dpy = 0xfc52b0, draw = 44040194, read = 44040194, ctx = 0xfdd650) = True +5 glGetString(name = GL_RENDERER) = "Mesa DRI Mobile Intel\2\556 GM45 Express Chipset " diff --git a/traces/trim-thread.script b/traces/trim-thread.script new file mode 100644 index 0000000..0d33ab1 --- /dev/null +++ b/traces/trim-thread.script @@ -0,0 +1,91 @@ +trim -o trim-thread.src.trace --thread=1 glthreads.trace +dump --verbose --thread-ids --call-nos=no trim-thread.src.trace +1 glXMakeCurrent(dpy = 0x751280, drawable = 62914565, ctx = 0xa99be0) = True +1 glGetString(name = GL_RENDERER) = "Mesa DRI Mobile Intel\2\556 GM45 Express Chipset " +1 glEnable(cap = GL_DEPTH_TEST) +1 glViewport(x = 0, y = 0, width = 160, height = 160) +1 glMatrixMode(mode = GL_PROJECTION) +1 glLoadIdentity() +1 glFrustum(left = -1, right = 1, bottom = -1, top = 1, zNear = 1.5, zFar = 10) +1 glMatrixMode(mode = GL_MODELVIEW) +1 glLoadIdentity() +1 glTranslatef(x = 0, y = 0, z = -2.5) +1 glClear(mask = GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT) +1 glPushMatrix() +1 glRotatef(angle = 0, x = 0, y = 1, z = 0) +1 glRotatef(angle = 0, x = 1, y = 0, z = 0) +1 glScalef(x = 0.7, y = 0.7, z = 0.7) +1 glPushMatrix() +1 glScalef(x = 0.75, y = 0.75, z = 0.75) +1 glColor3f(red = 1, green = 0, blue = 0) +1 glDisable(cap = GL_TEXTURE_2D) +1 glBegin(mode = GL_QUADS) +1 glColor3f(red = 0, green = 1, blue = 1) +1 glTexCoord2f(s = 0, t = 0) +1 glVertex3f(x = -1, y = -1, z = -1) +1 glTexCoord2f(s = 1, t = 0) +1 glVertex3f(x = -1, y = 1, z = -1) +1 glTexCoord2f(s = 1, t = 1) +1 glVertex3f(x = -1, y = 1, z = 1) +1 glTexCoord2f(s = 0, t = 1) +1 glVertex3f(x = -1, y = -1, z = 1) +1 glColor3f(red = 1, green = 0, blue = 0) +1 glTexCoord2f(s = 0, t = 0) +1 glVertex3f(x = 1, y = -1, z = -1) +1 glTexCoord2f(s = 1, t = 0) +1 glVertex3f(x = 1, y = 1, z = -1) +1 glTexCoord2f(s = 1, t = 1) +1 glVertex3f(x = 1, y = 1, z = 1) +1 glTexCoord2f(s = 0, t = 1) +1 glVertex3f(x = 1, y = -1, z = 1) +1 glColor3f(red = 1, green = 0, blue = 1) +1 glTexCoord2f(s = 0, t = 0) +1 glVertex3f(x = -1, y = -1, z = -1) +1 glTexCoord2f(s = 1, t = 0) +1 glVertex3f(x = 1, y = -1, z = -1) +1 glTexCoord2f(s = 1, t = 1) +1 glVertex3f(x = 1, y = -1, z = 1) +1 glTexCoord2f(s = 0, t = 1) +1 glVertex3f(x = -1, y = -1, z = 1) +1 glColor3f(red = 0, green = 1, blue = 0) +1 glTexCoord2f(s = 0, t = 0) +1 glVertex3f(x = -1, y = 1, z = -1) +1 glTexCoord2f(s = 1, t = 0) +1 glVertex3f(x = 1, y = 1, z = -1) +1 glTexCoord2f(s = 1, t = 1) +1 glVertex3f(x = 1, y = 1, z = 1) +1 glTexCoord2f(s = 0, t = 1) +1 glVertex3f(x = -1, y = 1, z = 1) +1 glColor3f(red = 1, green = 1, blue = 0) +1 glTexCoord2f(s = 0, t = 0) +1 glVertex3f(x = -1, y = -1, z = -1) +1 glTexCoord2f(s = 1, t = 0) +1 glVertex3f(x = 1, y = -1, z = -1) +1 glTexCoord2f(s = 1, t = 1) +1 glVertex3f(x = 1, y = 1, z = -1) +1 glTexCoord2f(s = 0, t = 1) +1 glVertex3f(x = -1, y = 1, z = -1) +1 glColor3f(red = 0, green = 0, blue = 1) +1 glTexCoord2f(s = 0, t = 0) +1 glVertex3f(x = -1, y = -1, z = 1) +1 glTexCoord2f(s = 1, t = 0) +1 glVertex3f(x = 1, y = -1, z = 1) +1 glTexCoord2f(s = 1, t = 1) +1 glVertex3f(x = 1, y = 1, z = 1) +1 glTexCoord2f(s = 0, t = 1) +1 glVertex3f(x = -1, y = 1, z = 1) +1 glEnd() +1 glPopMatrix() +1 glPopMatrix() +1 glXSwapBuffers(dpy = 0x751280, drawable = 62914565) + +1 glXMakeCurrent(dpy = 0x751280, drawable = 62914565, ctx = 0xa99be0) = True +1 glEnable(cap = GL_DEPTH_TEST) +1 glViewport(x = 0, y = 0, width = 160, height = 160) +1 glMatrixMode(mode = GL_PROJECTION) +1 glLoadIdentity() +1 glFrustum(left = -1, right = 1, bottom = -1, top = 1, zNear = 1.5, zFar = 10) +1 glMatrixMode(mode = GL_MODELVIEW) +1 glLoadIdentity() +1 glTranslatef(x = 0, y = 0, z = -2.5) +1 glClear(mask = GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT) -- 2.43.0