GLX_MESA_render_texture

David Reveman davidr at novell.com
Tue Jun 7 17:59:42 PDT 2005


I've implemented "render texture"-like support in Xgl. I've used the
GLX_MESA_render_texture name for now but I'm not even sure that we want
to call it something with render_texture.

When we've figured out an appropriate way for supporting direct
rendering with Xgl we might have a better solution for allowing a client
to bind a redirected window to a texture. However, this seems to be a
good solution, at least for now.

The server-side implementation is already in CVS. The attached patch
will add necessary client-side code to Mesa. glXQueryDrawable is
required but to avoid implementing GLX 1.3 support in the server just to
get this running I've added a glXQueryDrawableMESA to the extension for
now. This should of course be removed once we have GLX 1.3 support in
the server.

Vendor private opcodes and enumeration values are completely bogus right
now. I should be using temporary enumeration values in the range
[0x6000,0x7FFF] during development, right? How about vendor private
opcodes? Are there any temporary opcodes that can be used for
development?

The attached patch to glxproto.h will define the vendor private opcodes
I'm currently using.

I've created a very preliminary specification for
GLX_MESA_render_texture, just so that we have something to start from.
I've attached a copy of it. There's some example code in it for those of
you who are interested in how this extensions is supposed to be used.

The current implementation works surprisingly well. I've implemented a
OpenGL compositing manager with some simple but nice effects. It works
very well and I'm actually using Xgl and this compositing manager for
everyday work now. Those of you who went to GUADEC last week had the
chance to see this in action during the Lightning Talks.

The OpenGL compositing manager isn't available from anywhere yet. As
soon as I've cleaned it up a little, I'll add it to
cvs.freedesktop.org:/cvs/xapps.

-David
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mesa-glx-x11-render-texture.diff
Type: text/x-patch
Size: 4810 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg/attachments/20050608/b10682ba/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: glxproto.h-mesa-render-texture.diff
Type: text/x-patch
Size: 452 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg/attachments/20050608/b10682ba/attachment-0001.bin>
-------------- next part --------------
Name

    MESA_render_texture

Name Strings

    GLX_MESA_render_texture

Contact

    David Reveman

    To discuss, join the dri-egl at lists.freedesktop.org list.

Status

    Preliminary - totally subject to change.
    Implemented in Xgl

Version

    1 (7 June 2005)

Number

    TBD

Dependencies

    OpenGL 1.1 is required.
    May be implemented in any version of GLX.
    GL_ARB_texture_rectangle affects the definition of this extension.
    
Overview

    This extension allows a color buffer to be used for both rendering and
    texturing. When a color buffer is bound to a texture target it cannot 
    be rendered to. Once it has been released from the texture it can be 
    rendered to once again.

    The functionality of this extension is similar to WGL_ARB_render_texture. 
    However, the purpose of this extension is not to provide 
    "render to texture" like functionality but rather the ability to bind
    an existing window system drawable to a texture. Though, there
    is nothing that prohibits it from being used for "render to texture".

    This extension is based on WGL_ARB_render_texture. However, some changes
    were made to make it better fit the new purpose and make implementation
    easier:

    -   Not only color buffers of a pbuffer can be bound as a texture. 
        Color buffers of any GLXDrawable can be bound.

    -   The requirement that the application must release the color buffer
        from the texture before it can render to the drawable again only
        applies to drawing using contexts that share this texture.

Issues

    1. What should this extension be called?

    .


    2. Do we need a glXDrawableAttribMESA?

    Yes, clients should be able to select texture target using it. However,
    there will be no garantee that a requested target can be used. Current
    texture target must always be queried using glXQueryDrawable. 


    3. Should glXQueryDrawableMESA be removed?

    Yes, and GLX 1.3 will be required.


    4. Should we support everything that WGL_ARB_render_texture supports
       or should we try to keep this extensions minimal?
       GL_ARB_texture_cube_map? 1D textures? mipmapping?

    .


