RFC: OpenGL + XvMC

2003-05-31 Thread Mark Vojkovich
   I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
to XvMC.  I have implemented this in NVIDIA's binary drivers and
am able to do full framerate HDTV video textures on the higher end
GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
contents into a texture.


Status
XvMCCopySurfaceToGLXPbuffer (
  Display *display,
  XvMCSurface *surface,
  XID pbuffer_id,
  short src_x,
  short src_y,
  unsigned short width,
  unsigned short height,
  short dst_x,
  short dst_y,
  int flags
);

   This function copies the rectangle specified by src_x, src_y, width,
  and height from the XvMCSurface denoted by "surface" to offset dst_x, dst_y 
  within the pbuffer identified by its GLXPbuffer XID "pbuffer_id".
  Note that while the src_x, src_y are in XvMC's standard left-handed
  coordinate system and specify the upper left hand corner of the
  rectangle, dst_x and dst_y are in OpenGL's  right-handed coordinate 
  system and denote the lower left hand corner of the destination 
  rectangle in the pbuffer.

"Flags" may be XVMC_TOP_FIELD, XVMC_BOTTOM_FIELD or XVMC_FRAME_PICTURE.
  If flags is not XVMC_FRAME_PICTURE, the src_y and height are in field
  coordinates, not frame.  That is, the total copyable height is half
  the height of the XvMCSurface.  

XvMCCopySurfaceToGLXPbuffer does not return until the copy to the
  pbuffer has completed.  XvMCCopySurfaceToGLXPbuffer is pipelined
  with XvMCRenderSurface so no explicit synchronization between 
  XvMCRenderSurface and XvMCCopySurfaceToGLXPbuffer is needed.
  
The pbuffer must be of type GLX_RGBA, and the destination of the
  copy is the left front buffer of the pbuffer.  Success is returned
  if no error occured, the error code is returned otherwise.

Possible Errors:

   XvMCBadSurface - The surface is invalid.

   BadDrawable - The pbuffer_id is not a valid pbuffer.

   BadMatch - The pbuffer is not of type GLX_RGBA or the
  pbuffer does not have a front left buffer.

  XvMCCopySurfaceToGLXPbuffer is supported if the following flag:

#define XVMC_COPY_TO_PBUFFER 0x0010

  is set in the XvMCSurfaceInfo's flags field.

  I'd like to bump the API version up to 1.1 and add this.  
Comments?


Mark.

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


RE: OpenGL + XvMC

2003-06-03 Thread Sottek, Matthew J
Let me preface my comment with "I don't know a lot about OGL" so some
further clarification may be needed.

I am assuming that pbuffers are basically buffers that can be used
as textures by OGL. I would then assume that the OGL driver would
have some mapping of pbuffer id to the texture memory it represents,
maybe this memory is in video memory maybe it has been "swapped out"
so-to-speak by some texture manager etc.

So basically this copies data from an XvMC offscreen surface to an
OGL offscreen surface to be used by OGL for normal rendering purposes.
Seems easy enough... I expect anyone doing XvMC would use the drm
for the direct access (or their own drm equivalent) which would also
be the same drm used for OGL and therefore whatever texture management
needs to be done should be possible without much of a problem.

My main problem with the concept is that it seems that a copy is not
always required, and is costly at 24fps. For YUV packed surfaces at
least, an XvMC surface could be directly used as a texture. Some way
to associate an XvMC surface with a pbuffer without a copy seems
like something that would have a large performance gain.

Also, what is the goal exactly? Are you trying to allow video to be
used as textures within a 3d rendered scene, or are your trying to
make it possible to do something like Xv, but using direct rendering
and 3d hardware?

If you are trying to do the latter, it seems far easier to just plug
your XvMC extension into the 3d engine rather than into the overlay. I think
you've done the equivalent with Xv already.

-Matt


-Original Message-
From: Mark Vojkovich [mailto:[EMAIL PROTECTED] 
Sent: Friday, May 30, 2003 4:30 PM
To: [EMAIL PROTECTED]
Subject: RFC: OpenGL + XvMC


   I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
to XvMC.  I have implemented this in NVIDIA's binary drivers and
am able to do full framerate HDTV video textures on the higher end
GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
contents into a texture.


Status
XvMCCopySurfaceToGLXPbuffer (
  Display *display,
  XvMCSurface *surface,
  XID pbuffer_id,
  short src_x,
  short src_y,
  unsigned short width,
  unsigned short height,
  short dst_x,
  short dst_y,
  int flags
);

   This function copies the rectangle specified by src_x, src_y, width,
  and height from the XvMCSurface denoted by "surface" to offset dst_x,
dst_y 
  within the pbuffer identified by its GLXPbuffer XID "pbuffer_id".
  Note that while the src_x, src_y are in XvMC's standard left-handed
  coordinate system and specify the upper left hand corner of the
  rectangle, dst_x and dst_y are in OpenGL's  right-handed coordinate 
  system and denote the lower left hand corner of the destination 
  rectangle in the pbuffer.

"Flags" may be XVMC_TOP_FIELD, XVMC_BOTTOM_FIELD or XVMC_FRAME_PICTURE.
  If flags is not XVMC_FRAME_PICTURE, the src_y and height are in field
  coordinates, not frame.  That is, the total copyable height is half
  the height of the XvMCSurface.  

XvMCCopySurfaceToGLXPbuffer does not return until the copy to the
  pbuffer has completed.  XvMCCopySurfaceToGLXPbuffer is pipelined
  with XvMCRenderSurface so no explicit synchronization between 
  XvMCRenderSurface and XvMCCopySurfaceToGLXPbuffer is needed.
  
The pbuffer must be of type GLX_RGBA, and the destination of the
  copy is the left front buffer of the pbuffer.  Success is returned
  if no error occured, the error code is returned otherwise.

Possible Errors:

   XvMCBadSurface - The surface is invalid.

   BadDrawable - The pbuffer_id is not a valid pbuffer.

   BadMatch - The pbuffer is not of type GLX_RGBA or the
  pbuffer does not have a front left buffer.

  XvMCCopySurfaceToGLXPbuffer is supported if the following flag:

#define XVMC_COPY_TO_PBUFFER 0x0010

  is set in the XvMCSurfaceInfo's flags field.

  I'd like to bump the API version up to 1.1 and add this.  
Comments?


Mark.

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel
___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: OpenGL + XvMC

2003-06-03 Thread Ian Romanick
Sottek, Matthew J wrote:
Let me preface my comment with "I don't know a lot about OGL" so some
further clarification may be needed.
I am assuming that pbuffers are basically buffers that can be used
as textures by OGL. I would then assume that the OGL driver would
have some mapping of pbuffer id to the texture memory it represents,
maybe this memory is in video memory maybe it has been "swapped out"
so-to-speak by some texture manager etc.
A pbuffer is (basically) just an off-screen window.  You can do the same 
things to a pbuffer that you can do to a normal window.  This includes 
copying its contents to a texture.  There was a proposal to bring 
WGL_render_texture to GLX, but, in light of other developments, there 
wasn't much interest.  It *may* be resurrected at some point for 
completeness sake, but I wouldn't hold my breath.

So basically this copies data from an XvMC offscreen surface to an
OGL offscreen surface to be used by OGL for normal rendering purposes.
Seems easy enough... I expect anyone doing XvMC would use the drm
for the direct access (or their own drm equivalent) which would also
be the same drm used for OGL and therefore whatever texture management
needs to be done should be possible without much of a problem.
Well, except that, at least in the open-source DRI based drivers, the 
texture memory manager doesn't live in the DRM (anymore than malloc and 
free live in the kernel).

