blob: 8c3c60681a02f2b52b4574cb99eba9f376eec1ec [file] [log] [blame]
/*! \page notes_on_data_arrays Notes on Data Arrays
@ingroup api_notes
Data arrays are similar to CUDA's cudaMalloc -- they essentially
generate an object (on the _host_, but inside the driver) to hold a
certain amount of (untyped and unformatted) data. That data can, for
example, be a set of vertices, normals, etc, and the entire purpose
of the object is to share that data array among different parts of
the ray tracer (e.g., between two meshes).
Data arrays can be declared persistent, in which case they will
essentially reference into the application's address space (i.e.,
using shared data) (see \ref notes_on_persistency).
*/
/*! \page notes_on_persistency Notes on Persistency
@ingroup api_notes
The idea of persistency is that the application usually _has_ most
of it's bulky data in memory, anyway, and having to replicate it in
the driver (and lateron on the device, too) is a waste of memory. To
avoid that, we foresee two mechanisms:
a) the applicatoin does not store the data in the first place, but
instead has the required block of data be allocated by driver, then
maps that buffer, and stores its data in that memory block mapped
from the driver (i.e., the driver owns it, but the app maps it)
b) the app allocates the data and maps it, but tells the driver to
not copy the data upon declaration, but to rather map into the
application's address space (assuming it's in a format the driver
deems suitable).
Examples:
\verbatim
Example for version a) (mapping)
int numVertices = file.readInt();
data_t vtxData = rtNewData(NULL,numVertices * sizeof(vec3f));
vec3f *vtx = (vec3f*)rtMapData(vtxData);
fread(vtx,sizeof(*vtx),nuMVertices,file);
Example for version b) (persistent object)
int numVertices = file.readInt();
vec3f *vtx = new vec3f[numVertices];
fread(vtx,sizeof(*vtx),nuMVertices,file);
rtVertexArray3f(mesh,vtx,numVertices,RT_PERSISTENT);
Example for version c) (neither of above, will actually _replicate_
the data on app and driver)
int numVertices = file.readInt();
vec3f *vtx = new vec3f[numVertices];
fread(vtx,sizeof(*vtx),nuMVertices,file);
rtVertexArray3f(mesh,vtx,numVertices,RT_DEFAULT); // will _replicate_
\endverbatim
Note:
<ul>
<li>if data is actually _shared_ between app and driver, it should not
be modified by either side while the other is still using it. Though
the idea of sharing is to facilitate "in place" modifications by the
app (i.e., the app modifies data directly in the driver's address
space), it can do that only at "safe" times (after a frame is finished
-- note: this needs some clarification later on), and it has to
properly notify the driver that the data has been changed (note:
either need some rtMarkDirty() call for such modified data, or may
allow changes only inside rtMap/rtUnmap calls -- the latter looks more
promising, but need more clarification)
<li>the driver will _never_ free persistent data, as it is considered
to belong to the _app_ (even if the app calls a rtDestroy on the node
'owning' the vertex array
</ul>
*/
}