xglcomp

annotate doc/texture_from_pixmap.txt @ 7:03ca0fd49916

merged
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 30 Jan 2016 07:48:51 +0200
parents
children
rev   line source
nuclear@6 1 Name
nuclear@6 2
nuclear@6 3 EXT_texture_from_pixmap
nuclear@6 4
nuclear@6 5 Name Strings
nuclear@6 6
nuclear@6 7 GLX_EXT_texture_from_pixmap
nuclear@6 8
nuclear@6 9 Contributors
nuclear@6 10
nuclear@6 11 James Jones, NVIDIA
nuclear@6 12 Aaron Plattner, NVIDIA
nuclear@6 13 Andy Ritger, NVIDIA
nuclear@6 14
nuclear@6 15 Contact
nuclear@6 16
nuclear@6 17 David Reveman, Novell, Inc. (davidr 'at' novell.com)
nuclear@6 18
nuclear@6 19 Status
nuclear@6 20
nuclear@6 21 Complete
nuclear@6 22
nuclear@6 23 Version
nuclear@6 24
nuclear@6 25 17 (10 Feb 2009)
nuclear@6 26
nuclear@6 27 Number
nuclear@6 28
nuclear@6 29 344
nuclear@6 30
nuclear@6 31 Dependencies
nuclear@6 32
nuclear@6 33 OpenGL 1.1 is required.
nuclear@6 34 GLX 1.3 is required.
nuclear@6 35 GL_EXT_framebuffer_object affects the definition of this extension.
nuclear@6 36 GL_ARB_texture_rectangle affects the definition of this extension.
nuclear@6 37 GL_ARB_texture_non_power_of_two affects the definition of this extension.
nuclear@6 38 GL_SGIS_generate_mipmap affects the definition of this extension.
nuclear@6 39
nuclear@6 40 Overview
nuclear@6 41
nuclear@6 42 This extension allows a color buffer to be used for both rendering and
nuclear@6 43 texturing.
nuclear@6 44
nuclear@6 45 Only color buffers of pixmaps can be used for texturing by this extension
nuclear@6 46 but other types of drawables can be supported by future extensions layered
nuclear@6 47 on top of this extension.
nuclear@6 48
nuclear@6 49 The functionality of this extension is similar to WGL_ARB_render_texture.
nuclear@6 50 However, the purpose of this extension is not to provide
nuclear@6 51 "render to texture" like functionality but rather the ability to bind
nuclear@6 52 an existing X drawable to a texture. Though, there is nothing that
nuclear@6 53 prohibits it from being used for "render to texture".
nuclear@6 54
nuclear@6 55 - Windows are problematic as they can change size and therefore are not
nuclear@6 56 supported by this extension.
nuclear@6 57
nuclear@6 58 - Only a color buffer of a GLX pixmap created using an FBConfig with
nuclear@6 59 attribute GLX_BIND_TO_TEXTURE_RGB_EXT or GLX_BIND_TO_TEXTURE_RGBA_EXT
nuclear@6 60 set to TRUE can be bound as a texture.
nuclear@6 61
nuclear@6 62 - The texture internal format is determined when the color buffer
nuclear@6 63 is associated with the texture, guaranteeing that the color
nuclear@6 64 buffer format is equivalent to the texture internal format.
nuclear@6 65
nuclear@6 66 - A client can create a complete set of mipmap images if
nuclear@6 67 EXT_framebuffer_object is supported.
nuclear@6 68
nuclear@6 69
nuclear@6 70 IP Status
nuclear@6 71
nuclear@6 72 There are no known IP issues.
nuclear@6 73
nuclear@6 74 Issues
nuclear@6 75
nuclear@6 76 1. What should this extension be called?
nuclear@6 77
nuclear@6 78 Even though it is very similar to WGL_ARB_render_texture that name is
nuclear@6 79 not appropriate as the intention of this extension is not
nuclear@6 80 "render to texture" like functionality.
nuclear@6 81
nuclear@6 82 EXT_texture_from_pixmap seams most appropriate. Layering of future
nuclear@6 83 extensions on top of this extension for using other type of drawables
nuclear@6 84 as textures follows the same conventions as vertex/pixel buffer objects
nuclear@6 85 and vertex/fragment programs.
nuclear@6 86
nuclear@6 87
nuclear@6 88 2. Should we allow applications to render to different mipmap levels and
nuclear@6 89 cube map faces?
nuclear@6 90
nuclear@6 91 In order to discourage the use of this extension as a render to texture
nuclear@6 92 mechanism, cube maps and rendering directly to mip-map levels > 0 will
nuclear@6 93 not be supported. A new FBConfig attribute is introduced that specifies
nuclear@6 94 whether or not drawables created with that config will support multiple
nuclear@6 95 mipmap levels when bound to a texture. The other mipmap levels can be
nuclear@6 96 filled in by the EXT_framebuffer_object GenerateMipmapEXT function.
nuclear@6 97
nuclear@6 98 Specifying which level of a pixmap was being rendered to on a per-drawable
nuclear@6 99 basis, as was done in the WGL_ARB_render_texture extension, also
nuclear@6 100 introduces concurrency issues. The state of the drawable when it was
nuclear@6 101 being rendered two by two separate threads of execution and both were
nuclear@6 102 changing the mipmap level was difficult to define.
nuclear@6 103
nuclear@6 104 It is also desireable to keep this extension as simple as possible.
nuclear@6 105 Adding functionality that complicates the implementation and that is not
nuclear@6 106 directly relevenat to the goal of exposing a mechanism for texturing from
nuclear@6 107 arbitrary X pixmaps is not productive. If the ability to render directly
nuclear@6 108 to all levels of a texture is needed, EXT_framebuffer_object is the
nuclear@6 109 extension that should be used.
nuclear@6 110
nuclear@6 111
nuclear@6 112 3. Should 1D textures be supported?
nuclear@6 113
nuclear@6 114 X servers layered on top of an OpenGL implementation might not be able
nuclear@6 115 to support this. A new FBConfig attribute is introduced specifying
nuclear@6 116 which texture targets a drawable created with the given FBConfig can
nuclear@6 117 be bound to.
nuclear@6 118
nuclear@6 119
nuclear@6 120 4. What should the default value for GLX_TEXTURE_TARGET_EXT be? Should
nuclear@6 121 users be required to set this value if GLX_TEXTURE_FORMAT_EXT is not
nuclear@6 122 GLX_TEXTURE_FORMAT_NONE_EXT?
nuclear@6 123
nuclear@6 124 The implementation is capable of choosing a reasonable default, we simply
nuclear@6 125 need to specify the correct way to do so. We can base the ordering on
nuclear@6 126 the properties of the pixmap and the texturing capabilities of the
nuclear@6 127 pixmap's FBConfig and the implementation.
nuclear@6 128
nuclear@6 129 The order is:
nuclear@6 130
nuclear@6 131 - If GL_ARB_texture_non_power_of_two is supported GL_TEXTURE_2D will
nuclear@6 132 be used for all pixmap sizes.
nuclear@6 133
nuclear@6 134 - If only GL_ARB_texture_rectangle is supported GL_TEXTURE_2D will
nuclear@6 135 be used for all power of two pixmap sizes and GL_TEXTURE_RECTANGLE_ARB
nuclear@6 136 will be used for all non power of two pixmap sizes.
nuclear@6 137
nuclear@6 138
nuclear@6 139 5. Should users be required to re-bind the drawable to a texture after
nuclear@6 140 the drawable has been rendered to?
nuclear@6 141
nuclear@6 142 It is difficult to define what the contents of the texture would be if
nuclear@6 143 we don't require this. Also, requiring this would allow implementations
nuclear@6 144 to perform an implicit copy at this point if they could not support
nuclear@6 145 texturing directly out of renderable memory.
nuclear@6 146
nuclear@6 147 The problem with defining the contents of the texture after rendering
nuclear@6 148 has occured to the associated drawable is that there is no way to
nuclear@6 149 synchronize the use of the buffer as a source and as a destination.
nuclear@6 150 Direct OpenGL rendering is not necessarily done in the same command
nuclear@6 151 stream as X rendering. At the time the pixmap is used as the source
nuclear@6 152 for a texturing operation, it could be in a state halfway through a
nuclear@6 153 copyarea operation in which half of it is say, white, and half is the
nuclear@6 154 result of the copyarea operation. How is this defined? Worse, some
nuclear@6 155 other OpenGL application could be halfway through a frame of rendering
nuclear@6 156 when the composite manager sources from it. The buffer might just
nuclear@6 157 contain the results of a "glClear" operation at that point.
nuclear@6 158
nuclear@6 159 To gurantee tear-free rendering, a composite manager would run as follows:
nuclear@6 160
nuclear@6 161 -receive request for compositing:
nuclear@6 162 XGrabServer()
nuclear@6 163 glXWaitX() or XSync()
nuclear@6 164 glXBindTexImageEXT()
nuclear@6 165
nuclear@6 166 <Do rendering/compositing>
nuclear@6 167
nuclear@6 168 glXReleaseTexImageEXT()
nuclear@6 169 XUngrabServer()
nuclear@6 170
nuclear@6 171 Apps that don't synchronize like this would get what's available,
nuclear@6 172 and that may or may not be what they expect.
nuclear@6 173
nuclear@6 174
nuclear@6 175 6. What is the result of calling GenerateMipmapEXT on a drawable that
nuclear@6 176 was not created with mipmap levels?
nuclear@6 177
nuclear@6 178 The results are undefined.
nuclear@6 179
nuclear@6 180
nuclear@6 181 7. Rendering done by the window system may be y-inverted compared
nuclear@6 182 to the standard OpenGL texture representation. More specifically:
nuclear@6 183 the X Window system uses a coordinate system where the origin is in
nuclear@6 184 the upper left; however, the GL uses a coordinate system where the
nuclear@6 185 origin is in the lower left. Should we define the contents of the
nuclear@6 186 texture as the y-inverted contents of the drawable?
nuclear@6 187
nuclear@6 188 X implementations may represent their drawables differently internally,
nuclear@6 189 so y-inversion should be exposed as an FBConfig attribute.
nuclear@6 190 Applications will need to query this attribute and adjust their rendering
nuclear@6 191 appropriately.
nuclear@6 192
nuclear@6 193 If a drawables is y-inverted and is bound to a texture, the contents of the
nuclear@6 194 texture will be y-inverted with respect to the standard GL memory layout.
nuclear@6 195 This means the contents of a pixmap of size (width, height) at pixmap
nuclear@6 196 coordinate (x, y) will be at location (x, height-y-1) in the texture.
nuclear@6 197 Applications will need to adjust their texture coordinates accordingly to
nuclear@6 198 avoid drawing the texture contents upside down.
nuclear@6 199
nuclear@6 200
nuclear@6 201 8. Why wasn't this extension based on FBO instead of ARB_render_texture?
nuclear@6 202 Isn't the render_texture extension deprecated?
nuclear@6 203
nuclear@6 204 At first glance, FBO may seem like the perfect framework to base a spec
nuclear@6 205 for texturing from pixmap surfaces on. It replaced the
nuclear@6 206 WGL_ARB_render_texture specification, which provided a mechanism to
nuclear@6 207 texture from pbuffer surfaces. However, this train of thought is another
nuclear@6 208 side effect of the unfortunate naming of the WGL_ARB_render_texture
nuclear@6 209 specification. FBO and the orginal render_texture specification were
nuclear@6 210 two different solutions to the problem of how to render to and texture
nuclear@6 211 from the same surface. WGL_ARB_render_texture provided a method to bind
nuclear@6 212 a texture to a drawable surface, as this extension does. FBO provides the
nuclear@6 213 opposite solution, allowing rendering to arbitrary surfaces including
nuclear@6 214 textures. In the case of FBO, the application doing the rendering knows
nuclear@6 215 that it needs to render to an alternate surface. In our usage case, the
nuclear@6 216 application doing the rendering is arbitrary, and has no knowledge that another
nuclear@6 217 application wants to use the surface it is rendering to as a texture. The
nuclear@6 218 only application able to name the surface is the one texturing from it.
nuclear@6 219 Therefore, it makes sense to provide a mechanism for binding a texture to
nuclear@6 220 an arbitrary surface in general, and a pixmap in this particular case.
nuclear@6 221
nuclear@6 222
nuclear@6 223 9. Why not allow binding directly to an X pixmap without creating an
nuclear@6 224 intermediate GLX pixmap?
nuclear@6 225
nuclear@6 226 Architecturally, GLX has moved away from operating directly on X
nuclear@6 227 drawables. This allows GLX specific attributes to be associated with the
nuclear@6 228 GLX drawables. In this case, it is important to associate an FBConfig
nuclear@6 229 with the drawable. The FBConfig contains attributes specifying the
nuclear@6 230 internal format the GL will use when utilizing the drawable's framebuffer
nuclear@6 231 as a texture.
nuclear@6 232
nuclear@6 233
nuclear@6 234 New Procedures and Functions
nuclear@6 235
nuclear@6 236 void glXBindTexImageEXT (Display *display,
nuclear@6 237 GLXDrawable drawable,
nuclear@6 238 int buffer,
nuclear@6 239 const int *attrib_list)
nuclear@6 240
nuclear@6 241 void glXReleaseTexImageEXT (Display *display,
nuclear@6 242 GLXDrawable drawable,
nuclear@6 243 int buffer)
nuclear@6 244
nuclear@6 245
nuclear@6 246 New Tokens
nuclear@6 247
nuclear@6 248 Accepted by the <Attribute> parameter of glXGetFBConfigAttrib and
nuclear@6 249 the <attrib_list> parameter of glXChooseFBConfig:
nuclear@6 250
nuclear@6 251 GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0
nuclear@6 252 GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1
nuclear@6 253 GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2
nuclear@6 254 GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3
nuclear@6 255 GLX_Y_INVERTED_EXT 0x20D4
nuclear@6 256
nuclear@6 257 Accepted as an attribute in the <attrib_list> parameter of
nuclear@6 258 glXCreatePixmap, and by the <attribute> parameter of glXQueryDrawable:
nuclear@6 259
nuclear@6 260 GLX_TEXTURE_FORMAT_EXT 0x20D5
nuclear@6 261 GLX_TEXTURE_TARGET_EXT 0x20D6
nuclear@6 262 GLX_MIPMAP_TEXTURE_EXT 0x20D7
nuclear@6 263
nuclear@6 264 Accepted as a value in the <attrib_list> parameter of glXCreatePixmap
nuclear@6 265 and returned in the <value> parameter of glXQueryDrawable when
nuclear@6 266 <attribute> is GLX_TEXTURE_FORMAT_EXT:
nuclear@6 267
nuclear@6 268 GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8
nuclear@6 269 GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9
nuclear@6 270 GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA
nuclear@6 271
nuclear@6 272 Accepted as bits in the GLX_BIND_TO_TEXTURE_TARGETS_EXT variable:
nuclear@6 273
nuclear@6 274 GLX_TEXTURE_1D_BIT_EXT 0x00000001
nuclear@6 275 GLX_TEXTURE_2D_BIT_EXT 0x00000002
nuclear@6 276 GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004
nuclear@6 277
nuclear@6 278 Accepted as a value in the <attrib_list> parameter of glXCreatePixmap
nuclear@6 279 and returned in the <value> parameter of glXQueryDrawable when
nuclear@6 280 <attribute> is GLX_TEXTURE_TARGET_EXT:
nuclear@6 281
nuclear@6 282 GLX_TEXTURE_1D_EXT 0x20DB
nuclear@6 283 GLX_TEXTURE_2D_EXT 0x20DC
nuclear@6 284 GLX_TEXTURE_RECTANGLE_EXT 0x20DD
nuclear@6 285
nuclear@6 286 Accepted by the <Buffer> parameter of glXBindTexImageEXT and
nuclear@6 287 glXReleaseTexImageEXT:
nuclear@6 288
nuclear@6 289 GLX_FRONT_LEFT_EXT 0x20DE
nuclear@6 290 GLX_FRONT_RIGHT_EXT 0x20DF
nuclear@6 291 GLX_BACK_LEFT_EXT 0x20E0
nuclear@6 292 GLX_BACK_RIGHT_EXT 0x20E1
nuclear@6 293 GLX_FRONT_EXT GLX_FRONT_LEFT_EXT
nuclear@6 294 GLX_BACK_EXT GLX_BACK_LEFT_EXT
nuclear@6 295 GLX_AUX0_EXT 0x20E2
nuclear@6 296 GLX_AUX1_EXT 0x20E3
nuclear@6 297 GLX_AUX2_EXT 0x20E4
nuclear@6 298 GLX_AUX3_EXT 0x20E5
nuclear@6 299 GLX_AUX4_EXT 0x20E6
nuclear@6 300 GLX_AUX5_EXT 0x20E7
nuclear@6 301 GLX_AUX6_EXT 0x20E8
nuclear@6 302 GLX_AUX7_EXT 0x20E9
nuclear@6 303 GLX_AUX8_EXT 0x20EA
nuclear@6 304 GLX_AUX9_EXT 0x20EB
nuclear@6 305
nuclear@6 306
nuclear@6 307 GLX Protocol
nuclear@6 308
nuclear@6 309 Two new GLX protocol commands are added.
nuclear@6 310
nuclear@6 311 BindTexImageEXT
nuclear@6 312 1 CARD8 opcode (X assigned)
nuclear@6 313 1 16 GLX opcode (glXVendorPrivate)
nuclear@6 314 2 6+n request length
nuclear@6 315 4 1330 vendor specific opcode
nuclear@6 316 4 CARD32 context tag
nuclear@6 317 4 GLX_DRAWABLE drawable
nuclear@6 318 4 INT32 buffer
nuclear@6 319 4 CARD32 num_attributes
nuclear@6 320 4*n LISTofATTRIBUTE_PAIR attribute, value pairs.
nuclear@6 321
nuclear@6 322 ReleaseTexImageEXT
nuclear@6 323 1 CARD8 opcode (X assigned)
nuclear@6 324 1 16 GLX opcode (glXVendorPrivate)
nuclear@6 325 2 5 request length
nuclear@6 326 4 1331 vendor specific opcode
nuclear@6 327 4 CARD32 context tag
nuclear@6 328 4 GLX_DRAWABLE drawable
nuclear@6 329 4 INT32 buffer
nuclear@6 330
nuclear@6 331
nuclear@6 332 Errors
nuclear@6 333
nuclear@6 334 Additions to Chapter 2 of the OpenGL 1.2.1 Specification (OpenGL Operation)
nuclear@6 335
nuclear@6 336 None.
nuclear@6 337
nuclear@6 338 Additions to Chapter 3 of the OpenGL 1.2.1 Specification (Rasterization)
nuclear@6 339
nuclear@6 340 None.
nuclear@6 341
nuclear@6 342 Additions to Chapter 4 of the OpenGL 1.2.1 Specification (Per-Fragment
nuclear@6 343 Operations and the Frame Buffer)
nuclear@6 344
nuclear@6 345 None.
nuclear@6 346
nuclear@6 347 Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions)
nuclear@6 348
nuclear@6 349 None.
nuclear@6 350
nuclear@6 351 Additions to Chapter 6 of the OpenGL 1.2.1 Specification (State and State
nuclear@6 352 Requests)
nuclear@6 353
nuclear@6 354 None.
nuclear@6 355
nuclear@6 356 Additions to the GLX Specification
nuclear@6 357
nuclear@6 358 Add to table 3.1, GLXFBConfig Attributes:
nuclear@6 359
nuclear@6 360 Attribute Type Notes
nuclear@6 361 ------------------------------- ------- -------------------------------------------------------------------
nuclear@6 362 GLX_BIND_TO_TEXTURE_RGB_EXT boolean True if color buffers can be bound to RGB texture
nuclear@6 363 GLX_BIND_TO_TEXTURE_RGBA_EXT boolean True if color buffers can be bound to RGBA texture
nuclear@6 364 GLX_BIND_TO_MIPMAP_TEXTURE_EXT boolean True if color buffers can be bound to textures with multiple levels
nuclear@6 365 GLX_BIND_TO_TEXTURE_TARGETS_EXT bitmask Bitmask of texture targets color buffers can be bound to
nuclear@6 366 GLX_Y_INVERTED_EXT boolean True if the drawable's framebuffer is y-inverted. This can be used to determine if y-inverted texture coordinates need to be used when texturing from this drawable when it is bound to a texture target.
nuclear@6 367
nuclear@6 368 Additions to table 3.4, Default Match Criteria for GLXFBConfig attributes:
nuclear@6 369
nuclear@6 370 Attribute Default Selection Criteria Priority
nuclear@6 371 ------------------------------- -------------------- ------------------ ---------
nuclear@6 372 GLX_BIND_TO_TEXTURE_RGB_EXT GLX_DONT_CARE Exact
nuclear@6 373 GLX_BIND_TO_TEXTURE_RGBA_EXT GLX_DONT_CARE Exact
nuclear@6 374 GLX_BIND_TO_MIPMAP_TEXTURE_EXT GLX_DONT_CARE Exact
nuclear@6 375 GLX_BIND_TO_TEXTURE_TARGETS_EXT - Mask
nuclear@6 376 GLX_Y_INVERTED_EXT GLX_DONT_CARE Exact
nuclear@6 377
nuclear@6 378 Modifications to 3.3.3, "Configuration Management"
nuclear@6 379
nuclear@6 380 Add after paragraph 17 in the description of FBConfigs:
nuclear@6 381
nuclear@6 382 GLX_Y_INVERTED_EXT is a boolean describing the memory layout used for
nuclear@6 383 drawables created with the GLXFBConfig. The attribute is True if the
nuclear@6 384 drawable's framebuffer will be y-inverted. This can be used to determine
nuclear@6 385 if y-inverted texture coordinates need to be used when texturing from this
nuclear@6 386 drawable when it is bound to a texture target.
nuclear@6 387
nuclear@6 388 Modifications to 3.3.5, "Offscreen Rendering"
nuclear@6 389
nuclear@6 390 Modify paragraph 3 of the description of glXCreatePixmap:
nuclear@6 391
nuclear@6 392 <attrib_list> specifies a list of attributes for the pixmap. The list has
nuclear@6 393 the same structure as described for glXChooseFBConfig. Currently the
nuclear@6 394 following attributes can be specified in attrib_list:
nuclear@6 395 GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_TARGET_EXT, GLX_MIPMAP_TEXTURE_EXT,
nuclear@6 396 attrib_list may be NULL or empty (first attribute of None), in which case
nuclear@6 397 all attributes assume their default values as described below.
nuclear@6 398
nuclear@6 399 GLX_TEXTURE_FORMAT_EXT describes the texture format this pixmap can be
nuclear@6 400 bound to. Valid values are GLX_TEXTURE_FORMAT_RGB_EXT,
nuclear@6 401 GLX_TEXTURE_FORMAT_RGBA_EXT, and GLX_TEXTURE_FORMAT_NONE_EXT.
nuclear@6 402
nuclear@6 403 GLX_TEXTURE_TARGET_EXT can be set to GLX_TEXTURE_1D_EXT,
nuclear@6 404 GLX_TEXTURE_2D_EXT, or GLX_TEXTURE_RECTANGLE_EXT; it indicates the type
nuclear@6 405 of texture that will be created when GLX_TEXTURE_FORMAT_EXT is not
nuclear@6 406 GLX_TEXTURE_FORMAT_NONE_EXT. The default value of GLX_TEXTURE_TARGET_EXT
nuclear@6 407 depends on the capabilities in <config> and the dimensions of the pixmap.
nuclear@6 408 If <config> has GLX_TEXTURE_2D_BIT set and one or more of the following is
nuclear@6 409 true:
nuclear@6 410
nuclear@6 411 * GLX_TEXTURE_RECTANGLE_BIT_EXT is not set in <config>
nuclear@6 412
nuclear@6 413 * GL_ARB_texture_non_power_of_two is supported
nuclear@6 414
nuclear@6 415 * the pixmap's width and height are powers of 2
nuclear@6 416
nuclear@6 417 the default value for GLX_TEXTURE_TARGET_EXT is GLX_TEXTURE_2D_EXT.
nuclear@6 418
nuclear@6 419 Otherwise, the first supported target is chosen in this order:
nuclear@6 420 GLX_TEXTURE_RECTANGLE_EXT, GLX_TEXTURE_1D_EXT.
nuclear@6 421
nuclear@6 422 GLX_MIPMAP_TEXTURE_EXT indicates that storage for mipmaps should be
nuclear@6 423 allocated. Space for mipmaps will be set aside if GLX_TEXTURE_FORMAT_EXT
nuclear@6 424 is not GLX_TEXTURE_FORMAT_NONE_EXT and GLX_MIPMAP_TEXTURE_EXT is TRUE.
nuclear@6 425 The default value is FALSE.
nuclear@6 426
nuclear@6 427 Modify paragraph 5 of the description of glXCreatePixmap:
nuclear@6 428
nuclear@6 429 ...If <pixmap> is not a valid Pixmap XID, then a BadPixmap error is
nuclear@6 430 generated. A BadConfig error is generated if any of the following
nuclear@6 431 conditions are true:
nuclear@6 432
nuclear@6 433 * GLX_TEXTURE_FORMAT_EXT is GLX_TEXTURE_FORMAT_RGB_EXT and
nuclear@6 434 <config> does not have GLX_BIND_TO_TEXTURE_RGB set to TRUE.
nuclear@6 435
nuclear@6 436 * GLX_TEXTURE_FORMAT_EXT is GLX_TEXTURE_FORMAT_RGBA_EXT and
nuclear@6 437 <config> does not have GLX_BIND_TO_TEXTURE_RGBA set to TRUE.
nuclear@6 438
nuclear@6 439 * GLX_MIPMAP_TEXTURE_EXT is set to TRUE and <config> does not
nuclear@6 440 have GLX_BIND_TO_MIPMAP_EXT set to TRUE.
nuclear@6 441
nuclear@6 442 * GLX_TEXTURE_TARGET_EXT is set to GLX_TEXTURE_1D_EXT
nuclear@6 443 and <config> does not have GLX_TEXTURE_1D_BIT_EXT set.
nuclear@6 444
nuclear@6 445 * GLX_TEXTURE_TARGET_EXT is set to GLX_TEXTURE_2D_EXT
nuclear@6 446 and <config> does not have GLX_TEXTURE_2D_BIT_EXT set.
nuclear@6 447
nuclear@6 448 * GLX_TEXTURE_TARGET_EXT is set to GLX_TEXTURE_RECTANGLE_EXT
nuclear@6 449 and <config> does not have GLX_TEXTURE_RECTANGLE_BIT_EXT set.
nuclear@6 450
nuclear@6 451 A BadValue error is generated if GLX_TEXTURE_FORMAT_EXT is not
nuclear@6 452 GLX_TEXTURE_FORMAT_NONE_EXT and the width or height of <pixmap> are
nuclear@6 453 incompatible with the specified value of GLX_TEXTURE_TARGET_EXT on this
nuclear@6 454 implementation. (e.g., the pixmap size is not a power of 2 and
nuclear@6 455 GL_ARB_texture_rectangle is not supported).
nuclear@6 456
nuclear@6 457 Modify paragraph 1 of the description of glXDestroyPixmap:
nuclear@6 458
nuclear@6 459 ...The storage for the GLX pixmap will be freed when it is not current
nuclear@6 460 to any client and all color buffers that are bound to a texture object
nuclear@6 461 have been released.
nuclear@6 462
nuclear@6 463
nuclear@6 464 Modifications to seciton 3.3.6, "Querying Attributes"
nuclear@6 465
nuclear@6 466 Modify paragraph 1 of the description of glXQueryDrawable:
nuclear@6 467
nuclear@6 468 ...<attribute> must be set to one of GLX_WIDTH, GLX_HEIGHT,
nuclear@6 469 GLX_PRESERVED_CONTENTS, GLX_LARGEST_PBUFFER, GLX_FBCONFIG_ID,
nuclear@6 470 GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_TARGET_EXT or GLX_MIPMAP_TEXTURE_EXT
nuclear@6 471 or a BadValue error is generated.
nuclear@6 472
nuclear@6 473 Modify paragraph 3 of the description of glXQueryDrawable:
nuclear@6 474
nuclear@6 475 ...If <draw> is a GLXWindow or GLXPixmap and <attribute> is set to
nuclear@6 476 GLX_PRESERVED_CONTENTS or GLX_LARGEST_PBUFFER, or if <draw> is a
nuclear@6 477 GLXWindow or GLXPbuffer and <attribute> is set to GLX_TEXTURE_FORMAT_EXT,
nuclear@6 478 GLX_TEXTURE_TARGET_EXT, or GLX_MIPMAP_TEXTURE_EXT, the contents of <value>
nuclear@6 479 are undefined.
nuclear@6 480
nuclear@6 481 Add a new section 3.3.6.1, "Texturing From Drawables"
nuclear@6 482
nuclear@6 483 The command
nuclear@6 484
nuclear@6 485 void glXBindTexImageEXT (Display *dpy,
nuclear@6 486 GLXDrawable draw,
nuclear@6 487 int buffer,
nuclear@6 488 int *attrib_list);
nuclear@6 489
nuclear@6 490 defines a one- or two-dimensional texture image. The texture image is taken
nuclear@6 491 from <buffer> and need not be copied. The texture target, the texture
nuclear@6 492 format, and the size of the texture components are derived from attributes
nuclear@6 493 of <draw>.
nuclear@6 494
nuclear@6 495 The drawable attribute GLX_TEXTURE_FORMAT_EXT determines the base internal
nuclear@6 496 format of the texture. The component sizes are also determined by drawable
nuclear@6 497 attributes as shown in table 3.4a.
nuclear@6 498
nuclear@6 499 Add new table 3.4a: Size of texture components:
nuclear@6 500
nuclear@6 501 Texture component Size
nuclear@6 502 ----------------- --------------
nuclear@6 503 R GLX_RED_SIZE
nuclear@6 504 G GLX_GREEN_SIZE
nuclear@6 505 B GLX_BLUE_SIZE
nuclear@6 506 A GLX_ALPHA_SIZE
nuclear@6 507
nuclear@6 508 The texture target is derived from the GLX_TEXTURE_TARGET_EXT attribute of
nuclear@6 509 <draw>. If the texture target for the drawable is GLX_TEXTURE_2D_EXT or
nuclear@6 510 GLX_TEXTURE_RECTANGLE_EXT, then buffer defines a 2D texture for the current
nuclear@6 511 2D or rectangle texture object respectively; if the texture target is
nuclear@6 512 GLX_TEXTURE_1D_EXT, then buffer defines a 1D texture for the current 1D
nuclear@6 513 texture object.
nuclear@6 514
nuclear@6 515 If <buffer> is not one of GLX_FRONT_LEFT_EXT, GLX_FRONT_RIGHT_EXT,
nuclear@6 516 GLX_BACK_LEFT_EXT, GLX_BACK_RIGHT_EXT, or GLX_AUX0_EXT through
nuclear@6 517 GLX_AUXn_EXT, where n is one less than the number of AUX buffers supported
nuclear@6 518 by the FBConfig used to create <draw>, or if the requested buffer is
nuclear@6 519 missing, a BadValue error is generated.
nuclear@6 520
nuclear@6 521 <attrib_list> specifies a list of attributes for the texture. The list has
nuclear@6 522 the same structure as described for glXChooseFBConfig. If <attrib_list> is
nuclear@6 523 NULL or empty (first attribute of None), then all attributes assume their
nuclear@6 524 default values. <attrib_list> must be NULL or empty.
nuclear@6 525
nuclear@6 526 If <dpy> and <draw> are the display and drawable for the calling thread's
nuclear@6 527 current context, glXBindTexImageEXT performs an implicit glFlush.
nuclear@6 528
nuclear@6 529 The contents of the texture after the drawable has been bound are defined
nuclear@6 530 as the result of all rendering that has completed before the call to
nuclear@6 531 glXBindTexImageEXT. In other words, the results of any operation which
nuclear@6 532 has caused damage on the drawable prior to the glXBindTexImageEXT call
nuclear@6 533 will be represented in the texture.
nuclear@6 534
nuclear@6 535 Rendering to the drawable while it is bound to a texture will leave the
nuclear@6 536 contents of the texture in an undefined state. However, no
nuclear@6 537 synchronization between rendering and texturing is done by GLX. It is
nuclear@6 538 the application's responsibility to implement any synchronization
nuclear@6 539 required.
nuclear@6 540
nuclear@6 541 If a texture object is deleted before glXReleaseTexImageEXT is called,
nuclear@6 542 the color buffer is released.
nuclear@6 543
nuclear@6 544 It is not an error to call TexImage2D, TexImage1D, CopyTexImage1D, or
nuclear@6 545 CopyTexImage2D to replace an image of a texture object that has a color
nuclear@6 546 buffer bound to it. However, these calls will cause the color buffer to be
nuclear@6 547 released and new memory to be allocated for the texture. Note that the
nuclear@6 548 color buffer is released even if the image that is being defined is a mipmap
nuclear@6 549 level that was not defined by the color buffer. GenerateMipmapEXT is an
nuclear@6 550 exception. GenerateMipmapEXT can be used to define mipmap levels for
nuclear@6 551 drawables that have been created with GLX_MIPMAP_TEXTURE_EXT set. Calling
nuclear@6 552 GenerateMipmapEXT on a drawable that was created without
nuclear@6 553 GLX_MIPMAP_TEXTURE_EXT is undefined.
nuclear@6 554
nuclear@6 555 The results of calling glXBindTexImageEXT when GENERATE_MIPMAP_SGIS is TRUE
nuclear@6 556 are undefined.
nuclear@6 557
nuclear@6 558 If glXBindTexImageEXT is called and the drawable attribute
nuclear@6 559 GLX_TEXTURE_FORMAT_EXT is GLX_TEXTURE_FORMAT_NONE_EXT, then a BadMatch
nuclear@6 560 error is generated.
nuclear@6 561
nuclear@6 562 Currently, only pixmaps can be bound to textures. If <draw> is not a
nuclear@6 563 valid GLXPixmap, then a GLXBadPixmap error is generated.
nuclear@6 564
nuclear@6 565 glXBindTexImageEXT is ignored if there is no current GLX rendering context.
nuclear@6 566
nuclear@6 567 To release a color buffer that is being used as a texture, call
nuclear@6 568
nuclear@6 569 void glXReleaseTexImageEXT (Dislpay *dpy, GLXDrawable draw, int buffer);
nuclear@6 570
nuclear@6 571 <buffer> must be one of GLX_FRONT_LEFT_EXT, GLX_FRONT_RIGHT_EXT,
nuclear@6 572 GLX_BACK_LEFT_EXT, GLX_BACK_RIGHT_EXT, and GLX_AUX0_EXT through
nuclear@6 573 GLX_AUXn_EXT, where n is one less than the number of AUX buffers
nuclear@6 574 supported by the FBConfig used to create <draw> or a BadValue error
nuclear@6 575 is generated.
nuclear@6 576
nuclear@6 577 The contents of the color buffer are unaffected by glXReleaseTexImageEXT.
nuclear@6 578
nuclear@6 579 If the specified color buffer is no longer bound to a texture (e.g.,
nuclear@6 580 because the texture object was deleted), then glXReleaseTexImageEXT has no effect;
nuclear@6 581 no error is generated.
nuclear@6 582
nuclear@6 583 When a color buffer is released (e.g., by calling glXReleaseTexImageEXT or
nuclear@6 584 implicitly by calling a routine such as TexImage2D), all textures that were
nuclear@6 585 defined by the color buffer become NULL.
nuclear@6 586
nuclear@6 587 If glXReleaseTexImageEXT is called and the drawable attribute
nuclear@6 588 GLX_TEXTURE_FORMAT_EXT is GLX_TEXTURE_FORMAT_NONE_EXT, then a BadMatch
nuclear@6 589 error is generated.
nuclear@6 590
nuclear@6 591 Currently, only pixmaps can be bound to textures. If <draw> is not a
nuclear@6 592 valid GLXPixmap, then a GLXBadPixmap error is generated.
nuclear@6 593
nuclear@6 594
nuclear@6 595 Usage Examples
nuclear@6 596
nuclear@6 597 Example 1: Bind redirected window to texture:
nuclear@6 598
nuclear@6 599 XGetWindowAttributes (display, window, &attrib);
nuclear@6 600
nuclear@6 601 visualid = XVisualIDFromVisual (attrib.visual);
nuclear@6 602
nuclear@6 603 fbconfigs = glXGetFBConfigs (display, screen, &nfbconfigs);
nuclear@6 604 for (i = 0; i < nfbconfigs; i++)
nuclear@6 605 {
nuclear@6 606 visinfo = glXGetVisualFromFBConfig (display, fbconfigs[i]);
nuclear@6 607 if (!visinfo || visinfo->visualid != visualid)
nuclear@6 608 continue;
nuclear@6 609
nuclear@6 610 glXGetFBConfigAttrib (display, fbconfigs[i], GLX_DRAWABLE_TYPE, &value);
nuclear@6 611 if (!(value & GLX_PIXMAP_BIT))
nuclear@6 612 continue;
nuclear@6 613
nuclear@6 614 glXGetFBConfigAttrib (display, fbconfigs[i],
nuclear@6 615 GLX_BIND_TO_TEXTURE_TARGETS_EXT,
nuclear@6 616 &value);
nuclear@6 617 if (!(value & GLX_TEXTURE_2D_BIT_EXT))
nuclear@6 618 continue;
nuclear@6 619
nuclear@6 620 glXGetFBConfigAttrib (display, fbconfigs[i],
nuclear@6 621 GLX_BIND_TO_TEXTURE_RGBA_EXT,
nuclear@6 622 &value);
nuclear@6 623 if (value == FALSE)
nuclear@6 624 {
nuclear@6 625 glXGetFBConfigAttrib (display, fbconfigs[i],
nuclear@6 626 GLX_BIND_TO_TEXTURE_RGB_EXT,
nuclear@6 627 &value);
nuclear@6 628 if (value == FALSE)
nuclear@6 629 continue;
nuclear@6 630 }
nuclear@6 631
nuclear@6 632 glXGetFBConfigAttrib (display, fbconfigs[i],
nuclear@6 633 GLX_Y_INVERTED_EXT,
nuclear@6 634 &value);
nuclear@6 635 if (value == TRUE)
nuclear@6 636 {
nuclear@6 637 top = 0.0f;
nuclear@6 638 bottom = 1.0f;
nuclear@6 639 }
nuclear@6 640 else
nuclear@6 641 {
nuclear@6 642 top = 1.0f;
nuclear@6 643 bottom = 0.0f;
nuclear@6 644 }
nuclear@6 645
nuclear@6 646 break;
nuclear@6 647 }
nuclear@6 648
nuclear@6 649 if (i == nfbconfigs)
nuclear@6 650 /* error 1 */
nuclear@6 651
nuclear@6 652 pixmap = XCompositeNameWindowPixmap (display, window);
nuclear@6 653 pixmapAttribs = { GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
nuclear@6 654 GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT,
nuclear@6 655 None };
nuclear@6 656 glxpixmap = glXCreatePixmap (display, fbconfigs[i], pixmap, pixmapAttribs);
nuclear@6 657
nuclear@6 658 glGenTextures (1, &texture);
nuclear@6 659 glBindTexture (GL_TEXTURE_2D, texture);
nuclear@6 660
nuclear@6 661 glXBindTexImageEXT (display, glxpixmap, GLX_FRONT_LEFT_EXT, NULL);
nuclear@6 662
nuclear@6 663 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
nuclear@6 664 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
nuclear@6 665
nuclear@6 666 /* draw using pixmap as texture */
nuclear@6 667 glBegin (GL_QUADS);
nuclear@6 668
nuclear@6 669 glTexCoord2d (0.0f, bottom);
nuclear@6 670 glVertex2d (0.0f, 0.0f);
nuclear@6 671
nuclear@6 672 glTexCoord2d (0.0f, top);
nuclear@6 673 glVertex2d (0.0f, 1.0f);
nuclear@6 674
nuclear@6 675 glTexCoord2d (1.0f, top);
nuclear@6 676 glVertex2d (1.0f, 1.0f);
nuclear@6 677
nuclear@6 678 glTexCoord2d (1.0f, bottom);
nuclear@6 679 glVertex2d (1.0f, 0.0f);
nuclear@6 680
nuclear@6 681 glEnd ();
nuclear@6 682
nuclear@6 683 glXReleaseTexImageEXT (display, glxpixmap, GLX_FRONT_LEFT_EXT);
nuclear@6 684
nuclear@6 685
nuclear@6 686 Version History
nuclear@6 687
nuclear@6 688 1. 26 Nov 2005 - DavidR
nuclear@6 689 Initial version
nuclear@6 690 2. 01 Dec 2005 - JamesJ
nuclear@6 691 -Adapted spec language from draft version of GLX_ARB_render_texture.
nuclear@6 692 -Added glXDrawableAttribute to set attributes.
nuclear@6 693 -Modified glXBindTexImageEXT to take an attrib_list parameter.
nuclear@6 694 -Added support for cubemap and 1D texture targets.
nuclear@6 695 -Added attribute to set the texture target when creating the
nuclear@6 696 drawable.
nuclear@6 697 -Updated the issues section.
nuclear@6 698 -Added mipmap support. Support is not required.
nuclear@6 699 -Specified results of texturing from a drawable when it has been
nuclear@6 700 rendered to while bound to a texture as undefined until
nuclear@6 701 glXReleaseTexImageEXT has been called. Allows implementations
nuclear@6 702 that need to perform an implicit copy after rendering occurs
nuclear@6 703 to be compatible with this specification.
nuclear@6 704 3. 04 Dec 2005 - DavidR
nuclear@6 705 -Changed name to GLX_EXT_texture_from_pixmap.
nuclear@6 706 -Changed spec regarding what happens when a pixmap that is bound
nuclear@6 707 to a texture is rendered to. Having textures be undefined once
nuclear@6 708 they are rendered to makes it useless for a compositing manager,
nuclear@6 709 which is a major use case for this extension.
nuclear@6 710 -Added support for not specifying texture target when creating a
nuclear@6 711 pixmap. Allows implementations to select whatever target it
nuclear@6 712 finds most suitable.
nuclear@6 713 4. 05 Dec 2005 - JamesJ
nuclear@6 714 -Changed the default value of GLX_TEXTURE_TARGET_EXT from
nuclear@6 715 GLX_NO_TEXTURE_EXT to something usable. Eliminated
nuclear@6 716 GLX_NO_TEXTURE_EXT.
nuclear@6 717 -Eliminated GLX_TEXTURE_NONE_EXT.
nuclear@6 718 -Removed language referring to sharing of color buffers when
nuclear@6 719 pixmaps are bound to textures.
nuclear@6 720 -Updated issues.
nuclear@6 721
nuclear@6 722 5. 13 Dec 2005 - JamesJ
nuclear@6 723 -Removed cube map support and rendering to multiple mipmap
nuclear@6 724 levels support.
nuclear@6 725
nuclear@6 726 6. 20 Jan 2006 - JamesJ
nuclear@6 727 -Specified textures are y-inverted.
nuclear@6 728
nuclear@6 729 7. 23 Jan 2006 - AaronP
nuclear@6 730 -Fix typos, make some things clearer. Replace ocurrences of "released
nuclear@6 731 back to the drawable" with "released".
nuclear@6 732
nuclear@6 733 8. 01 Feb 2006 - AndyR
nuclear@6 734 -Fix minor typos.
nuclear@6 735
nuclear@6 736 9. 03 Feb 2006 - JamesJ
nuclear@6 737 -Added some new issues and their resolutions.
nuclear@6 738 -Finalized some issues that had been in discussion.
nuclear@6 739 -Made drawable y-inversion a queryable attribute of the drawable.
nuclear@6 740 -Moved detailed explanation of y-inverted addressing to the issues
nuclear@6 741 section
nuclear@6 742 -Updated example to demonstrate proper use of the y-inverted
nuclear@6 743 attribute.
nuclear@6 744
nuclear@6 745 10. 06 Feb 2006 - DavidR
nuclear@6 746 -Made GLX_Y_INVERTED_EXT an FBConfig attribute instead of a drawable
nuclear@6 747 attribute.
nuclear@6 748 -Removed GLX_TEXTURE_CUBE_MAP_EXT.
nuclear@6 749 -Fix minor typo.
nuclear@6 750
nuclear@6 751 11. 07 Feb 2006 - JamesJ
nuclear@6 752 -Added description of GLX_Y_INVERTED_EXT GLXFBConfig attribute, based
nuclear@6 753 on description of the drawable attribute of the same name from
nuclear@6 754 and earlier version of the specification.
nuclear@6 755 -Removed language requiring applications to re-bind a pixmap to a
nuclear@6 756 texture to gurantee contents of the texture are updated after a
nuclear@6 757 pixmap has been rendered to.
nuclear@6 758 -Added Aaron Plattner and Andy Ritger to contributors section.
nuclear@6 759
nuclear@6 760 12. 14 Feb 2006 - JamesJ
nuclear@6 761 -Disallowed rendering to a drawable while it is bound as a texture
nuclear@6 762 and defined the exact contents of a texture after a drawable has
nuclear@6 763 been bound to it.
nuclear@6 764
nuclear@6 765 13. 09 Mar 2006 - JamesJ
nuclear@6 766 -Add a context tag member to the vendor private requests. This field
nuclear@6 767 is part of the vendor private header, and is needed to specify which
nuclear@6 768 context the BindTexImageEXT and ReleaseTexImageEXT requests correspond
nuclear@6 769 to.
nuclear@6 770 -Changed texture target bitfield values to not skip numbers removed in
nuclear@6 771 earlier updates.
nuclear@6 772
nuclear@6 773 14. 13 Mar 2006 - JamesJ
nuclear@6 774 -Only require GLX_SGIX_fbconfig + GLX 1.2.
nuclear@6 775 -Clarify language regarding the result of rendering to drawables bound
nuclear@6 776 to textures.
nuclear@6 777 -Added GLX_FRONT_EXT and GLX_BACK_EXT tokens.
nuclear@6 778
nuclear@6 779 15. 18 Apr 2006 - JamesJ
nuclear@6 780 -Allocated enum values and opcodes.
nuclear@6 781 -Require GLX 1.3. GLX_SGIX_fbconfig doesn't allow creating pixmaps
nuclear@6 782 with attributes.
nuclear@6 783 -Added more arguments for not supporting rendering to multiple levels
nuclear@6 784 of a texture with this extension.
nuclear@6 785 -Fixed the inconsistencies in the return type of glXBindTexImageEXT
nuclear@6 786 and glXReleaseTexImageEXT. It is now listed as void throughout.
nuclear@6 787
nuclear@6 788 16. 12 Sep 2006 - JamesJ
nuclear@6 789 -Fix ordering of GLX protocol
nuclear@6 790
nuclear@6 791 17. 10 Feb 2009 - Jon Leech
nuclear@6 792 -Fix typo reported by Jonathan Knispel.