My main problem with the concept is that it seems that a copy is not
always required, and is costly at 24fps. For YUV packed surfaces at
least, an XvMC surface could be directly used as a texture. Some way
to associate an XvMC surface with a pbuffer without a copy seems
like something that would have a large performance gain.
It *may* not always be required.  There have been GLX extensions in the 
past (see my first message in this thread) that worked that way. 
However, as we discussed earlier, this doesn't seem to work so well with 
MPEG video files.  The main problem being that you don't get the frames 
exactly in order.  You're stuck doing a copy either way.

Also, what is the goal exactly? Are you trying to allow video to be
used as textures within a 3d rendered scene, or are your trying to
make it possible to do something like Xv, but using direct rendering
and 3d hardware?
If you are trying to do the latter, it seems far easier to just plug
your XvMC extension into the 3d engine rather than into the overlay. I think
you've done the equivalent with Xv already.
I think the goal is to be able to do both.  Although, the idea of using 
MPEG video files as animated textures in a game is pretty cool. :)

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


RE: OpenGL + XvMC

2003-06-03 Thread Mark Vojkovich
On Mon, 2 Jun 2003, Sottek, Matthew J wrote:

> 
> Let me preface my comment with "I don't know a lot about OGL" so some
> further clarification may be needed.
> 
> I am assuming that pbuffers are basically buffers that can be used
> as textures by OGL. I would then assume that the OGL driver would
> have some mapping of pbuffer id to the texture memory it represents,
> maybe this memory is in video memory maybe it has been "swapped out"
> so-to-speak by some texture manager etc.

   A pbuffer is a GLXDrawable like a window is.  You can make
current on it and draw to it.  The intention of pbuffers is that
they're always in hardware.


> 
> So basically this copies data from an XvMC offscreen surface to an
> OGL offscreen surface to be used by OGL for normal rendering purposes.
> Seems easy enough... I expect anyone doing XvMC would use the drm
> for the direct access (or their own drm equivalent) which would also
> be the same drm used for OGL and therefore whatever texture management
> needs to be done should be possible without much of a problem.
> 
> My main problem with the concept is that it seems that a copy is not
> always required, and is costly at 24fps. For YUV packed surfaces at
> least, an XvMC surface could be directly used as a texture. Some way
> to associate an XvMC surface with a pbuffer without a copy seems
> like something that would have a large performance gain.

   Can you use those non-power-of-two mpeg surfaces as normal
textures without limitations?  I don't think most hardware can
do that, some possibly can't at all.

   I expect binding an XvMC surface as a texture isn't implementable
without limitations on most hardware.  It also requires that OpenGL do
all the work for this since XvMC doesn't have access to OpenGL's texture
namespace.  It would also require cooperation between OpenGL and XvMC 
that makes me nervous.  OpenGL would have to make sure that XvMC's
Surface didn't go away while it was using it as a texture.  An
explict copy from the XvMCSurface to a pbuffer solves these problems
with the cost of the extra copy, which at least for my hardware,
isn't a big issue.

> Also, what is the goal exactly? 

   I am interested in getting mpeg into textures for the purpose
of incorporating into 3D scenes and video editing/post production.


Mark.

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: OpenGL + XvMC

2003-06-03 Thread Benjamin Herrenschmidt
> It *may* not always be required.  There have been GLX extensions in the 
> past (see my first message in this thread) that worked that way. 
> However, as we discussed earlier, this doesn't seem to work so well with 
> MPEG video files.  The main problem being that you don't get the frames 
> exactly in order.  You're stuck doing a copy either way.

Why ? You have usually enough video/AGP/whatever texture memory to
store multiple frames. I haven't looked at XvMc, but there is a
difference between rendering frames and scheduling them for display,
you render them to multiple buffers and schedule display when your
next expected display frame is ready.

I completely agree that it's a big waste to still have a copy in
cases where the HW let you avoid it

Ben.

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


RE: OpenGL + XvMC

2003-06-04 Thread Sottek, Matthew J
>Well, except that, at least in the open-source DRI based drivers, the 
>texture memory manager doesn't live in the DRM (anymore than malloc and 
>free live in the kernel).

The texture manager itself may not but the drm is the arbitrator. As
I understand it the app takes the lock and then manages the texture
memory itself. The "good neighbor" approach, where the supervisor
process just controls the locks and the apps are expected to play
nice. An XvMC app can "play nice" by the same rules as the OGL app.

The point was that there are no real technical roadblocks to making
an direct rendered XvMC application use the same texture manager.

>It *may* not always be required.  There have been GLX extensions in the 
>past (see my first message in this thread) that worked that way. 
>However, as we discussed earlier, this doesn't seem to work so well
>with  MPEG video files.  The main problem being that you don't get
>the frames exactly in order.  You're stuck doing a copy either way.

That is only a problem if you want to connect a "stream" of data
to a texture. I.e. just bind an XvMC stream to a texture and have
it auto-update. That is nearly impossible...

XvMC has individual surfaces for each frame. The surfaces "live" for
the life of the decode, they are not freed when the frame is done
being displayed. So you have maybe 6 XvMC surfaces that you use
again and again. That surface may, on some hardware, be directly
usable with the 3d engine without a needed copy.

>I think the goal is to be able to do both.  Although, the idea of using 
>MPEG video files as animated textures in a game is pretty cool. :)

Mpeg in textures is a cool idea, and something of this nature would
be needed for that. Using 3d hardware to display the video doesn't
need this concept and due to the surface copy is probably drastically
slower than using XvMC without OGL and just hooking it's final
on-screen render up to the XvMCPutSurface.


___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel
___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


RE: OpenGL + XvMC

2003-06-04 Thread Sottek, Matthew J
>   Can you use those non-power-of-two mpeg surfaces as normal
>textures without limitations?  I don't think most hardware can
>do that, some possibly can't at all.

Well for one thing my XvMC surfaces ARE power of two, but that is
not the point. The HWMC engine used the very same texture engine
as is used for 3d. So while the planar surfaces are not _great_
for use as textures it can be done. It is probably just as
much bandwidth due to an internal conversion but the YUV planar
to YUV packed conversion could happen render time into a temporary
buffer.

In the end, I think this is more of a neat trick than anything else
so I don't think it matters a whole lot if there is an extra copy.

I keep thinking that some sort of Direct Rendered Video extension
would be very useful for X. You could then alloc a direct video
surface that was mappable. Populate it from the final write in
the decode process (From ANY codec) then either do a Put() a
Blend() or a CopytoPBuffer().  The CopytoPBuffer() may be
unnecessary if you could do a CreatePBufferFromXvD() to share
the surface. In such a scenario I think the ability to save the
copy is quite important.

>   I am interested in getting mpeg into textures for the purpose
>of incorporating into 3D scenes and video editing/post production.


___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-06 Thread Mark Vojkovich
  Here is the latest version of the proposed change to the XvMC
API specification:

Status
XvMCCopySurfaceToGLXPbuffer (
  Display *display,
  XvMCSurface *surface,
  XID pbuffer_id,
  short src_x,
  short src_y,
  unsigned short width,
  unsigned short height,
  short dst_x,
  short dst_y,
  unsigned int draw_buffer,
  int flags
);

   This function copies a rectangle of dimension "width" by "height" 
  from the XvMCSurface indicated by "surface" to the GLXPbuffer 
  identified by its XID "pbuffer_id".  The locations of source and
  destination rectangles are specified differently for the XvMCSurface
  source and the GLXPbuffer destination as follows.  On the XvMCSurface,
  the rectangle location is specified in the usual X-Window fashion
  with src_x and src_y indicating the location of the upper left hand
  corner of the rectangle relative to the XvMCSurface origin (the upper
  left hand corner of the XvMCSurface with positive Y axis going in the
  down direction).  On the GLXPbuffer the rectangle location is 
  specified in the usual OpenGL fashion with the dst_x and dst_y
  indicating the location of the lower left hand corner of the
  rectangle relative to the GLXPbuffer origin (the lower left hand
  corner of the GLXPbuffer with the positive Y axis going in the
  up direction).

