On 07/25/2011 10:43 PM, Roland Scheidegger wrote: >> >> On 07/25/2011 09:03 PM, Roland Scheidegger wrote: >>>> On 07/25/2011 07:54 PM, Roland Scheidegger wrote: >>>>>> Resolve via glBlitFramebuffer allows resolving a sub-region of a >>>>>> renderbuffer to a different location in any mipmap level of some >>>>>> other texture, therefore location and size parameters are >>>>>> needed. >>>>>> >>>>>> The mask parameter was added because resolving only depth or >>>>>> only >>>>>> stencil of a combined buffer is possible as well. >>>>>> >>>>>> Copying from FBO to a window system buffer requires a vertical >>>>>> so the yflip parameter was added. >>>>>> >>>>>> The y-flip parameter could be left out if pipe_box was changed >>>>>> to >>>>>> contain signed width/height or x0,y0,x1,y1 instead. >>>>>> This might benefit other methods, such as resource_copy_region, >>>>>> where >>>>>> some hw can easily do a backwards copy (yflip). >>>>> >>>>> Hmm I'm not sure I like these interface changes too much. >>>>> Individual comments below. >>>>> >>>>> >>>>>> diff --git a/src/gallium/include/pipe/p_context.h >>>>>> b/src/gallium/include/pipe/p_context.h >>>>>> index 3f6d90d..9376cdd 100644 >>>>>> --- a/src/gallium/include/pipe/p_context.h >>>>>> +++ b/src/gallium/include/pipe/p_context.h >>>>>> @@ -255,8 +255,7 @@ struct pipe_context { >>>>>> >>>>>> /** >>>>>> * Copy a block of pixels from one resource to another. >>>>>> - * The resource must be of the same format. >>>>>> - * Resources with nr_samples > 1 are not allowed. >>>>>> + * The resources must be of the same format and sample >>>>>> count. >>>>>> */ >>>>>> void (*resource_copy_region)(struct pipe_context *pipe, >>>>>> struct pipe_resource *dst, >>>>> I think the idea to restrict this to 1 sample was to keep it >>>>> simple. I'm not sure hw can always easily do this, depending on >>>>> how it is implemented (especially because there are regions >>>>> involved). Might be ok though. >>>>> >>>>>> @@ -267,14 +266,17 @@ struct pipe_context { >>>>>> const struct pipe_box >>>>>> *src_box); >>>>>> >>>>>> /** >>>>>> - * Resolve a multisampled resource into a non-multisampled >>>>>> one. >>>>>> - * Source and destination must have the same size and same >>>>>> format. >>>>>> + * Resolve a multisampled resource into a non-multisampled >>>>>> one, >>>>>> + * or vice versa (in the latter case, values are just >>>>>> replicated). >>>>>> + * Source and destination must have the same format. >>>>>> + * Mask can be either PIPE_MASK_RGBA, Z, S or ZS. >>>>>> + * The mipmap level of the multisampled resource will be 0. >>>>>> */ >>>>>> - void (*resource_resolve)(struct pipe_context *pipe, >>>>>> - struct pipe_resource *dst, >>>>>> - unsigned dst_layer, >>>>>> - struct pipe_resource *src, >>>>>> - unsigned src_layer); >>>>>> + void (*resource_resolve)(struct pipe_context *pipe, unsigned >>>>>> mask, >>>>>> + struct pipe_resource *dst, unsigned >>>>>> dst_level, >>>>>> + unsigned dstx, unsigned dsty, >>>>>> unsigned dst_layer, >>>>>> + struct pipe_resource *src, unsigned >>>>>> src_level, >>>>>> + const struct pipe_box *src_box, >>>>>> boolean yflip); >>>>> >>>>> This function was inspired by d3d10 and the wide variety of >>>>> possible implementations. >>>>> You cannot resolve depth and stencil buffers in d3d10/11 and I'm >>>>> not convinced it even makes a whole lot of sense (especially for >>>>> the stencil buffer). >>>> Just because you cannot do something in D3D10 doesn't mean you >>>> have >>>> to >>>> make it impossible in gallium if it can be done OpenGL. >>>> If you resolve because you don't need/want multisampling for the >>>> rest >>>> of >>>> the frame, but you still want the contents of the depth buffer, it >>>> does >>>> very much make sense. >>> Just think about it what this does: 2 out of 4 depth samples were >>> from some near object, the rest from some object back. I haven't >>> looked at the details of the spec too closely, what value are you >>> even supposed to get there? A meaningless "average depth"? Or just >>> one of the values at random? >>> Resolving color buffers is pretty well defined (for standard msaa >>> at least). I have no idea how that's supposed to be defined for >>> depth and stencil values. Frankly I'm not sure what >>> glBlitFramebuffer is supposed to do here, maybe it's defined >>> somewhere but even applying the term "resolve" to a depth buffer >>> seems very iffy. At the very least it needs to be documented in >>> the gallium docs what "resolving" a depth/stencil buffer really >>> means. >>> I certainly agree just because it isn't in d3d doesn't mean it >>> can't be in gallium. But just because it maps well to OpenGL isn't >>> a good reason to include it neither. >>> >> I had noticed that (and incorporated it into the nv50 patch), average >> depth doesn't make much sense indeed. >> That's why you can't use GL_LINEAR for depth resolve but only >> GL_NEAREST. >> >> From the GL spec: >> "if mask includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, and filter >> is >> not NEAREST, no copy is performed and an INVALID_OPERATION error is >> generated. > > Yes, this is for different pixels (in case of stretch blit), not different > samples. So it is acknowledged that averaging doesn't make sense between > different depth pixel values, yet averaging is allowed (though not > recommended) for depth sample values (it doesn't make one bit more sense > there...). > It's NEAREST. For the resolve too. That means you pick the value of a single sample, there's no averaging.
Yes it's just like a blit without interpolation. Resolve is also just a blit with special filtering. But it's my fast, tailored-to-the-hardware blit without the cruft associated with going through the gallium interface. > Roland > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev