I am not sure about that ... let me check

Piotr


On 11 April 2014 10:19, Larry Gritz <l...@larrygritz.com> wrote:

> Was it always like this, in 1.x as well? Some of my code seems to bend
> over backwards to not allow random order writes unless a specific request
> was made for random Y order. I don't remember now why I wrote it that way,
> but the code is structured as if at some time in the past, the library
> would not have done the buffering without RANDOM_Y lineOrder. Was I just
> always wrong about this?
>
>         -- lg
>
>
> On Apr 11, 2014, at 10:13 AM, Larry Gritz <l...@larrygritz.com> wrote:
>
> > OK, so let me restate it to make sure I have it right:
> >
> > For scanline files, storage in the file is either increasing or
> decreasing (determined by lineOrder); libIlmImf will accept scanlines in
> any order, but if they are sent other than with the line order you
> specified, the library will buffer internally.
> >
> > For tiled files, libIlmImf will accept tiles in any order, buffering if
> they are not in canonical order, UNLESS you set lineOrder to RANDOM_Y, in
> which case it really will store it in random order rather than buffering
> (but at the cost of reading that file in canonical order having more seeks
> than if it had been written in canonical tile order).
> >
> > Do I have that all correct?
> >
> >
> >
> > On Apr 10, 2014, at 5:10 PM, Peter Hillman <pet...@wetafx.co.nz> wrote:
> >
> >> RANDOM_Y is not supported for scanline images - you either start at
> datawindow.min.y and work to datawindow.max.y or vice versa. You can
> deliver scanlines out of order: they'll be buffered before writing.
> >>
> >> With tiled images, you can write tiles in any order, but you must set
> RANDOM_Y to allow it write without buffering.
> >>
> >>
> >>
> >> On 11/04/14 12:02, Larry Gritz wrote:
> >>> Uh oh.
> >>>
> >>> I knew about RANDOM_Y for scanline images. Are you saying that for
> tiled images, if we don't set lineorder to RANDOM_Y, then there's internal
> buffering if we send the tiles in anything but canonical order?
> >>>
> >>>
> >>>
> >>> On Apr 10, 2014, at 4:54 PM, Peter Hillman <pet...@wetafx.co.nz>
> wrote:
> >>>
> >>>> In general with OpenEXR, you cannot write to a file from different
> threads unless they have a shared framebuffer. Calling "setFrameBuffer"
> from one thread while another is writing may cause a crash.
> >>>>
> >>>> Even if you do have a shared framebuffer, the threads lock to
> serialise the writes: only one "writePixels" or "writeTile" request goes
> through at once.
> >>>> If you don't use the IlmThread library to run your threads it may be
> wise to implement your own lock mechanism around writePixel and writeTile
> calls.
> >>>>
> >>>>
> >>>> There are two ways of writing tiled data: if you use
> xTileCoords/yTileCoords, then pixel(0,0) is the bottom left corner of each
> tile, implying the image buffer pointed to by the slice is the same size as
> the tile.
> >>>> if you don't do that, then pixel(0,0) is the bottom left corner of
> the displayWindow, implying the image buffer pointed to be the slice is the
> size of the dataWindow, accounting for offset data windows appropriately.
> >>>>
> >>>> In your case, it would seem like you want the second option:
> preallocate your dataWindow sized array of pointers-to-samples, and call
> setFrameBuffer before any rendering begins.
> >>>> Then each thread sets the pointers to the samples for the tile it is
> going to write and fills in the corresponding part of the samplecount array
> before calling writeTile.
> >>>>
> >>>> The pointers need not be valid when setFrameBuffer is called. When
> you call writeTile, only the pointers and sampleCount data for the pixels
> being written need to be valid, and need not remain valid afterwards. So
> yes, you can delete data for the actual sample data of a tile after calling
> writeTile, though you'll need to keep the sampleCount array and the
> pointers-to-samples array for each channel.
> >>>>
> >>>> Note that if you are writing tiles in anything other than RANDOM_Y
> order, then whenever your threads deliver tiles out of order OpenEXR will
> have to buffer data so it can write the tiles sequentially.
> >>>> I suspect this may well be the case from multithreaded write
> applications. With deep data this could take a significant amount of memory.
> >>>> You may wish to enforce RANDOM_Y order to allow the library to write
> tiles to disk as soon as you call writeTile. If your read pattern is
> generally also random, rather than in 'scanline order', there'll be little
> performance hit.
> >>>>
> >>>> You might also consider having one worker thread managing the writing
> of tile data and marshalling into the format required for the DeepSlices,
> and have other threads compute data and signal the worker thread when they
> have tiles ready for processing.
> >>>>
> >>>> Yes, you can use an Array2D<float*> for your data points (dataZ and
> dataA in the example). Each value is a pointer to the first sample of the
> channel data for each pixel.
> >>>> Subsequent samples are found using the offset provided. That means
> you can store pixel data in separate or interleaved channels.
> >>>>
> >>>>
> >>>>
> >>>> On 11/04/14 02:16, Michel Lerenard wrote:
> >>>>> Hi,
> >>>>>
> >>>>> I'm trying to write deep data into an EXR file and am having trouble
> understanding how the API works.
> >>>>> I'd like to be able to write tiles from different threads. The
> application I'm working on (Isotropix Clarisse) runs several threads, each
> one render a part of an image.
> >>>>> I'd like to write deep data when the current tile is completely
> computed.
> >>>>>
> >>>>> I'm using the "Reading And Writing Image Files" documentation, and
> the section about Deep Tile File writing on page 26 is confusing to me.
> >>>>>
> >>>>> From what I understand, I need a DeepFrameBuffer to write an image.
> It seems it should be the same for all threads, as a DeepTiledOutputFile
> can only use one. Is it thread safe ? Can I use the same FrameBuffer from
> all threads ?
> >>>>> I was puzzled by the type of dataZ and data0, reading the next
> example (reading a deep tiled file) I understand that the arrays are only
> storing pointers to deep data for a particular pixel, and that they could
> as well be Array2D<float*>. Is that correct ?
> >>>>>
> >>>>> If it is, this means that each one of my threads should set pointers
> in the framebuffer DeepSlice for each pixel of the tile it's computing,
> then call writeTile. After that can I delete the data and reset the
> pointers in the DeepSlice ?
> >>>>>
> >>>>>
> >>>>> Thanks,
> >>>>>
> >>>>> Michel
> >>>>>
> >>>>>
> >>>>> _______________________________________________
> >>>>> Openexr-devel mailing list
> >>>>> Openexr-devel@nongnu.org
> >>>>> https://lists.nongnu.org/mailman/listinfo/openexr-devel
> >>>>
> >>>> _______________________________________________
> >>>> Openexr-devel mailing list
> >>>> Openexr-devel@nongnu.org
> >>>> https://lists.nongnu.org/mailman/listinfo/openexr-devel
> >>> --
> >>> Larry Gritz
> >>> l...@larrygritz.com
> >>>
> >>>
> >>>
> >>
> >
> > --
> > Larry Gritz
> > l...@larrygritz.com
> >
> >
> >
> >
> > _______________________________________________
> > Openexr-devel mailing list
> > Openexr-devel@nongnu.org
> > https://lists.nongnu.org/mailman/listinfo/openexr-devel
>
> --
> Larry Gritz
> l...@larrygritz.com
>
>
>
>
> _______________________________________________
> Openexr-devel mailing list
> Openexr-devel@nongnu.org
> https://lists.nongnu.org/mailman/listinfo/openexr-devel
>
_______________________________________________
Openexr-devel mailing list
Openexr-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/openexr-devel

Reply via email to