The "draw_buffer" takes the same OpenGL enums that glDrawBuffer()
  takes (ie. GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT, GL_BACK_RIGHT,
  GL_FRONT, GL_BACK, GL_LEFT, GL_RIGHT or GL_FRONT_AND_BACK).  This
  indicates which buffer of the GLXPbuffer is to be used for the
  destination of the copy.  Buffers specified in the "draw_buffer"
  that do not exist in the GLXPbuffer are ignored.

"Flags" may be XVMC_TOP_FIELD, XVMC_BOTTOM_FIELD or XVMC_FRAME_PICTURE.
  If flags is not XVMC_FRAME_PICTURE, the src_y and height are in field
  coordinates, not frame.  That is, the total copyable height is half
  the height of the XvMCSurface.

XvMCCopySurfaceToGLXPbuffer does not return until the copy to the
  pbuffer has completed.  XvMCCopySurfaceToGLXPbuffer is pipelined
  with XvMCRenderSurface so no explicit synchronization between
  XvMCRenderSurface and XvMCCopySurfaceToGLXPbuffer is needed.

The pbuffer must be of type GLX_RGBA.  Success is returned if
  no error occured, the error code is returned otherwise.

Possible Errors:

   XvMCBadSurface - The surface is invalid.

   BadDrawable - The pbuffer_id is not a valid pbuffer.

   BadMatch - The pbuffer is not of type GLX_RGBA.

  XvMCCopySurfaceToGLXPbuffer is supported if the following flag:
 
#define XVMC_COPY_TO_PBUFFER 0x0010

  is set in the XvMCSurfaceInfo's flags field.


___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-05-31 Thread Ian Romanick
Mark Vojkovich wrote:
   I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
to XvMC.  I have implemented this in NVIDIA's binary drivers and
am able to do full framerate HDTV video textures on the higher end
GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
contents into a texture.
This shoulds like a good candidate for a GLX extension.  I've been 
wondering when someone would suggest somthing like this. :)  Although, I 
did expect it to come from someone doing video capture work first.

Over the years there have been a couple extensions for doing things 
this, both from SGI.  They both work by streaming video data into a new 
type of GLX drawable and use that to source pixel / texel data.

  http://oss.sgi.com/projects/ogl-sample/registry/SGIX/video_source.txt
  http://oss.sgi.com/projects/ogl-sample/registry/SGIX/dmbuffer.txt
The function that you're suggesting here is a clear break from that.  I 
don't think that's a bad thing.  I suspect that you designed it this way 
so that the implementation would not have to live in the GLX subsystem 
or in the 3D driver, correct?

With slightly closer integration between XvMC and the 3D driver, we 
ought to be able to do something along those lines.  Basically, bind a 
XvMCSurface to a pbuffer.  Then, each time a new frame of video is 
rendered the pbuffer would be automatically updated.  Given the way the 
XvMC works, I'm not sure how well that would work, though.  I'll have to 
think on it some more.

Status
XvMCCopySurfaceToGLXPbuffer (
  Display *display,
  XvMCSurface *surface,
  XID pbuffer_id,
  short src_x,
  short src_y,
  unsigned short width,
  unsigned short height,
  short dst_x,
  short dst_y,
  int flags
);
One quick comment.  Don't use 'short', use 'int'.  On every existing and 
future platform that we're likely to care about the shorts will take up 
as much space as an int on the stack anyway, and slower / larger / more 
instructions will need to be used to access them.

   This function copies the rectangle specified by src_x, src_y, width,
  and height from the XvMCSurface denoted by "surface" to offset dst_x, dst_y 
  within the pbuffer identified by its GLXPbuffer XID "pbuffer_id".
  Note that while the src_x, src_y are in XvMC's standard left-handed
  coordinate system and specify the upper left hand corner of the
  rectangle, dst_x and dst_y are in OpenGL's  right-handed coordinate 
  system and denote the lower left hand corner of the destination 
  rectangle in the pbuffer.
This conceptually concerns me.  Mixing coordinate systems is usually a 
bad call, and is likely to confuse developers.  I assume this means that 
the image is implicitly inverted?  Hmm...

"Flags" may be XVMC_TOP_FIELD, XVMC_BOTTOM_FIELD or XVMC_FRAME_PICTURE.
  If flags is not XVMC_FRAME_PICTURE, the src_y and height are in field
  coordinates, not frame.  That is, the total copyable height is half
  the height of the XvMCSurface.  

XvMCCopySurfaceToGLXPbuffer does not return until the copy to the
  pbuffer has completed.  XvMCCopySurfaceToGLXPbuffer is pipelined
  with XvMCRenderSurface so no explicit synchronization between 
  XvMCRenderSurface and XvMCCopySurfaceToGLXPbuffer is needed.
  
The pbuffer must be of type GLX_RGBA, and the destination of the
  copy is the left front buffer of the pbuffer.  Success is returned
  if no error occured, the error code is returned otherwise.
This goes against common practice.  The copy should obey the setting of 
glDrawBuffer.  I assume you must have had some reason for doing this...I 
just can't imagine what it was. :)

Possible Errors:

   XvMCBadSurface - The surface is invalid.

   BadDrawable - The pbuffer_id is not a valid pbuffer.

   BadMatch - The pbuffer is not of type GLX_RGBA or the
  pbuffer does not have a front left buffer.
  XvMCCopySurfaceToGLXPbuffer is supported if the following flag:

#define XVMC_COPY_TO_PBUFFER 0x0010

  is set in the XvMCSurfaceInfo's flags field.

  I'd like to bump the API version up to 1.1 and add this.  
Comments?
___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-05-31 Thread Mark Vojkovich
On Fri, 30 May 2003, Ian Romanick wrote:

> Mark Vojkovich wrote:
> >I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
> > to XvMC.  I have implemented this in NVIDIA's binary drivers and
> > am able to do full framerate HDTV video textures on the higher end
> > GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
> > contents into a texture.
> 
> This shoulds like a good candidate for a GLX extension.  I've been 
> wondering when someone would suggest somthing like this. :)  Although, I 
> did expect it to come from someone doing video capture work first.

   I wanted to avoid something from the GLX side.  Introducing the
concept of an XFree86 video extension buffer to GLX seemed like a hard
sell.  Introducting a well establish GLX drawable type to XvMC 
seemed more reasonable.


> 
> Over the years there have been a couple extensions for doing things 
> this, both from SGI.  They both work by streaming video data into a new 
> type of GLX drawable and use that to source pixel / texel data.
> 
>http://oss.sgi.com/projects/ogl-sample/registry/SGIX/video_source.txt
>http://oss.sgi.com/projects/ogl-sample/registry/SGIX/dmbuffer.txt
> 
> The function that you're suggesting here is a clear break from that.  I 
> don't think that's a bad thing.  I suspect that you designed it this way 
> so that the implementation would not have to live in the GLX subsystem 
> or in the 3D driver, correct?

   That was one of the goals.   I generally view trying to bind 
a video-specific buffer to an OpenGL buffer as a bad idea since they
always end up as second class.  While there have been implementations
that could use video buffers as textures, etc... they've always had
serious limitations like the inability to have mipmaps, or repeat, or
limited filtering ability or other disapointing things that people
are sad to learn about.  I opted instead for an explicit copy from
a video-specific surface to a first-class OpenGL drawable.  Being
able to do HDTV video textures on a P4 1.2 Gig PC with a $100 video
card has show this to be a reasonable tradeoff.