New Procedures and Functions

    Bool glXBindTexImageMESA (Display     *display, 
                              GLXDrawable drawable, 
                              int         buffer)

    Bool glXReleaseTexImageMESA (Display     *display, 
                                 GLXDrawable drawable, 
                                 int         buffer)

    Bool glXQueryDrawableMESA (Display      *display,
                               GLXDrawable  drawable,
                               int          attribute,
                               unsigned int *value) 

New Tokens

    GLX_FRONT_LEFT_MESA                 0x????
    GLX_FRONT_RIGHT_MESA                0x????
    GLX_BACK_LEFT_MESA                  0x????
    GLX_BACK_RIGHT_MESA                 0x????
    GLX_AUX0_MESA                       0x???? 
    GLX_AUX1_MESA                       0x???? 
    GLX_AUX2_MESA                       0x???? 
    GLX_AUX3_MESA                       0x???? 
    GLX_AUX4_MESA                       0x???? 
    GLX_AUX5_MESA                       0x???? 
    GLX_AUX6_MESA                       0x????
    GLX_AUX7_MESA                       0x???? 
    GLX_AUX8_MESA                       0x???? 
    GLX_AUX9_MESA                       0x????

    GLX_TEXTURE_TARGET_MESA             0x????
    GLX_TEXTURE_2D_MESA                 0x????
    GLX_TEXTURE_RECTANGLE_MESA          0x????
    GLX_NO_TEXTURE_RECTANGLE_MESA       0x????

GLX Protocol

    Three new GLX protocol commands are added.

        BindTexImageMESA
            1           CARD8           opcode (X assigned)
            1           16              GLX opcode (glXVendorPrivateWithReply)
            2           8               request length
            4           65544           vendor specific opcode
            4           GLX_DRAWABLE    drawable
            4           INT32           buffer

        ReleaseTexImageMESA
            1           CARD8           opcode (X assigned)
            1           16              GLX opcode (glXVendorPrivateWithReply)
            2           4               request length
            4           65544           vendor specific opcode
            4           GLX_DRAWABLE    drawable
            4           INT32           buffer

        QueryDrawableMESA
            1           CARD8           opcode (X assigned)
            1           16              GLX opcode (glXVendorPrivateWithReply)
            2           4               request length
            4           65544           vendor specific opcode
            4           GLX_DRAWABLE    drawable
            4           INT32           attribute

Errors

    .


Usage Examples

    Example 1: Bind redirected window to texture:

    XGetWindowAttributes (display, window, &attrib);

    templ.visualid = XVisualIDFromVisual (attrib.visual);
    visinfo = XGetVisualInfo (display, VisualIDMask, &templ, &n_items);

    glXGetConfig (display, visinfo, GLX_USE_GL, &value);
    if (value == False)
        return ERROR_CODE_1;

    pixmap = XCompositeNameWindowPixmap (display, window);
    glxpixmap = glXCreateGLXPixmap (display, visinfo, pixmap);
    status = glXQueryDrawableMESA (display, glxpixmap, 
                                   GLX_TEXTURE_TARGET_MESA,
                                   &value);
    if (status != TRUE)
	return ERROR_CODE_2;

    if (value == GLX_TEXTURE_2D_MESA)
	target = GL_TEXTURE_2D;
    else if (value == GLX_TEXTURE_RECTANGLE_MESA)
	target = GL_TEXTURE_RECTANGLE_ARB;
    else /* window can't be bound to texture */
        return ERROR_CODE_3;

    glGenTextures (1, &texture);
    glBindTexture (target, texture);

    status = glXBindTexImageMESA (display, glxpixmap, GLX_FRONT_LEFT_MESA);
    if (status != TRUE)
	return ERROR_CODE_4;

    glTexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);


Version History

    1. 7 June 2005 - DavidR
        Initial version


More information about the xorg mailing list