> 
> With slightly closer integration between XvMC and the 3D driver, we 
> ought to be able to do something along those lines.  Basically, bind a 
> XvMCSurface to a pbuffer.  Then, each time a new frame of video is 
> rendered the pbuffer would be automatically updated.  Given the way the 
> XvMC works, I'm not sure how well that would work, though.  I'll have to 
> think on it some more.

   Mpeg frames are displayed in a different order than they are
rendered.  It's best if the decoder has full control over what goes
where and when.

> 
> > Status
> > XvMCCopySurfaceToGLXPbuffer (
> >   Display *display,
> >   XvMCSurface *surface,
> >   XID pbuffer_id,
> >   short src_x,
> >   short src_y,
> >   unsigned short width,
> >   unsigned short height,
> >   short dst_x,
> >   short dst_y,
> >   int flags
> > );
> 
> One quick comment.  Don't use 'short', use 'int'.  On every existing and 
> future platform that we're likely to care about the shorts will take up 
> as much space as an int on the stack anyway, and slower / larger / more 
> instructions will need to be used to access them.

   This is an X-window extension.  It's limited to the signed 16 bit
coordinate system like the X-window system itself, all of Xlib and
the rest of XvMC.

> 
> >This function copies the rectangle specified by src_x, src_y, width,
> >   and height from the XvMCSurface denoted by "surface" to offset dst_x, dst_y 
> >   within the pbuffer identified by its GLXPbuffer XID "pbuffer_id".
> >   Note that while the src_x, src_y are in XvMC's standard left-handed
> >   coordinate system and specify the upper left hand corner of the
> >   rectangle, dst_x and dst_y are in OpenGL's  right-handed coordinate 
> >   system and denote the lower left hand corner of the destination 
> >   rectangle in the pbuffer.
> 
> This conceptually concerns me.  Mixing coordinate systems is usually a 
> bad call, and is likely to confuse developers.  I assume this means that 
> the image is implicitly inverted?  Hmm...

   X is left handed.  OpenGL is right handed.  Addressing a pbuffer
in anything other than a right handed coordinate system is perverse.
Mixed coordinate systems seems a necessity here.

   There is no inversion, it's just a remap of the origins.

> 
> > "Flags" may be XVMC_TOP_FIELD, XVMC_BOTTOM_FIELD or XVMC_FRAME_PICTURE.
> >   If flags is not XVMC_FRAME_PICTURE, the src_y and height are in field
> >   coordinates, not frame.  That is, the total copyable height is half
> >   the height of the XvMCSurface.  
> > 
> > XvMCCopySurfaceToGLXPbuffer does not return until the copy to the
> >   pbuffer has completed.  XvMCCopySurfaceToGLXPbuffer is pipelined
> >   with XvMCRenderSurface so no explicit synchronization between 
> >   XvMCRenderSurface and XvMCCopySurfaceToGLXPbuffer is needed.
> >   
> > The pbuffer must be of type GLX_RGBA, and the destinati

Re: RFC: OpenGL + XvMC

2003-06-01 Thread Ian Romanick
Mark Vojkovich wrote:
On Fri, 30 May 2003, Ian Romanick wrote:

Mark Vojkovich wrote:

  I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
to XvMC.  I have implemented this in NVIDIA's binary drivers and
am able to do full framerate HDTV video textures on the higher end
GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
contents into a texture.
This shoulds like a good candidate for a GLX extension.  I've been 
wondering when someone would suggest somthing like this. :)  Although, I 
did expect it to come from someone doing video capture work first.
   I wanted to avoid something from the GLX side.  Introducing the
concept of an XFree86 video extension buffer to GLX seemed like a hard
sell.  Introducting a well establish GLX drawable type to XvMC 
seemed more reasonable.
Right.  I thought about this a bit more last night.  A better approach 
might be to expose this functionality as an XFree86 extension, then 
create a GLX extension on top of it.  I was thinking of an extension 
where you would bind a "magic" buffer to a pbuffer, then take a snapshot 
from the input buffer to the pbuffer.  Doing that we could create 
layered extensions for binding v4l streams to pbuffers.  This would be 
like creating a subclass in C++ and just over-riding the virtual 
CaptureImage method.  I think that would be much nicer for application code.

At the same time, all of the real work would still be done in the X 
extension (or v4l).  Only some light-weight bookkeeping would live in GLX.

Over the years there have been a couple extensions for doing things 
this, both from SGI.  They both work by streaming video data into a new 
type of GLX drawable and use that to source pixel / texel data.

  http://oss.sgi.com/projects/ogl-sample/registry/SGIX/video_source.txt
  http://oss.sgi.com/projects/ogl-sample/registry/SGIX/dmbuffer.txt
The function that you're suggesting here is a clear break from that.  I 
don't think that's a bad thing.  I suspect that you designed it this way 
so that the implementation would not have to live in the GLX subsystem 
or in the 3D driver, correct?
   That was one of the goals.   I generally view trying to bind 
a video-specific buffer to an OpenGL buffer as a bad idea since they
always end up as second class.  While there have been implementations
that could use video buffers as textures, etc... they've always had
serious limitations like the inability to have mipmaps, or repeat, or
limited filtering ability or other disapointing things that people
are sad to learn about.  I opted instead for an explicit copy from
a video-specific surface to a first-class OpenGL drawable.  Being
able to do HDTV video textures on a P4 1.2 Gig PC with a $100 video
card has show this to be a reasonable tradeoff.
The reason you would lose mipmaps and most of the texture wrap modes is 
because video streams rarely have power-of-two dimensions.  In the past, 
hardware couldn't do mipmapping or GL_WRAP on non-power-of-two textures. 
 For the most part, without NV_texture_rectangle, you can't even use 
npot textures. :(

With slightly closer integration between XvMC and the 3D driver, we 
ought to be able to do something along those lines.  Basically, bind a 
XvMCSurface to a pbuffer.  Then, each time a new frame of video is 
rendered the pbuffer would be automatically updated.  Given the way the 
XvMC works, I'm not sure how well that would work, though.  I'll have to 
think on it some more.


   Mpeg frames are displayed in a different order than they are
rendered.  It's best if the decoder has full control over what goes
where and when.
Oh.  That does change things a bit.

Status
XvMCCopySurfaceToGLXPbuffer (
 Display *display,
 XvMCSurface *surface,
 XID pbuffer_id,
 short src_x,
 short src_y,
 unsigned short width,
 unsigned short height,
 short dst_x,
 short dst_y,
 int flags
);
One quick comment.  Don't use 'short', use 'int'.  On every existing and 
future platform that we're likely to care about the shorts will take up 
as much space as an int on the stack anyway, and slower / larger / more 
instructions will need to be used to access them.
   This is an X-window extension.  It's limited to the signed 16 bit
coordinate system like the X-window system itself, all of Xlib and
the rest of XvMC.
So?  Just because the values are limited to 16-bit doesn't necessitate 
that they be stored in a memory location that's only 16-bits.  If X were 
being developed from scratch today, instead of calling everything short, 
it would likely be int_fast16_t.  On IA-32, PowerPC, Alpha, SPARC, and 
x86-64, this is int.  Maybe using the C99 types is the right answer anyway.

  This function copies the rectangle specified by src_x, src_y, width,
 and height from the XvMCSurface denoted by "surface" to offset dst_x, dst_y 
 within the pbuffer identified by its GLXPbuffer XID "pbuffer_id".
 Note that while the src_x, src_y are in XvMC's standard left-handed
 coordinate system and specify the upper left hand 

Re: RFC: OpenGL + XvMC

2003-06-01 Thread Mark Vojkovich
On Sat, 31 May 2003, Ian Romanick wrote:

> Mark Vojkovich wrote:
> > On Fri, 30 May 2003, Ian Romanick wrote:
> > 
> >>Mark Vojkovich wrote:
> >>
> >>>   I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
> >>>to XvMC.  I have implemented this in NVIDIA's binary drivers and
> >>>am able to do full framerate HDTV video textures on the higher end
> >>>GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
> >>>contents into a texture.
> >>
> >>This shoulds like a good candidate for a GLX extension.  I've been 
> >>wondering when someone would suggest somthing like this. :)  Although, I 
> >>did expect it to come from someone doing video capture work first.
> > 
> >I wanted to avoid something from the GLX side.  Introducing the
> > concept of an XFree86 video extension buffer to GLX seemed like a hard
> > sell.  Introducting a well establish GLX drawable type to XvMC 
> > seemed more reasonable.
> 
> Right.  I thought about this a bit more last night.  A better approach 
> might be to expose this functionality as an XFree86 extension, then 
> create a GLX extension on top of it.  I was thinking of an extension 
> where you would bind a "magic" buffer to a pbuffer, then take a snapshot 
> from the input buffer to the pbuffer.  Doing that we could create 
> layered extensions for binding v4l streams to pbuffers.  This would be 
> like creating a subclass in C++ and just over-riding the virtual 
> CaptureImage method.  I think that would be much nicer for application code.

   This isn't capture.  It's decode.  XvMC is a video acceleration
architecture not a capture architecture.  Even with capture, HW capture
buffer formats don't always line up nicely with pbuffer or texture formats.

> 
> At the same time, all of the real work would still be done in the X 
> extension (or v4l).  Only some light-weight bookkeeping would live in GLX.
> 
> >>Over the years there have been a couple extensions for doing things 
> >>this, both from SGI.  They both work by streaming video data into a new 
> >>type of GLX drawable and use that to source pixel / texel data.
> >>
> >>   http://oss.sgi.com/projects/ogl-sample/registry/SGIX/video_source.txt
> >>   http://oss.sgi.com/projects/ogl-sample/registry/SGIX/dmbuffer.txt
> >>
> >>The function that you're suggesting here is a clear break from that.  I 
> >>don't think that's a bad thing.  I suspect that you designed it this way 
> >>so that the implementation would not have to live in the GLX subsystem 
> >>or in the 3D driver, correct?
> > 
> >That was one of the goals.   I generally view trying to bind 
> > a video-specific buffer to an OpenGL buffer as a bad idea since they
> > always end up as second class.  While there have been implementations
> > that could use video buffers as textures, etc... they've always had
> > serious limitations like the inability to have mipmaps, or repeat, or
> > limited filtering ability or other disapointing things that people
> > are sad to learn about.  I opted instead for an explicit copy from
> > a video-specific surface to a first-class OpenGL drawable.  Being
> > able to do HDTV video textures on a P4 1.2 Gig PC with a $100 video
> > card has show this to be a reasonable tradeoff.
> 
> The reason you would lose mipmaps and most of the texture wrap modes is 
> because video streams rarely have power-of-two dimensions.  In the past, 

   That's one of the reasons.

> hardware couldn't do mipmapping or GL_WRAP on non-power-of-two textures. 
>   For the most part, without NV_texture_rectangle, you can't even use 
> npot textures. :(

   And NV_texture_rectangle are still second class compared to normal
textures.  No video formats are powers of two, unfortunately.

> 
> >>With slightly closer integration between XvMC and the 3D driver, we 
> >>ought to be able to do something along those lines.  Basically, bind a 
> >>XvMCSurface to a pbuffer.  Then, each time a new frame of video is 
> >>rendered the pbuffer would be automatically updated.  Given the way the 
> >>XvMC works, I'm not sure how well that would work, though.  I'll have to 
> >>think on it some more.
> > 
> > 
> >Mpeg frames are displayed in a different order than they are
> > rendered.  It's best if the decoder has full control over what goes
> > where and when.
> 
> Oh.  That does change things a bit.

   Yes.  It's not capture.  I'm decoding HDTV mpeg2 program streams
from my harddisk.  Normally XvMC would display these in the overlay.
I've made a mechanism to copy to a pbuffer rather than (or in addition
to) displaying in the video overlay.


> 
> >>>Status
> >>>XvMCCopySurfaceToGLXPbuffer (
> >>>  Display *display,
> >>>  XvMCSurface *surface,
> >>>  XID pbuffer_id,
> >>>  short src_x,
> >>>  short src_y,
> >>>  unsigned short width,
> >>>  unsigned short height,
> >>>  short dst_x,
> >>>  short dst_y,
> >>>  int flags
> >>>);
> >>
> >>One quick comment.  Don't use 'short', use 'int'.  On every existing and 
> >>future platform that we're

Re: RFC: OpenGL + XvMC

2003-06-02 Thread Alex Deucher
Just curious, as I'm not too familiar with XvMC yet, but would this
provide another Xv adapter that used the 3D texture engine to display
videos rather than othe video overlay?  or something else.  Sorry for
my ignorance.

Thanks,

Alex

--- Mark Vojkovich <[EMAIL PROTECTED]> wrote:
>I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
> to XvMC.  I have implemented this in NVIDIA's binary drivers and
> am able to do full framerate HDTV video textures on the higher end
> GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
> contents into a texture.
> 
> 
> Status
> XvMCCopySurfaceToGLXPbuffer (
>   Display *display,
>   XvMCSurface *surface,
>   XID pbuffer_id,
>   short src_x,
>   short src_y,
>   unsigned short width,
>   unsigned short height,
>   short dst_x,
>   short dst_y,
>   int flags
> );
> 
>This function copies the rectangle specified by src_x, src_y,
> width,
>   and height from the XvMCSurface denoted by "surface" to offset
> dst_x, dst_y 
>   within the pbuffer identified by its GLXPbuffer XID "pbuffer_id".
>   Note that while the src_x, src_y are in XvMC's standard left-handed
>   coordinate system and specify the upper left hand corner of the
>   rectangle, dst_x and dst_y are in OpenGL's  right-handed coordinate
> 
>   system and denote the lower left hand corner of the destination 
>   rectangle in the pbuffer.
> 
> "Flags" may be XVMC_TOP_FIELD, XVMC_BOTTOM_FIELD or
> XVMC_FRAME_PICTURE.
>   If flags is not XVMC_FRAME_PICTURE, the src_y and height are in
> field
>   coordinates, not frame.  That is, the total copyable height is half
>   the height of the XvMCSurface.  
> 
> XvMCCopySurfaceToGLXPbuffer does not return until the copy to the
>   pbuffer has completed.  XvMCCopySurfaceToGLXPbuffer is pipelined
>   with XvMCRenderSurface so no explicit synchronization between 
>   XvMCRenderSurface and XvMCCopySurfaceToGLXPbuffer is needed.
>   
> The pbuffer must be of type GLX_RGBA, and the destination of the
>   copy is the left front buffer of the pbuffer.  Success is returned
>   if no error occured, the error code is returned otherwise.
> 
> Possible Errors:
> 
>XvMCBadSurface - The surface is invalid.
> 
>BadDrawable - The pbuffer_id is not a valid pbuffer.
> 
>BadMatch - The pbuffer is not of type GLX_RGBA or the
>   pbuffer does not have a front left buffer.
> 
>   XvMCCopySurfaceToGLXPbuffer is supported if the following flag:
> 
> #define XVMC_COPY_TO_PBUFFER 0x0010
> 
>   is set in the XvMCSurfaceInfo's flags field.
> 
>   I'd like to bump the API version up to 1.1 and add this.  
> Comments?
> 
> 
>   Mark.
> 


__
Do you Yahoo!?
Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
http://calendar.yahoo.com
___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-02 Thread Andrew C Aitchison
On Sun, 1 Jun 2003, Alex Deucher wrote:

> Just curious, as I'm not too familiar with XvMC yet, but would this
> provide another Xv adapter that used the 3D texture engine to display
> videos rather than othe video overlay?  or something else.  Sorry for
> my ignorance.
... ... ... 
> --- Mark Vojkovich <[EMAIL PROTECTED]> wrote:
> >I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
> > to XvMC.  I have implemented this in NVIDIA's binary drivers and
> > am able to do full framerate HDTV video textures on the higher end
> > GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
> > contents into a texture.

I don't really know any more than you but my guess is that while
this may be presented as another Xv adapter, what it really does is
make a video source available as a texture.
This would allow you to, for instance, display a virtual reality
living-room and whenever the camera falls on the TV it would be
showing live pictures from a video feed.

-- 
Andrew C. Aitchison Cambridge
[EMAIL PROTECTED]

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-02 Thread Mike A. Harris
On Sun, 1 Jun 2003, Andrew C Aitchison wrote:

>> Just curious, as I'm not too familiar with XvMC yet, but would this
>> provide another Xv adapter that used the 3D texture engine to display
>> videos rather than othe video overlay?  or something else.  Sorry for
>> my ignorance.
>   ... ... ... 
>> --- Mark Vojkovich <[EMAIL PROTECTED]> wrote:
>> >I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
>> > to XvMC.  I have implemented this in NVIDIA's binary drivers and
>> > am able to do full framerate HDTV video textures on the higher end
>> > GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
>> > contents into a texture.
>
>I don't really know any more than you but my guess is that while
>this may be presented as another Xv adapter, what it really does is
>make a video source available as a texture.
>This would allow you to, for instance, display a virtual reality
>living-room and whenever the camera falls on the TV it would be
>showing live pictures from a video feed.

Another more useful use would be CNN like video effects where the 
fullscreen shrinks to an inset and then rotates on a 3D angle, 
etc.  Various nifty 3D video effects for video editing/production 
could be done.

-- 
Mike A. Harris


___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-02 Thread Mark Vojkovich
   It's not another adaptor.  I lets you copy video surfaces 
rendered with an existing XvMC adaptor into a GLXPbuffer.  It's
possible to both display in the overlay and save off to a
Pbuffer.
 
   A while ago, I started getting inquiries from a couple film
companies who store their rendered animated features as jpegs.
They decompress them in software and copy them into textures
so they can do post processing on them in OpenGL.  I think mostly
they're interested in doing things like adding film grain and
doing color correction.  The software decode is really a significant
expense if you're trying to do 1920x1080 sized jpegs in real time.
Unfortunately, I don't think the quality of 4:2:0 video is really
is up their standards, but there are lower quality applications such
as HDTV and DVD post processing that can benefit from accelerated
decode of mpeg streams into an OpenGL drawable.  There are probably
some interesting multimedia projects as well.


Mark.

On Sun, 1 Jun 2003, Alex Deucher wrote:

> Just curious, as I'm not too familiar with XvMC yet, but would this
> provide another Xv adapter that used the 3D texture engine to display
> videos rather than othe video overlay?  or something else.  Sorry for
> my ignorance.
> 
> Thanks,
> 
> Alex
> 
> --- Mark Vojkovich <[EMAIL PROTECTED]> wrote:
> >I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
> > to XvMC.  I have implemented this in NVIDIA's binary drivers and
> > am able to do full framerate HDTV video textures on the higher end
> > GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
> > contents into a texture.
> > 
> > 
> > Status
> > XvMCCopySurfaceToGLXPbuffer (
> >   Display *display,
> >   XvMCSurface *surface,
> >   XID pbuffer_id,
> >   short src_x,
> >   short src_y,
> >   unsigned short width,
> >   unsigned short height,
> >   short dst_x,
> >   short dst_y,
> >   int flags
> > );
> > 
> >This function copies the rectangle specified by src_x, src_y,
> > width,
> >   and height from the XvMCSurface denoted by "surface" to offset
> > dst_x, dst_y 
> >   within the pbuffer identified by its GLXPbuffer XID "pbuffer_id".
> >   Note that while the src_x, src_y are in XvMC's standard left-handed
> >   coordinate system and specify the upper left hand corner of the
> >   rectangle, dst_x and dst_y are in OpenGL's  right-handed coordinate
> > 
> >   system and denote the lower left hand corner of the destination 
> >   rectangle in the pbuffer.
> > 
> > "Flags" may be XVMC_TOP_FIELD, XVMC_BOTTOM_FIELD or
> > XVMC_FRAME_PICTURE.
> >   If flags is not XVMC_FRAME_PICTURE, the src_y and height are in
> > field
> >   coordinates, not frame.  That is, the total copyable height is half
> >   the height of the XvMCSurface.  
> > 
> > XvMCCopySurfaceToGLXPbuffer does not return until the copy to the
> >   pbuffer has completed.  XvMCCopySurfaceToGLXPbuffer is pipelined
> >   with XvMCRenderSurface so no explicit synchronization between 
> >   XvMCRenderSurface and XvMCCopySurfaceToGLXPbuffer is needed.
> >   
> > The pbuffer must be of type GLX_RGBA, and the destination of the
> >   copy is the left front buffer of the pbuffer.  Success is returned
> >   if no error occured, the error code is returned otherwise.
> > 
> > Possible Errors:
> > 
> >XvMCBadSurface - The surface is invalid.
> > 
> >BadDrawable - The pbuffer_id is not a valid pbuffer.
> > 
> >BadMatch - The pbuffer is not of type GLX_RGBA or the
> >   pbuffer does not have a front left buffer.
> > 
> >   XvMCCopySurfaceToGLXPbuffer is supported if the following flag:
> > 
> > #define XVMC_COPY_TO_PBUFFER 0x0010
> > 
> >   is set in the XvMCSurfaceInfo's flags field.
> > 
> >   I'd like to bump the API version up to 1.1 and add this.  
> > Comments?
> > 
> > 
> > Mark.
> > 
> 
> 
> __
> Do you Yahoo!?
> Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
> http://calendar.yahoo.com
> ___
> Devel mailing list
> [EMAIL PROTECTED]
> http://XFree86.Org/mailman/listinfo/devel
> 

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-02 Thread Jon Leech
On Fri, May 30, 2003 at 05:42:20PM -0700, Ian Romanick wrote:
> Mark Vojkovich wrote:
> >   I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
> >to XvMC.  I have implemented this in NVIDIA's binary drivers and
> >am able to do full framerate HDTV video textures on the higher end
> >GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
> >contents into a texture.
>
> This shoulds like a good candidate for a GLX extension.  I've been
> wondering when someone would suggest somthing like this. :)  Although, I
> did expect it to come from someone doing video capture work first.

I don't think it makes much difference whether it's considered as
XvMC functionality or GLX functionality, but if you do it in XvMC I
suggest paying as much attention to a detailed specification as OpenGL
and GLX extensions do. In particular since the X and GL rendering
streams are generally asynchronous, making sure apps can get repeatable
behavior across drivers.
You might want to think about how this could carry over to the
upcoming super buffers extension, too, since that will probably replace
pbuffers for most purposes within a few years. Since super buffers
operate entirely within GL, and the GL namespace doesn't involve XIDs
and is dependent on the current context, it might make more sense to
pass the XvMC objects into GL than vice versa.
Jon Leech
SGI
___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-02 Thread Mark Vojkovich
On Sun, 1 Jun 2003, Jon Leech wrote:

> On Fri, May 30, 2003 at 05:42:20PM -0700, Ian Romanick wrote:
> > Mark Vojkovich wrote:
> > >   I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
> > >to XvMC.  I have implemented this in NVIDIA's binary drivers and
> > >am able to do full framerate HDTV video textures on the higher end
> > >GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
> > >contents into a texture.
> >
> > This shoulds like a good candidate for a GLX extension.  I've been
> > wondering when someone would suggest somthing like this. :)  Although, I
> > did expect it to come from someone doing video capture work first.
> 
> I don't think it makes much difference whether it's considered as
> XvMC functionality or GLX functionality, but if you do it in XvMC I
> suggest paying as much attention to a detailed specification as OpenGL
> and GLX extensions do. In particular since the X and GL rendering
> streams are generally asynchronous, making sure apps can get repeatable
> behavior across drivers.
> You might want to think about how this could carry over to the
> upcoming super buffers extension, too, since that will probably replace
> pbuffers for most purposes within a few years. Since super buffers

  There are alot of people who are just discovering pbuffers now.
I would guess it would take years before superbuffers were widely used.

> operate entirely within GL, and the GL namespace doesn't involve XIDs
> and is dependent on the current context, it might make more sense to
> pass the XvMC objects into GL than vice versa.
> Jon Leech
> SGI

   Extending GL to recognize a relatively unknown XFree86 format
is a hard sell.  I wouldn't even be able to convince my own company
to dirty their code for it seeing as how relatively nobody is using 
XvMC.

   Of course you really want these things in objects that are
entirely within the OpenGL namespace, such as textures.  Speaking
of slowly adopted extensions, if there's GLX_ARB_render_to_texture
that sort of solves that problem.  Haven't been paying much attention
to super buffers (doesn't effect me yet).  You can bind a pbuffer
to a superbuffer in some way can't you? 


Mark.

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-02 Thread Jon Leech
On Mon, Jun 02, 2003 at 01:09:59AM -0400, Mark Vojkovich wrote:
>Extending GL to recognize a relatively unknown XFree86 format
> is a hard sell.  I wouldn't even be able to convince my own company
> to dirty their code for it seeing as how relatively nobody is using
> XvMC.

Do you implement this without touching the GL driver code? Seems
difficult to avoid touching the driver in the general case, when the
format and location of pbuffer memory is intentionally opaque.

>Of course you really want these things in objects that are
> entirely within the OpenGL namespace, such as textures.  Speaking
> of slowly adopted extensions, if there's GLX_ARB_render_to_texture
> that sort of solves that problem.  Haven't been paying much attention
> to super buffers (doesn't effect me yet).  You can bind a pbuffer
> to a superbuffer in some way can't you?

No. There is a WGL_ARB_render_texture extension but we never
finished the GLX version due to lack of interest + the expectation that
super buffers will enable similar functionality.

Jon
___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-03 Thread Ian Romanick
Mark Vojkovich wrote:
On Sun, 1 Jun 2003, Jon Leech wrote:
   You might want to think about how this could carry over to the
upcoming super buffers extension, too, since that will probably replace
pbuffers for most purposes within a few years. Since super buffers
  There are alot of people who are just discovering pbuffers now.
I would guess it would take years before superbuffers were widely used.
I would re-think that assumption. :)  A *lot* of people have known about 
pbuffers but have intentionally avoided them.  When superbuffers are 
available, they are going to jump all over it!  Not only that, on Linux 
on the Nvidia drivers and the ATI drivers for the FireGL 1/2/3 cards 
(not the Radeon based FireGL cards) support it at all currently.

Since nobody supports superbuffers yet, I think we could probably 
re-visit this issue when it is available.

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-03 Thread Ian Romanick
Mark Vojkovich wrote:
On Sat, 31 May 2003, Ian Romanick wrote:

Mark Vojkovich wrote:

On Fri, 30 May 2003, Ian Romanick wrote:

Mark Vojkovich wrote:

 I'd like to propose adding a XvMCCopySurfaceToGLXPbuffer function
to XvMC.  I have implemented this in NVIDIA's binary drivers and
am able to do full framerate HDTV video textures on the higher end
GeForce4 MX cards by using glCopyTexSubImage2D to copy the Pbuffer
contents into a texture.
This shoulds like a good candidate for a GLX extension.  I've been 
wondering when someone would suggest somthing like this. :)  Although, I 
did expect it to come from someone doing video capture work first.
  I wanted to avoid something from the GLX side.  Introducing the
concept of an XFree86 video extension buffer to GLX seemed like a hard
sell.  Introducting a well establish GLX drawable type to XvMC 
seemed more reasonable.
Right.  I thought about this a bit more last night.  A better approach 
might be to expose this functionality as an XFree86 extension, then 
create a GLX extension on top of it.  I was thinking of an extension 
where you would bind a "magic" buffer to a pbuffer, then take a snapshot 
from the input buffer to the pbuffer.  Doing that we could create 
layered extensions for binding v4l streams to pbuffers.  This would be 
like creating a subclass in C++ and just over-riding the virtual 
CaptureImage method.  I think that would be much nicer for application code.


   This isn't capture.  It's decode.  XvMC is a video acceleration
architecture not a capture architecture.  Even with capture, HW capture
buffer formats don't always line up nicely with pbuffer or texture formats.
I understand that it's not capture.  However, it's conceptually similar. 
 You have some opaque source that's generating frames of video.  You 
take whatever is the current frame and slurp it over to your pbuffer.  I 
doen't really matter if the video source is a file on your hard drive, a 
webcam on your PC, or a Dept. of Transportation traffic camera over the web.

That's why I'm saying that this new XvMC functionality could be used at 
the basis of a more general GLX extension.  I think a more abstract GLX 
extension is going to be far more useful to application developers. 
However, without something like XvMCCopySurfaceToGLXPbuffer in each 
thing that we want to use as a video source, the GLX extension can't be 
implemented.

The fact that buffer formats don't match is why I propsed having a 
CaptureImage (or something) function in the GLX extension.  That's the 
explicit copy of the next frame (either from the MPEG file or from the 
video camera) to the pbuffer.  It's just a name that would redirect to 
XvMCCopySurfaceToGLXPbuffer in this case.  The reason for the "bind" 
call is so that CaptureImage (which could probably use a better name, 
but it was late when I thought of it) knows what the video source is and 
what type of source (i.e., XvMC, v4l, etc.) it is.  That way it knows 
how to do the copy.  Then the application developer doesn't have to 
bother with that in their code.  That way if they want to switch from a 
video file to live video, they just make a different bind call, their 
code path doesn't have to change.

The really cool thing is that if all the real work (i.e., copying the 
data) is done in the XFree86 extensions, then all of the code for the 
GLX extension is *completely* device independent.  That ends up being a 
*HUGE* win.

hardware couldn't do mipmapping or GL_WRAP on non-power-of-two textures. 
 For the most part, without NV_texture_rectangle, you can't even use 
npot textures. :(
   And NV_texture_rectangle are still second class compared to normal
textures.  No video formats are powers of two, unfortunately.
Fair enough.  But that should change soon. :)

Status
XvMCCopySurfaceToGLXPbuffer (
Display *display,
XvMCSurface *surface,
XID pbuffer_id,
short src_x,
short src_y,
unsigned short width,
unsigned short height,
short dst_x,
short dst_y,
int flags
);
One quick comment.  Don't use 'short', use 'int'.  On every existing and 
future platform that we're likely to care about the shorts will take up 
as much space as an int on the stack anyway, and slower / larger / more 
instructions will need to be used to access them.
  This is an X-window extension.  It's limited to the signed 16 bit
coordinate system like the X-window system itself, all of Xlib and
the rest of XvMC.
So?  Just because the values are limited to 16-bit doesn't necessitate 
that they be stored in a memory location that's only 16-bits.  If X were 
being developed from scratch today, instead of calling everything short, 
it would likely be int_fast16_t.  On IA-32, PowerPC, Alpha, SPARC, and 
x86-64, this is int.  Maybe using the C99 types is the right answer anyway.


   XvMC is already using shorts.  No reason to be inconsistent now.
It reflects the underlying protocol limitations anyhow.  Something
to keep in mind for future extensions though.
True.  It should be pretty easy t

Re: RFC: OpenGL + XvMC

2003-06-03 Thread Mark Vojkovich
On Sun, 1 Jun 2003, Jon Leech wrote:

> On Mon, Jun 02, 2003 at 01:09:59AM -0400, Mark Vojkovich wrote:
> >Extending GL to recognize a relatively unknown XFree86 format
> > is a hard sell.  I wouldn't even be able to convince my own company
> > to dirty their code for it seeing as how relatively nobody is using
> > XvMC.
> 
> Do you implement this without touching the GL driver code? Seems
> difficult to avoid touching the driver in the general case, when the
> format and location of pbuffer memory is intentionally opaque.

   I haven't touched the GL driver at all.  XvMC is direct rendered
and the assumption is that it's using the same direct rendering
architecture as OpenGL and should be able to get access to the
pbuffer memory if it can name it, just like GL would be able to
do.


Mark.

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-03 Thread Mark Vojkovich
On Mon, 2 Jun 2003, Ian Romanick wrote:

> Mark Vojkovich wrote:
> > On Sun, 1 Jun 2003, Jon Leech wrote:
> >>You might want to think about how this could carry over to the
> >>upcoming super buffers extension, too, since that will probably replace
> >>pbuffers for most purposes within a few years. Since super buffers
> > 
> >   There are alot of people who are just discovering pbuffers now.
> > I would guess it would take years before superbuffers were widely used.
> 
> I would re-think that assumption. :)  A *lot* of people have known about 
> pbuffers but have intentionally avoided them.  When superbuffers are 
> available, they are going to jump all over it! 

   I'll believe it when I see it.


Mark.

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-03 Thread Ian Romanick
Mark Vojkovich wrote:
On Sun, 1 Jun 2003, Jon Leech wrote:

On Mon, Jun 02, 2003 at 01:09:59AM -0400, Mark Vojkovich wrote:

  Extending GL to recognize a relatively unknown XFree86 format
is a hard sell.  I wouldn't even be able to convince my own company
to dirty their code for it seeing as how relatively nobody is using
XvMC.
   Do you implement this without touching the GL driver code? Seems
difficult to avoid touching the driver in the general case, when the
format and location of pbuffer memory is intentionally opaque.
   I haven't touched the GL driver at all.  XvMC is direct rendered
and the assumption is that it's using the same direct rendering
architecture as OpenGL and should be able to get access to the
pbuffer memory if it can name it, just like GL would be able to
do.
You may not have touched the GL driver at all, but you are using some 
sort of non-public interface to it to convert a pbuffer ID to an 
address.  That was somewhat the point of Jon's comment.  I certainly 
don't see anything in any pbuffer documentation that I've ever seen that 
describes how to get the address in video memory of a pbuffer.  In fact, 
the documentation that I have seen goes to some length to explain that 
at certain points in time the pbuffer may not have an address in video 
memory.

Instead of modifying your 3D driver, you've used an internal interface 
that, luckilly for you, just happened to already be there.  The rest of 
us may not be so lucky.

Given that, I have only three comments / requests for the function.

1. Please provide a way to specify the destination buffer (i.e., 
GL_FRONT, GL_BACK_RIGHT, etc.) of the copy.

2. Make explicit the coordinate conversion monkey business.

3. Is there a way for apps to determine if this function is available on 
their hardware?  Later this year when pbuffers become available in the 
open-source drivers, we probably won't (initially) have support for this 
function.  I fully expect that support will follow soon, but it won't be 
there initially.

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-03 Thread Mark Vojkovich
On Mon, 2 Jun 2003, Ian Romanick wrote:

> >I haven't touched the GL driver at all.  XvMC is direct rendered
> > and the assumption is that it's using the same direct rendering
> > architecture as OpenGL and should be able to get access to the
> > pbuffer memory if it can name it, just like GL would be able to
> > do.
> 
> You may not have touched the GL driver at all, but you are using some 
> sort of non-public interface to it to convert a pbuffer ID to an 
> address.  That was somewhat the point of Jon's comment.  I certainly 
> don't see anything in any pbuffer documentation that I've ever seen that 
> describes how to get the address in video memory of a pbuffer.  In fact, 
> the documentation that I have seen goes to some length to explain that 
> at certain points in time the pbuffer may not have an address in video 
> memory.
> 
> Instead of modifying your 3D driver, you've used an internal interface 
> that, luckilly for you, just happened to already be there.  The rest of 
> us may not be so lucky.

   I'd expect you to be able to do the same think with the DRI.
Intel implements their XvMC driver using the DRI.
   
> 
> Given that, I have only three comments / requests for the function.
> 
> 1. Please provide a way to specify the destination buffer (i.e., 
> GL_FRONT, GL_BACK_RIGHT, etc.) of the copy.

It's taking an argument like glDrawBuffer does.  It uses
the GL enums.

> 
> 2. Make explicit the coordinate conversion monkey business.

   Will do.

> 
> 3. Is there a way for apps to determine if this function is available on 
> their hardware?  Later this year when pbuffers become available in the 
> open-source drivers, we probably won't (initially) have support for this 
> function.  I fully expect that support will follow soon, but it won't be 
> there initially.

   There was a flag in the proposal that indicated it.  That's
the way other XvMC limitations/features are indicated, such as
whether or not subpicture scaling is supported.

   What I'd really like to hear is if the DRI folks think they'd
have implementation problems with this in the Intel driver or 
some hypothetical driver.


Mark.

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel


Re: RFC: OpenGL + XvMC

2003-06-03 Thread Ian Romanick
Mark Vojkovich wrote:
On Mon, 2 Jun 2003, Ian Romanick wrote:

Instead of modifying your 3D driver, you've used an internal interface 
that, luckilly for you, just happened to already be there.  The rest of 
us may not be so lucky.
   I'd expect you to be able to do the same think with the DRI.
Intel implements their XvMC driver using the DRI.
Oh I know that we will be able to do it.  We'll just have to make the 
necessary changes to the 3D driver... ;)

Given that, I have only three comments / requests for the function.

1. Please provide a way to specify the destination buffer (i.e., 
GL_FRONT, GL_BACK_RIGHT, etc.) of the copy.
It's taking an argument like glDrawBuffer does.  It uses
the GL enums.
Perfect.

2. Make explicit the coordinate conversion monkey business.
   Will do.
I think that will avoid having to answer a lot of questions later. :)

3. Is there a way for apps to determine if this function is available on 
their hardware?  Later this year when pbuffers become available in the 
open-source drivers, we probably won't (initially) have support for this 
function.  I fully expect that support will follow soon, but it won't be 
there initially.
   There was a flag in the proposal that indicated it.  That's
the way other XvMC limitations/features are indicated, such as
whether or not subpicture scaling is supported.
Okay, I missed that the first time.  Sorry.

   What I'd really like to hear is if the DRI folks think they'd
have implementation problems with this in the Intel driver or 
some hypothetical driver.
Since I'll probably end up implementing it (at least in some drivers), I 
don't forsee any problems.  Since both the 3D drivers and the XvMC 
drivers are client-side, it should be pretty easy.  As soon as I get 
done writing all the parts so that we can have pbuffers (and 
ARB_vertex_buffer_objects, and superbuffers), I should be able to treat 
the XvMC copy call just like a glDrawPixels that sources from another 
pbuffer of a superbuffer.

___
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel