blob: 81a6da4fb88fef4924fa6cbd1fc4e17f34be01cb [file] [log] [blame]
Corbin Simpsone7d05f12010-06-16 16:52:52 -07001.. _context:
2
Corbin Simpson8283e202009-12-20 15:28:00 -08003Context
4=======
5
Brian Paul73e37d92011-02-03 12:30:19 -07006A Gallium rendering context encapsulates the state which effects 3D
7rendering such as blend state, depth/stencil state, texture samplers,
8etc.
9
10Note that resource/texture allocation is not per-context but per-screen.
11
Corbin Simpson8283e202009-12-20 15:28:00 -080012
13Methods
14-------
15
Corbin Simpsona524aab2009-12-20 19:41:50 -080016CSO State
17^^^^^^^^^
18
Brian Paul73e37d92011-02-03 12:30:19 -070019All Constant State Object (CSO) state is created, bound, and destroyed,
20with triplets of methods that all follow a specific naming scheme.
21For example, ``create_blend_state``, ``bind_blend_state``, and
22``destroy_blend_state``.
Corbin Simpsona524aab2009-12-20 19:41:50 -080023
24CSO objects handled by the context object:
25
26* :ref:`Blend`: ``*_blend_state``
Brian Paul73e37d92011-02-03 12:30:19 -070027* :ref:`Sampler`: Texture sampler states are bound separately for fragment,
Brian Paul55e81b02013-09-12 17:31:08 -060028 vertex, geometry and compute shaders with the ``bind_sampler_states``
29 function. The ``start`` and ``num_samplers`` parameters indicate a range
30 of samplers to change. NOTE: at this time, start is always zero and
31 the CSO module will always replace all samplers at once (no sub-ranges).
32 This may change in the future.
Corbin Simpsona524aab2009-12-20 19:41:50 -080033* :ref:`Rasterizer`: ``*_rasterizer_state``
Ilia Mirkin05d02232014-03-31 18:08:07 -040034* :ref:`depth-stencil-alpha`: ``*_depth_stencil_alpha_state``
Brian Paul73e37d92011-02-03 12:30:19 -070035* :ref:`Shader`: These are create, bind and destroy methods for vertex,
36 fragment and geometry shaders.
Ilia Mirkin05d02232014-03-31 18:08:07 -040037* :ref:`vertexelements`: ``*_vertex_elements_state``
Corbin Simpsona524aab2009-12-20 19:41:50 -080038
Keith Whitwellf3347fe2009-12-21 23:44:32 +000039
40Resource Binding State
41^^^^^^^^^^^^^^^^^^^^^^
42
Erik Faye-Lund40cb5422020-09-28 13:37:20 +020043This state describes how resources in various flavors (textures,
Keith Whitwellf3347fe2009-12-21 23:44:32 +000044buffers, surfaces) are bound to the driver.
45
46
Roland Scheideggerbf575b62010-01-15 18:25:14 +010047* ``set_constant_buffer`` sets a constant buffer to be used for a given shader
Erik Faye-Lund3fffa272020-09-25 13:46:54 +020048 type. index is used to indicate which buffer to set (some APIs may allow
Roland Scheideggerbf575b62010-01-15 18:25:14 +010049 multiple ones to be set, and binding a specific one later, though drivers
50 are mostly restricted to the first one right now).
51
Marek Olšák593517a2020-09-29 17:35:47 -040052* ``set_inlinable_constants`` sets inlinable constants for constant buffer 0.
53
54These are constants that the driver would like to inline in the IR
55of the current shader and recompile it. Drivers can determine which
56constants they prefer to inline in finalize_nir and store that
57information in shader_info::*inlinable_uniform*. When the state tracker
58or frontend uploads constants to a constant buffer, it can pass
59inlinable constants separately via this call.
60
61Any ``set_constant_buffer`` call invalidates inlinable constants, so
62``set_inlinable_constants`` must be called after it. Binding a shader also
63invalidates this state.
64
65There is no ``PIPE_CAP`` for this. Drivers shouldn't set the shader_info
66fields if they don't implement ``set_inlinable_constants``.
67
Keith Whitwellf3347fe2009-12-21 23:44:32 +000068* ``set_framebuffer_state``
Michal Krole81caad2010-02-25 15:33:15 +010069
Keith Whitwellf3347fe2009-12-21 23:44:32 +000070* ``set_vertex_buffers``
71
Brian Paul73e37d92011-02-03 12:30:19 -070072
Corbin Simpsona524aab2009-12-20 19:41:50 -080073Non-CSO State
74^^^^^^^^^^^^^
75
76These pieces of state are too small, variable, and/or trivial to have CSO
77objects. They all follow simple, one-method binding calls, e.g.
Roland Scheidegger98f8c4d02010-02-09 21:48:43 +010078``set_blend_color``.
Corbin Simpson8e1768c2010-03-19 00:07:55 -070079
Roland Scheidegger98f8c4d02010-02-09 21:48:43 +010080* ``set_stencil_ref`` sets the stencil front and back reference values
81 which are used as comparison values in stencil test.
Corbin Simpsona524aab2009-12-20 19:41:50 -080082* ``set_blend_color``
Brian Paulc27a6c42017-12-12 20:32:06 -070083* ``set_sample_mask`` sets the per-context multisample sample mask. Note
84 that this takes effect even if multisampling is not explicitly enabled if
Erik Faye-Lund58512ce2020-09-25 14:46:54 +020085 the framebuffer surface(s) are multisampled. Also, this mask is AND-ed
Brian Paulc27a6c42017-12-12 20:32:06 -070086 with the optional fragment shader sample mask output (when emitted).
Rhys Perry51a221e2018-06-14 19:56:28 -060087* ``set_sample_locations`` sets the sample locations used for rasterization.
88 ```get_sample_position``` still returns the default locations. When NULL,
89 the default locations are used.
Ilia Mirkin88d8d882014-03-30 18:21:04 -040090* ``set_min_samples`` sets the minimum number of samples that must be run.
Corbin Simpsona524aab2009-12-20 19:41:50 -080091* ``set_clip_state``
Corbin Simpsona524aab2009-12-20 19:41:50 -080092* ``set_polygon_stipple``
Zack Rusineaabb4e2013-05-24 16:08:39 -040093* ``set_scissor_states`` sets the bounds for the scissor test, which culls
Corbin Simpson8cf1af42010-01-25 01:12:30 -080094 pixels before blending to render targets. If the :ref:`Rasterizer` does
95 not have the scissor test enabled, then the scissor bounds never need to
Keith Whitwellbc3cff22010-08-20 11:38:33 +010096 be set since they will not be used. Note that scissor xmin and ymin are
97 inclusive, but xmax and ymax are exclusive. The inclusive ranges in x
Zack Rusineaabb4e2013-05-24 16:08:39 -040098 and y would be [xmin..xmax-1] and [ymin..ymax-1]. The number of scissors
99 should be the same as the number of set viewports and can be up to
100 PIPE_MAX_VIEWPORTS.
101* ``set_viewport_states``
Ilia Mirkin82fab732016-06-11 11:35:01 -0400102* ``set_window_rectangles`` sets the window rectangles to be used for
103 rendering, as defined by GL_EXT_window_rectangles. There are two
104 modes - include and exclude, which define whether the supplied
105 rectangles are to be used for including fragments or excluding
106 them. All of the rectangles are ORed together, so in exclude mode,
107 any fragment inside any rectangle would be culled, while in include
108 mode, any fragment outside all rectangles would be culled. xmin/ymin
109 are inclusive, while xmax/ymax are exclusive (same as scissor states
110 above). Note that this only applies to draws, not clears or
111 blits. (Blits have their own way to pass the requisite rectangles
112 in.)
Ilia Mirkin6b262062014-07-20 11:36:49 -0400113* ``set_tess_state`` configures the default tessellation parameters:
Eric Engestrom3a0d2c52017-02-21 14:15:35 +0000114
Ilia Mirkin6b262062014-07-20 11:36:49 -0400115 * ``default_outer_level`` is the default value for the outer tessellation
116 levels. This corresponds to GL's ``PATCH_DEFAULT_OUTER_LEVEL``.
117 * ``default_inner_level`` is the default value for the inner tessellation
118 levels. This corresponds to GL's ``PATCH_DEFAULT_INNER_LEVEL``.
Eric Engestrom3a0d2c52017-02-21 14:15:35 +0000119
Ilia Mirkinfc76cc02015-10-30 03:17:35 -0400120* ``set_debug_callback`` sets the callback to be used for reporting
121 various debug messages, eventually reported via KHR_debug and
122 similar mechanisms.
Corbin Simpsona524aab2009-12-20 19:41:50 -0800123
Brian Paulf4091e12017-06-30 09:23:17 -0600124Samplers
125^^^^^^^^
126
127pipe_sampler_state objects control how textures are sampled (coordinate
128wrap modes, interpolation modes, etc). Note that samplers are not used
129for texture buffer objects. That is, pipe_context::bind_sampler_views()
130will not bind a sampler if the corresponding sampler view refers to a
131PIPE_BUFFER resource.
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000132
Michal Krole4b8a302010-03-16 10:58:33 +0100133Sampler Views
134^^^^^^^^^^^^^
135
136These are the means to bind textures to shader stages. To create one, specify
137its format, swizzle and LOD range in sampler view template.
138
139If texture format is different than template format, it is said the texture
140is being cast to another format. Casting can be done only between compatible
141formats, that is formats that have matching component order and sizes.
142
Gwan-gyeong Mundb91b852017-08-26 17:39:04 +0900143Swizzle fields specify the way in which fetched texel components are placed
Michal Krol980da4a2010-03-19 09:08:33 +0100144in the result register. For example, ``swizzle_r`` specifies what is going to be
145placed in first component of result register.
Michal Krole4b8a302010-03-16 10:58:33 +0100146
Michal Krol980da4a2010-03-19 09:08:33 +0100147The ``first_level`` and ``last_level`` fields of sampler view template specify
Roland Scheidegger4c700142010-12-02 04:33:43 +0100148the LOD range the texture is going to be constrained to. Note that these
149values are in addition to the respective min_lod, max_lod values in the
150pipe_sampler_state (that is if min_lod is 2.0, and first_level 3, the first mip
151level used for sampling from the resource is effectively the fifth).
152
153The ``first_layer`` and ``last_layer`` fields specify the layer range the
154texture is going to be constrained to. Similar to the LOD range, this is added
155to the array index which is used for sampling.
Michal Krole4b8a302010-03-16 10:58:33 +0100156
Brian Paula3ed98f2013-10-07 18:16:22 -0600157* ``set_sampler_views`` binds an array of sampler views to a shader stage.
158 Every binding point acquires a reference
Michal Krole4b8a302010-03-16 10:58:33 +0100159 to a respective sampler view and releases a reference to the previous
Brian Paula3ed98f2013-10-07 18:16:22 -0600160 sampler view.
Michal Krole4b8a302010-03-16 10:58:33 +0100161
Rob Clarke167e8f2019-03-14 08:48:08 -0400162 Sampler views outside of ``[start_slot, start_slot + num_views)`` are
163 unmodified. If ``views`` is NULL, the behavior is the same as if
Erik Faye-Lund580b9d12020-09-30 10:30:19 +0200164 ``views[n]`` was NULL for the entire range, i.e. releasing the reference
Rob Clarke167e8f2019-03-14 08:48:08 -0400165 for all the sampler views in the specified range.
166
Michal Krol980da4a2010-03-19 09:08:33 +0100167* ``create_sampler_view`` creates a new sampler view. ``texture`` is associated
Michal Krole4b8a302010-03-16 10:58:33 +0100168 with the sampler view which results in sampler view holding a reference
169 to the texture. Format specified in template must be compatible
170 with texture format.
171
172* ``sampler_view_destroy`` destroys a sampler view and releases its reference
173 to associated texture.
174
Dave Airliecca56172017-11-01 14:17:49 +1000175Hardware Atomic buffers
176^^^^^^^^^^^^^^^^^^^^^^^
177
178Buffers containing hw atomics are required to support the feature
179on some drivers.
180
181Drivers that require this need to fill the ``set_hw_atomic_buffers`` method.
182
Francisco Jerez5f55cbc2012-05-01 02:47:03 +0200183Shader Resources
184^^^^^^^^^^^^^^^^
185
186Shader resources are textures or buffers that may be read or written
187from a shader without an associated sampler. This means that they
188have no support for floating point coordinates, address wrap modes or
189filtering.
190
Marek Olšák05a12c52015-07-05 14:48:33 +0200191There are 2 types of shader resources: buffers and images.
192
193Buffers are specified using the ``set_shader_buffers`` method.
194
195Images are specified using the ``set_shader_images`` method. When binding
196images, the ``level``, ``first_layer`` and ``last_layer`` pipe_image_view
197fields specify the mipmap level and the range of layers the image will be
198constrained to.
Francisco Jerez5f55cbc2012-05-01 02:47:03 +0200199
Roland Scheidegger4c700142010-12-02 04:33:43 +0100200Surfaces
201^^^^^^^^
202
203These are the means to use resources as color render targets or depthstencil
204attachments. To create one, specify the mip level, the range of layers, and
205the bind flags (either PIPE_BIND_DEPTH_STENCIL or PIPE_BIND_RENDER_TARGET).
206Note that layer values are in addition to what is indicated by the geometry
207shader output variable XXX_FIXME (that is if first_layer is 3 and geometry
208shader indicates index 2, the 5th layer of the resource will be used). These
209first_layer and last_layer parameters will only be used for 1d array, 2d array,
210cube, and 3d textures otherwise they are 0.
211
212* ``create_surface`` creates a new surface.
213
214* ``surface_destroy`` destroys a surface and releases its reference to the
215 associated resource.
Michal Krole4b8a302010-03-16 10:58:33 +0100216
Marek Olšák861a0292011-12-15 18:42:21 +0100217Stream output targets
218^^^^^^^^^^^^^^^^^^^^^
219
220Stream output, also known as transform feedback, allows writing the primitives
221produced by the vertex pipeline to buffers. This is done after the geometry
222shader or vertex shader if no geometry shader is present.
223
224The stream output targets are views into buffer resources which can be bound
225as stream outputs and specify a memory range where it's valid to write
226primitives. The pipe driver must implement memory protection such that any
227primitives written outside of the specified memory range are discarded.
228
229Two stream output targets can use the same resource at the same time, but
230with a disjoint memory range.
231
232Additionally, the stream output target internally maintains the offset
Erik Faye-Lund25501932020-09-25 13:39:35 +0200233into the buffer which is incremented every time something is written to it.
Marek Olšák861a0292011-12-15 18:42:21 +0100234The internal offset is equal to how much data has already been written.
235It can be stored in device memory and the CPU actually doesn't have to query
236it.
237
238The stream output target can be used in a draw command to provide
239the vertex count. The vertex count is derived from the internal offset
240discussed above.
241
242* ``create_stream_output_target`` create a new target.
243
244* ``stream_output_target_destroy`` destroys a target. Users of this should
245 use pipe_so_target_reference instead.
246
247* ``set_stream_output_targets`` binds stream output targets. The parameter
Zack Rusindfa25ea2014-03-06 18:43:44 -0500248 offset is an array which specifies the internal offset of the buffer. The
249 internal offset is, besides writing, used for reading the data during the
250 draw_auto stage, i.e. it specifies how much data there is in the buffer
251 for the purposes of the draw_auto stage. -1 means the buffer should
252 be appended to, and everything else sets the internal offset.
Marek Olšák861a0292011-12-15 18:42:21 +0100253
254NOTE: The currently-bound vertex or geometry shader must be compiled with
255the properly-filled-in structure pipe_stream_output_info describing which
256outputs should be written to buffers and how. The structure is part of
257pipe_shader_state.
258
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000259Clearing
260^^^^^^^^
261
Roland Scheidegger0cd70b52010-05-28 23:57:47 +0200262Clear is one of the most difficult concepts to nail down to a single
263interface (due to both different requirements from APIs and also driver/hw
264specific differences).
265
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000266``clear`` initializes some or all of the surfaces currently bound to
267the framebuffer to particular RGBA, depth, or stencil values.
Roland Scheidegger0cd70b52010-05-28 23:57:47 +0200268Currently, this does not take into account color or stencil write masks (as
269used by GL), and always clears the whole surfaces (no scissoring as used by
270GL clear or explicit rectangles like d3d9 uses). It can, however, also clear
Marek Olšákf04dd3d2013-01-14 06:58:52 +0100271only depth or stencil in a combined depth/stencil surface.
Roland Scheidegger4c700142010-12-02 04:33:43 +0100272If a surface includes several layers then all layers will be cleared.
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000273
Roland Scheideggera6e5c6c2010-06-03 16:33:25 +0200274``clear_render_target`` clears a single color rendertarget with the specified
275color value. While it is only possible to clear one surface at a time (which can
Roland Scheidegger0cd70b52010-05-28 23:57:47 +0200276include several layers), this surface need not be bound to the framebuffer.
Brian Paulc87e8c82016-08-31 10:03:53 -0600277If render_condition_enabled is false, any current rendering condition is ignored
278and the clear will be unconditional.
Roland Scheidegger0cd70b52010-05-28 23:57:47 +0200279
Corbin Simpson517a4fb2010-06-16 11:10:46 -0700280``clear_depth_stencil`` clears a single depth, stencil or depth/stencil surface
Roland Scheideggera6e5c6c2010-06-03 16:33:25 +0200281with the specified depth and stencil values (for combined depth/stencil buffers,
Giuseppe Bilotta60a27ad2016-06-23 19:20:18 +0200282it is also possible to only clear one or the other part). While it is only
Roland Scheidegger0cd70b52010-05-28 23:57:47 +0200283possible to clear one surface at a time (which can include several layers),
284this surface need not be bound to the framebuffer.
Brian Paulc87e8c82016-08-31 10:03:53 -0600285If render_condition_enabled is false, any current rendering condition is ignored
286and the clear will be unconditional.
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000287
Ilia Mirkin3695b252015-11-09 13:27:07 -0500288``clear_texture`` clears a non-PIPE_BUFFER resource's specified level
289and bounding box with a clear value provided in that resource's native
290format.
291
Ilia Mirkin24b86cb2014-03-25 17:10:54 -0400292``clear_buffer`` clears a PIPE_BUFFER resource with the specified clear value
293(which may be multiple bytes in length). Logically this is a memset with a
294multi-byte element value starting at offset bytes from resource start, going
295for size bytes. It is guaranteed that size % clear_value_size == 0.
296
Rhys Perry51a221e2018-06-14 19:56:28 -0600297Evaluating Depth Buffers
298^^^^^^^^^^^^^^^^^^^^^^^^
299
300``evaluate_depth_buffer`` is a hint to decompress the current depth buffer
301assuming the current sample locations to avoid problems that could arise when
302using programmable sample locations.
303
304If a depth buffer is rendered with different sample location state than
305what is current at the time of reading the depth buffer, the values may differ
306because depth buffer compression can depend the sample locations.
307
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000308
Marek Olšákd71bc0d2017-01-26 22:24:13 +0100309Uploading
310^^^^^^^^^
311
312For simple single-use uploads, use ``pipe_context::stream_uploader`` or
313``pipe_context::const_uploader``. The latter should be used for uploading
314constants, while the former should be used for uploading everything else.
315PIPE_USAGE_STREAM is implied in both cases, so don't use the uploaders
316for static allocations.
317
318Usage:
319
320Call u_upload_alloc or u_upload_data as many times as you want. After you are
321done, call u_upload_unmap. If the driver doesn't support persistent mappings,
322u_upload_unmap makes sure the previously mapped memory is unmapped.
323
324Gotchas:
325- Always fill the memory immediately after u_upload_alloc. Any following call
326to u_upload_alloc and u_upload_data can unmap memory returned by previous
327u_upload_alloc.
328- Don't interleave calls using stream_uploader and const_uploader. If you use
329one of them, do the upload, unmap, and only then can you use the other one.
330
331
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000332Drawing
Corbin Simpsona524aab2009-12-20 19:41:50 -0800333^^^^^^^
334
Chia-I Wue7f69c42010-07-17 22:00:04 +0800335``draw_vbo`` draws a specified primitive. The primitive mode and other
336properties are described by ``pipe_draw_info``.
Corbin Simpsona524aab2009-12-20 19:41:50 -0800337
Chia-I Wue7f69c42010-07-17 22:00:04 +0800338The ``mode``, ``start``, and ``count`` fields of ``pipe_draw_info`` specify the
339the mode of the primitive and the vertices to be fetched, in the range between
340``start`` to ``start``+``count``-1, inclusive.
Michal Krolffd28482010-01-14 18:55:52 +0100341
Chia-I Wue7f69c42010-07-17 22:00:04 +0800342Every instance with instanceID in the range between ``start_instance`` and
343``start_instance``+``instance_count``-1, inclusive, will be drawn.
Michal Krolffd28482010-01-14 18:55:52 +0100344
Marek Olšák330d0602017-04-02 16:24:39 +0200345If ``index_size`` != 0, all vertex indices will be looked up from the index
346buffer.
José Fonsecabb78f6a2011-04-16 10:18:20 +0100347
348In indexed draw, ``min_index`` and ``max_index`` respectively provide a lower
349and upper bound of the indices contained in the index buffer inside the range
350between ``start`` to ``start``+``count``-1. This allows the driver to
351determine which subset of vertices will be referenced during te draw call
352without having to scan the index buffer. Providing a over-estimation of the
353the true bounds, for example, a ``min_index`` and ``max_index`` of 0 and
3540xffffffff respectively, must give exactly the same rendering, albeit with less
355performance due to unreferenced vertex buffers being unnecessarily DMA'ed or
356processed. Providing a underestimation of the true bounds will result in
357undefined behavior, but should not result in program or system failure.
358
359In case of non-indexed draw, ``min_index`` should be set to
Chia-I Wue7f69c42010-07-17 22:00:04 +0800360``start`` and ``max_index`` should be set to ``start``+``count``-1.
Corbin Simpsona524aab2009-12-20 19:41:50 -0800361
José Fonsecabb78f6a2011-04-16 10:18:20 +0100362``index_bias`` is a value added to every vertex index after lookup and before
363fetching vertex attributes.
José Fonseca493a1bb2010-04-20 10:22:28 +0200364
Brian Pauladf35e82010-10-21 19:03:38 -0600365When drawing indexed primitives, the primitive restart index can be
366used to draw disjoint primitive strips. For example, several separate
367line strips can be drawn by designating a special index value as the
368restart index. The ``primitive_restart`` flag enables/disables this
369feature. The ``restart_index`` field specifies the restart index value.
370
371When primitive restart is in use, array indexes are compared to the
372restart index before adding the index_bias offset.
373
Michal Krolffd28482010-01-14 18:55:52 +0100374If a given vertex element has ``instance_divisor`` set to 0, it is said
375it contains per-vertex data and effective vertex attribute address needs
376to be recalculated for every index.
377
378 attribAddr = ``stride`` * index + ``src_offset``
379
380If a given vertex element has ``instance_divisor`` set to non-zero,
381it is said it contains per-instance data and effective vertex attribute
382address needs to recalculated for every ``instance_divisor``-th instance.
383
384 attribAddr = ``stride`` * instanceID / ``instance_divisor`` + ``src_offset``
385
386In the above formulas, ``src_offset`` is taken from the given vertex element
387and ``stride`` is taken from a vertex buffer associated with the given
388vertex element.
389
390The calculated attribAddr is used as an offset into the vertex buffer to
391fetch the attribute data.
392
393The value of ``instanceID`` can be read in a vertex shader through a system
394value register declared with INSTANCEID semantic name.
395
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000396
397Queries
398^^^^^^^
399
400Queries gather some statistic from the 3D pipeline over one or more
Marek Olšák8c9b9aa2019-12-03 20:38:14 -0500401draws. Queries may be nested, though not all gallium frontends exercise this.
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000402
403Queries can be created with ``create_query`` and deleted with
Brian Paul98f3f1c2010-01-29 12:36:26 -0700404``destroy_query``. To start a query, use ``begin_query``, and when finished,
405use ``end_query`` to end the query.
406
Ilia Mirkin43e4b3e2014-06-26 19:33:07 -0400407``create_query`` takes a query type (``PIPE_QUERY_*``), as well as an index,
408which is the vertex stream for ``PIPE_QUERY_PRIMITIVES_GENERATED`` and
409``PIPE_QUERY_PRIMITIVES_EMITTED``, and allocates a query structure.
410
Rob Clark20952202014-05-12 22:19:03 -0400411``begin_query`` will clear/reset previous query results.
412
Brian Paul98f3f1c2010-01-29 12:36:26 -0700413``get_query_result`` is used to retrieve the results of a query. If
414the ``wait`` parameter is TRUE, then the ``get_query_result`` call
415will block until the results of the query are ready (and TRUE will be
416returned). Otherwise, if the ``wait`` parameter is FALSE, the call
417will not block and the return value will be TRUE if the query has
418completed or FALSE otherwise.
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000419
Ilia Mirkin40d7f022015-05-02 20:28:11 -0400420``get_query_result_resource`` is used to store the result of a query into
421a resource without synchronizing with the CPU. This write will optionally
422wait for the query to complete, and will optionally write whether the value
423is available instead of the value itself.
424
Marek Olšák26171bd2016-04-08 01:42:00 +0200425``set_active_query_state`` Set whether all current non-driver queries except
426TIME_ELAPSED are active or paused.
427
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200428The interface currently includes the following types of queries:
429
430``PIPE_QUERY_OCCLUSION_COUNTER`` counts the number of fragments which
Corbin Simpsonf1cf6b02010-05-17 12:00:59 -0700431are written to the framebuffer without being culled by
Ilia Mirkin05d02232014-03-31 18:08:07 -0400432:ref:`depth-stencil-alpha` testing or shader KILL instructions.
Brian Paul34613c62011-01-18 16:34:22 -0700433The result is an unsigned 64-bit integer.
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200434This query can be used with ``render_condition``.
435
Zack Rusin0657fc02011-01-26 00:01:51 -0500436In cases where a boolean result of an occlusion query is enough,
437``PIPE_QUERY_OCCLUSION_PREDICATE`` should be used. It is just like
438``PIPE_QUERY_OCCLUSION_COUNTER`` except that the result is a boolean
439value of FALSE for cases where COUNTER would result in 0 and TRUE
440for all other cases.
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200441This query can be used with ``render_condition``.
Corbin Simpsonf1cf6b02010-05-17 12:00:59 -0700442
Nicolai Hähnle3f6b3d92017-09-12 18:46:46 +0200443In cases where a conservative approximation of an occlusion query is enough,
444``PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE`` should be used. It behaves
445like ``PIPE_QUERY_OCCLUSION_PREDICATE``, except that it may return TRUE in
446additional, implementation-dependent cases.
447This query can be used with ``render_condition``.
448
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200449``PIPE_QUERY_TIME_ELAPSED`` returns the amount of time, in nanoseconds,
450the context takes to perform operations.
Brian Paul34613c62011-01-18 16:34:22 -0700451The result is an unsigned 64-bit integer.
Corbin Simpsonf1cf6b02010-05-17 12:00:59 -0700452
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200453``PIPE_QUERY_TIMESTAMP`` returns a device/driver internal timestamp,
454scaled to nanoseconds, recorded after all commands issued prior to
455``end_query`` have been processed.
456This query does not require a call to ``begin_query``.
457The result is an unsigned 64-bit integer.
458
Roland Scheideggercdf89d02013-06-19 23:25:39 +0200459``PIPE_QUERY_TIMESTAMP_DISJOINT`` can be used to check the
460internal timer resolution and whether the timestamp counter has become
461unreliable due to things like throttling etc. - only if this is FALSE
462a timestamp query (within the timestamp_disjoint query) should be trusted.
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200463The result is a 64-bit integer specifying the timer resolution in Hz,
Roland Scheideggercdf89d02013-06-19 23:25:39 +0200464followed by a boolean value indicating whether the timestamp counter
465is discontinuous or disjoint.
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200466
467``PIPE_QUERY_PRIMITIVES_GENERATED`` returns a 64-bit integer indicating
Christoph Bumillerc620aad2013-03-29 14:30:49 +0100468the number of primitives processed by the pipeline (regardless of whether
469stream output is active or not).
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200470
471``PIPE_QUERY_PRIMITIVES_EMITTED`` returns a 64-bit integer indicating
472the number of primitives written to stream output buffers.
473
474``PIPE_QUERY_SO_STATISTICS`` returns 2 64-bit integers corresponding to
Christoph Bumillerc620aad2013-03-29 14:30:49 +0100475the result of
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200476``PIPE_QUERY_PRIMITIVES_EMITTED`` and
Christoph Bumillerc620aad2013-03-29 14:30:49 +0100477the number of primitives that would have been written to stream output buffers
478if they had infinite space available (primitives_storage_needed), in this order.
Roland Scheideggerbd3909f2013-08-23 23:08:43 +0200479XXX the 2nd value is equivalent to ``PIPE_QUERY_PRIMITIVES_GENERATED`` but it is
480unclear if it should be increased if stream output is not active.
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200481
482``PIPE_QUERY_SO_OVERFLOW_PREDICATE`` returns a boolean value indicating
Nicolai Hähnlea6777992017-07-26 19:16:14 +0200483whether a selected stream output target has overflowed as a result of the
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200484commands issued between ``begin_query`` and ``end_query``.
Nicolai Hähnlea6777992017-07-26 19:16:14 +0200485This query can be used with ``render_condition``. The output stream is
486selected by the stream number passed to ``create_query``.
487
488``PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE`` returns a boolean value indicating
489whether any stream output target has overflowed as a result of the commands
490issued between ``begin_query`` and ``end_query``. This query can be used
491with ``render_condition``, and its result is the logical OR of multiple
492``PIPE_QUERY_SO_OVERFLOW_PREDICATE`` queries, one for each stream output
493target.
Christoph Bumiller10f67c02011-10-20 18:03:23 +0200494
495``PIPE_QUERY_GPU_FINISHED`` returns a boolean value indicating whether
496all commands issued before ``end_query`` have completed. However, this
497does not imply serialization.
498This query does not require a call to ``begin_query``.
499
500``PIPE_QUERY_PIPELINE_STATISTICS`` returns an array of the following
50164-bit integers:
502Number of vertices read from vertex buffers.
503Number of primitives read from vertex buffers.
504Number of vertex shader threads launched.
505Number of geometry shader threads launched.
506Number of primitives generated by geometry shaders.
507Number of primitives forwarded to the rasterizer.
508Number of primitives rasterized.
509Number of fragment shader threads launched.
510Number of tessellation control shader threads launched.
511Number of tessellation evaluation shader threads launched.
512If a shader type is not supported by the device/driver,
513the corresponding values should be set to 0.
514
Kenneth Graunked6446982018-09-28 11:21:47 +0200515``PIPE_QUERY_PIPELINE_STATISTICS_SINGLE`` returns a single counter from
516the ``PIPE_QUERY_PIPELINE_STATISTICS`` group. The specific counter must
517be selected when calling ``create_query`` by passing one of the
518``PIPE_STAT_QUERY`` enums as the query's ``index``.
519
Corbin Simpsonf1cf6b02010-05-17 12:00:59 -0700520Gallium does not guarantee the availability of any query types; one must
521always check the capabilities of the :ref:`Screen` first.
Brian Paul6c1549a2010-01-21 11:52:36 -0700522
523
524Conditional Rendering
525^^^^^^^^^^^^^^^^^^^^^
526
527A drawing command can be skipped depending on the outcome of a query
Roland Scheidegger793e8e32013-06-14 19:48:57 +0200528(typically an occlusion query, or streamout overflow predicate).
529The ``render_condition`` function specifies the query which should be checked
Roland Scheideggerf49e2012014-05-29 01:21:20 +0200530prior to rendering anything. Functions always honoring render_condition include
Marek Olšáka9092102016-08-09 00:37:39 +0200531(and are limited to) draw_vbo and clear.
532The blit, clear_render_target and clear_depth_stencil functions (but
533not resource_copy_region, which seems inconsistent) can also optionally honor
534the current render condition.
Brian Paul6c1549a2010-01-21 11:52:36 -0700535
536If ``render_condition`` is called with ``query`` = NULL, conditional
537rendering is disabled and drawing takes place normally.
538
539If ``render_condition`` is called with a non-null ``query`` subsequent
Roland Scheidegger793e8e32013-06-14 19:48:57 +0200540drawing commands will be predicated on the outcome of the query.
541Commands will be skipped if ``condition`` is equal to the predicate result
542(for non-boolean queries such as OCCLUSION_QUERY, zero counts as FALSE,
543non-zero as TRUE).
Brian Paul6c1549a2010-01-21 11:52:36 -0700544
545If ``mode`` is PIPE_RENDER_COND_WAIT the driver will wait for the
546query to complete before deciding whether to render.
547
548If ``mode`` is PIPE_RENDER_COND_NO_WAIT and the query has not yet
549completed, the drawing command will be executed normally. If the query
550has completed, drawing will be predicated on the outcome of the query.
551
552If ``mode`` is PIPE_RENDER_COND_BY_REGION_WAIT or
553PIPE_RENDER_COND_BY_REGION_NO_WAIT rendering will be predicated as above
Roland Scheidegger793e8e32013-06-14 19:48:57 +0200554for the non-REGION modes but in the case that an occlusion query returns
Brian Paul6c1549a2010-01-21 11:52:36 -0700555a non-zero result, regions which were occluded may be ommitted by subsequent
556drawing commands. This can result in better performance with some GPUs.
557Normally, if the occlusion query returned a non-zero result subsequent
558drawing happens normally so fragments may be generated, shaded and
559processed even where they're known to be obscured.
560
561
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000562Flushing
563^^^^^^^^
564
Corbin Simpsona524aab2009-12-20 19:41:50 -0800565``flush``
566
Marek Olšákd17b35e2016-07-15 15:44:29 +0200567PIPE_FLUSH_END_OF_FRAME: Whether the flush marks the end of frame.
568
569PIPE_FLUSH_DEFERRED: It is not required to flush right away, but it is required
Marek Olšák54272e12016-08-06 16:41:42 +0200570to return a valid fence. If fence_finish is called with the returned fence
571and the context is still unflushed, and the ctx parameter of fence_finish is
572equal to the context where the fence was created, fence_finish will flush
573the context.
Marek Olšákd17b35e2016-07-15 15:44:29 +0200574
Nicolai Hähnleea6df1c2017-10-22 17:38:47 +0200575PIPE_FLUSH_ASYNC: The flush is allowed to be asynchronous. Unlike
576``PIPE_FLUSH_DEFERRED``, the driver must still ensure that the returned fence
577will finish in finite time. However, subsequent operations in other contexts of
578the same screen are no longer guaranteed to happen after the flush. Drivers
579which use this flag must implement pipe_context::fence_server_sync.
580
581PIPE_FLUSH_HINT_FINISH: Hints to the driver that the caller will immediately
582wait for the returned fence.
583
Nicolai Hähnle1e5c9cf2017-10-22 17:38:48 +0200584Additional flags may be set together with ``PIPE_FLUSH_DEFERRED`` for even
585finer-grained fences. Note that as a general rule, GPU caches may not have been
586flushed yet when these fences are signaled. Drivers are free to ignore these
587flags and create normal fences instead. At most one of the following flags can
588be specified:
589
590PIPE_FLUSH_TOP_OF_PIPE: The fence should be signaled as soon as the next
591command is ready to start executing at the top of the pipeline, before any of
592its data is actually read (including indirect draw parameters).
593
594PIPE_FLUSH_BOTTOM_OF_PIPE: The fence should be signaled as soon as the previous
595command has finished executing on the GPU entirely (but data written by the
596command may still be in caches and inaccessible to the CPU).
597
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000598
Marek Olšák419cd5f2013-09-20 15:08:29 +0200599``flush_resource``
600
601Flush the resource cache, so that the resource can be used
602by an external client. Possible usage:
603- flushing a resource before presenting it on the screen
604- flushing a resource if some other process or device wants to use it
605This shouldn't be used to flush caches if the resource is only managed
606by a single pipe_screen and is not shared with another process.
607(i.e. you shouldn't use it to flush caches explicitly if you want to e.g.
608use the resource for texturing)
609
Andres Rodriguezd34c2cf2017-12-14 00:24:46 -0500610Fences
611^^^^^^
Marek Olšák419cd5f2013-09-20 15:08:29 +0200612
Andres Rodriguezd34c2cf2017-12-14 00:24:46 -0500613``pipe_fence_handle``, and related methods, are used to synchronize
614execution between multiple parties. Examples include CPU <-> GPU synchronization,
615renderer <-> windowing system, multiple external APIs, etc.
616
617A ``pipe_fence_handle`` can either be 'one time use' or 're-usable'. A 'one time use'
618fence behaves like a traditional GPU fence. Once it reaches the signaled state it
619is forever considered to be signaled.
620
621Once a re-usable ``pipe_fence_handle`` becomes signaled, it can be reset
622back into an unsignaled state. The ``pipe_fence_handle`` will be reset to
623the unsignaled state by performing a wait operation on said object, i.e.
Erik Faye-Lund98909272020-09-25 14:54:56 +0200624``fence_server_sync``. As a corollary to this behavior, a re-usable
Andres Rodriguezd34c2cf2017-12-14 00:24:46 -0500625``pipe_fence_handle`` can only have one waiter.
626
Erik Faye-Lund98909272020-09-25 14:54:56 +0200627This behavior is useful in producer <-> consumer chains. It helps avoid
Erik Faye-Lund33180432020-09-25 14:51:40 +0200628unnecessarily sharing a new ``pipe_fence_handle`` each time a new frame is
Andres Rodriguezd34c2cf2017-12-14 00:24:46 -0500629ready. Instead, the fences are exchanged once ahead of time, and access is synchronized
630through GPU signaling instead of direct producer <-> consumer communication.
631
632``fence_server_sync`` inserts a wait command into the GPU's command stream.
633
634``fence_server_signal`` inserts a signal command into the GPU's command stream.
635
636There are no guarantees that the wait/signal commands will be flushed when
637calling ``fence_server_sync`` or ``fence_server_signal``. An explicit
638call to ``flush`` is required to make sure the commands are emitted to the GPU.
639
640The Gallium implementation may implicitly ``flush`` the command stream during a
641``fence_server_sync`` or ``fence_server_signal`` call if necessary.
Marek Olšák419cd5f2013-09-20 15:08:29 +0200642
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000643Resource Busy Queries
644^^^^^^^^^^^^^^^^^^^^^
645
Keith Whitwell287c94e2010-04-10 16:05:54 +0100646``is_resource_referenced``
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000647
648
649
650Blitting
651^^^^^^^^
Corbin Simpsona524aab2009-12-20 19:41:50 -0800652
Roland Scheidegger379db6a2010-05-17 21:02:24 +0200653These methods emulate classic blitter controls.
Corbin Simpsona524aab2009-12-20 19:41:50 -0800654
Roland Scheideggeraac2cccc2010-04-26 19:50:57 +0200655These methods operate directly on ``pipe_resource`` objects, and stand
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000656apart from any 3D state in the context. Blitting functionality may be
657moved to a separate abstraction at some point in the future.
658
Roland Scheidegger4c700142010-12-02 04:33:43 +0100659``resource_copy_region`` blits a region of a resource to a region of another
660resource, provided that both resources have the same format, or compatible
661formats, i.e., formats for which copying the bytes from the source resource
662unmodified to the destination resource will achieve the same effect of a
663textured quad blitter.. The source and destination may be the same resource,
664but overlapping blits are not permitted.
Marek Olšákc4df2e32012-09-12 01:36:31 +0200665This can be considered the equivalent of a CPU memcpy.
666
667``blit`` blits a region of a resource to a region of another resource, including
Roland Scheideggerf49e2012014-05-29 01:21:20 +0200668scaling, format conversion, and up-/downsampling, as well as a destination clip
Ilia Mirkin82fab732016-06-11 11:35:01 -0400669rectangle (scissors) and window rectangles. It can also optionally honor the
670current render condition (but either way the blit itself never contributes
671anything to queries currently gathering data).
Marek Olšákc4df2e32012-09-12 01:36:31 +0200672As opposed to manually drawing a textured quad, this lets the pipe driver choose
673the optimal method for blitting (like using a special 2D engine), and usually
674offers, for example, accelerated stencil-only copies even where
675PIPE_CAP_SHADER_STENCIL_EXPORT is not available.
Roland Scheideggeraac2cccc2010-04-26 19:50:57 +0200676
Keith Whitwellf3347fe2009-12-21 23:44:32 +0000677
Keith Whitwell287c94e2010-04-10 16:05:54 +0100678Transfers
679^^^^^^^^^
680
681These methods are used to get data to/from a resource.
682
Marek Olšák369e4682012-10-08 04:06:42 +0200683``transfer_map`` creates a memory mapping and the transfer object
684associated with it.
685The returned pointer points to the start of the mapped range according to
686the box region, not the beginning of the resource. If transfer_map fails,
687the returned pointer to the buffer memory is NULL, and the pointer
688to the transfer object remains unchanged (i.e. it can be non-NULL).
Keith Whitwell287c94e2010-04-10 16:05:54 +0100689
Marek Olšák369e4682012-10-08 04:06:42 +0200690``transfer_unmap`` remove the memory mapping for and destroy
691the transfer object. The pointer into the resource should be considered
692invalid and discarded.
Keith Whitwell287c94e2010-04-10 16:05:54 +0100693
Marek Olšák1ffe77e2016-07-16 21:19:48 +0200694``texture_subdata`` and ``buffer_subdata`` perform a simplified
695transfer for simple writes. Basically transfer_map, data write, and
696transfer_unmap all in one.
Keith Whitwell287c94e2010-04-10 16:05:54 +0100697
Brian Paulc5fb0512011-01-28 20:25:27 -0700698
699The box parameter to some of these functions defines a 1D, 2D or 3D
700region of pixels. This is self-explanatory for 1D, 2D and 3D texture
701targets.
702
Roland Scheidegger0f4c08a2013-06-07 20:54:54 +0200703For PIPE_TEXTURE_1D_ARRAY and PIPE_TEXTURE_2D_ARRAY, the box::z and box::depth
704fields refer to the array dimension of the texture.
Brian Paulc5fb0512011-01-28 20:25:27 -0700705
706For PIPE_TEXTURE_CUBE, the box:z and box::depth fields refer to the
707faces of the cube map (z + depth <= 6).
708
Roland Scheidegger0f4c08a2013-06-07 20:54:54 +0200709For PIPE_TEXTURE_CUBE_ARRAY, the box:z and box::depth fields refer to both
710the face and array dimension of the texture (face = z % 6, array = z / 6).
Brian Paulc5fb0512011-01-28 20:25:27 -0700711
712
Corbin Simpsonbb81f652010-05-17 12:58:29 -0700713.. _transfer_flush_region:
714
715transfer_flush_region
716%%%%%%%%%%%%%%%%%%%%%
717
718If a transfer was created with ``FLUSH_EXPLICIT``, it will not automatically
719be flushed on write or unmap. Flushes must be requested with
720``transfer_flush_region``. Flush ranges are relative to the mapped range, not
721the beginning of the resource.
722
Marek Olšák588fa882011-02-09 01:10:11 +0100723
724
Andreas Bollecb02c22012-10-23 18:29:41 +0200725.. _texture_barrier:
Marek Olšákaea4ed42011-03-08 11:32:35 +0100726
727texture_barrier
728%%%%%%%%%%%%%%%
729
730This function flushes all pending writes to the currently-set surfaces and
Ilia Mirkina1c84842017-01-01 23:42:17 -0500731invalidates all read caches of the currently-set samplers. This can be used
732for both regular textures as well as for framebuffers read via FBFETCH.
Marek Olšákaea4ed42011-03-08 11:32:35 +0100733
734
735
Marek Olšák5f61f052014-01-27 21:42:07 +0100736.. _memory_barrier:
737
738memory_barrier
739%%%%%%%%%%%%%%%
740
741This function flushes caches according to which of the PIPE_BARRIER_* flags
742are set.
743
744
745
Nicolai Hähnled6e6fa02017-02-02 21:10:44 +0100746.. _resource_commit:
747
748resource_commit
749%%%%%%%%%%%%%%%
750
751This function changes the commit state of a part of a sparse resource. Sparse
752resources are created by setting the ``PIPE_RESOURCE_FLAG_SPARSE`` flag when
753calling ``resource_create``. Initially, sparse resources only reserve a virtual
754memory region that is not backed by memory (i.e., it is uncommitted). The
755``resource_commit`` function can be called to commit or uncommit parts (or all)
756of a resource. The driver manages the underlying backing memory.
757
758The contents of newly committed memory regions are undefined. Calling this
759function to commit an already committed memory region is allowed and leaves its
760content unchanged. Similarly, calling this function to uncommit an already
761uncommitted memory region is allowed.
762
763For buffers, the given box must be aligned to multiples of
764``PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE``. As an exception to this rule, if the size
765of the buffer is not a multiple of the page size, changing the commit state of
766the last (partial) page requires a box that ends at the end of the buffer
767(i.e., box->x + box->width == buffer->width0).
768
769
770
Keith Whitwell287c94e2010-04-10 16:05:54 +0100771.. _pipe_transfer:
772
Marek Olšák22253e62020-07-01 08:16:12 -0400773PIPE_MAP
Keith Whitwell287c94e2010-04-10 16:05:54 +0100774^^^^^^^^^^^^^
775
776These flags control the behavior of a transfer object.
777
Marek Olšák22253e62020-07-01 08:16:12 -0400778``PIPE_MAP_READ``
José Fonseca0562f442011-02-22 14:14:22 +0000779 Resource contents read back (or accessed directly) at transfer create time.
780
Marek Olšák22253e62020-07-01 08:16:12 -0400781``PIPE_MAP_WRITE``
Marek Olšák369e4682012-10-08 04:06:42 +0200782 Resource contents will be written back at transfer_unmap time (or modified
José Fonseca0562f442011-02-22 14:14:22 +0000783 as a result of being accessed directly).
784
Marek Olšák22253e62020-07-01 08:16:12 -0400785``PIPE_MAP_DIRECTLY``
José Fonseca0562f442011-02-22 14:14:22 +0000786 a transfer should directly map the resource. May return NULL if not supported.
787
Marek Olšák22253e62020-07-01 08:16:12 -0400788``PIPE_MAP_DISCARD_RANGE``
José Fonseca0562f442011-02-22 14:14:22 +0000789 The memory within the mapped region is discarded. Cannot be used with
Marek Olšák22253e62020-07-01 08:16:12 -0400790 ``PIPE_MAP_READ``.
José Fonseca0562f442011-02-22 14:14:22 +0000791
Marek Olšák22253e62020-07-01 08:16:12 -0400792``PIPE_MAP_DISCARD_WHOLE_RESOURCE``
José Fonseca0562f442011-02-22 14:14:22 +0000793 Discards all memory backing the resource. It should not be used with
Marek Olšák22253e62020-07-01 08:16:12 -0400794 ``PIPE_MAP_READ``.
José Fonseca0562f442011-02-22 14:14:22 +0000795
Marek Olšák22253e62020-07-01 08:16:12 -0400796``PIPE_MAP_DONTBLOCK``
José Fonseca0562f442011-02-22 14:14:22 +0000797 Fail if the resource cannot be mapped immediately.
798
Marek Olšák22253e62020-07-01 08:16:12 -0400799``PIPE_MAP_UNSYNCHRONIZED``
José Fonseca0562f442011-02-22 14:14:22 +0000800 Do not synchronize pending operations on the resource when mapping. The
801 interaction of any writes to the map and any operations pending on the
Marek Olšák22253e62020-07-01 08:16:12 -0400802 resource are undefined. Cannot be used with ``PIPE_MAP_READ``.
José Fonseca0562f442011-02-22 14:14:22 +0000803
Marek Olšák22253e62020-07-01 08:16:12 -0400804``PIPE_MAP_FLUSH_EXPLICIT``
José Fonseca0562f442011-02-22 14:14:22 +0000805 Written ranges will be notified later with :ref:`transfer_flush_region`.
Marek Olšák22253e62020-07-01 08:16:12 -0400806 Cannot be used with ``PIPE_MAP_READ``.
Francisco Jerezd9d82dc2012-04-25 22:15:16 +0200807
Marek Olšák22253e62020-07-01 08:16:12 -0400808``PIPE_MAP_PERSISTENT``
Marek Olšák5f61f052014-01-27 21:42:07 +0100809 Allows the resource to be used for rendering while mapped.
810 PIPE_RESOURCE_FLAG_MAP_PERSISTENT must be set when creating
811 the resource.
812 If COHERENT is not set, memory_barrier(PIPE_BARRIER_MAPPED_BUFFER)
813 must be called to ensure the device can see what the CPU has written.
814
Marek Olšák22253e62020-07-01 08:16:12 -0400815``PIPE_MAP_COHERENT``
Marek Olšák5f61f052014-01-27 21:42:07 +0100816 If PERSISTENT is set, this ensures any writes done by the device are
817 immediately visible to the CPU and vice versa.
818 PIPE_RESOURCE_FLAG_MAP_COHERENT must be set when creating
819 the resource.
Francisco Jerezd9d82dc2012-04-25 22:15:16 +0200820
821Compute kernel execution
822^^^^^^^^^^^^^^^^^^^^^^^^
823
824A compute program can be defined, bound or destroyed using
825``create_compute_state``, ``bind_compute_state`` or
826``destroy_compute_state`` respectively.
827
828Any of the subroutines contained within the compute program can be
829executed on the device using the ``launch_grid`` method. This method
830will execute as many instances of the program as elements in the
831specified N-dimensional grid, hopefully in parallel.
832
833The compute program has access to four special resources:
834
835* ``GLOBAL`` represents a memory space shared among all the threads
836 running on the device. An arbitrary buffer created with the
837 ``PIPE_BIND_GLOBAL`` flag can be mapped into it using the
838 ``set_global_binding`` method.
839
840* ``LOCAL`` represents a memory space shared among all the threads
841 running in the same working group. The initial contents of this
842 resource are undefined.
843
844* ``PRIVATE`` represents a memory space local to a single thread.
845 The initial contents of this resource are undefined.
846
847* ``INPUT`` represents a read-only memory space that can be
848 initialized at ``launch_grid`` time.
849
850These resources use a byte-based addressing scheme, and they can be
851accessed from the compute program by means of the LOAD/STORE TGSI
Francisco Jerez5f55cbc2012-05-01 02:47:03 +0200852opcodes. Additional resources to be accessed using the same opcodes
853may be specified by the user with the ``set_compute_resources``
854method.
Francisco Jerezd9d82dc2012-04-25 22:15:16 +0200855
856In addition, normal texture sampling is allowed from the compute
Brian Paul55e81b02013-09-12 17:31:08 -0600857program: ``bind_sampler_states`` may be used to set up texture
Brian Paula3ed98f2013-10-07 18:16:22 -0600858samplers for the compute stage and ``set_sampler_views`` may
Francisco Jerezd9d82dc2012-04-25 22:15:16 +0200859be used to bind a number of sampler views to it.
Charmaine Lee3038e892016-01-14 10:22:17 -0700860
861Mipmap generation
862^^^^^^^^^^^^^^^^^
863
864If PIPE_CAP_GENERATE_MIPMAP is true, ``generate_mipmap`` can be used
865to generate mipmaps for the specified texture resource.
866It replaces texel image levels base_level+1 through
867last_level for layers range from first_layer through last_layer.
868It returns TRUE if mipmap generation succeeds, otherwise it
869returns FALSE. Mipmap generation may fail when it is not supported
870for particular texture types or formats.
Nicolai Hähnle1a3c75e2016-09-30 12:32:02 +0200871
872Device resets
873^^^^^^^^^^^^^
874
Marek Olšák8c9b9aa2019-12-03 20:38:14 -0500875Gallium frontends can query or request notifications of when the GPU
Nicolai Hähnle1a3c75e2016-09-30 12:32:02 +0200876is reset for whatever reason (application error, driver error). When
877a GPU reset happens, the context becomes unusable and all related state
878should be considered lost and undefined. Despite that, context
879notifications are single-shot, i.e. subsequent calls to
880``get_device_reset_status`` will return PIPE_NO_RESET.
881
882* ``get_device_reset_status`` queries whether a device reset has happened
883 since the last call or since the last notification by callback.
884* ``set_device_reset_callback`` sets a callback which will be called when
885 a device reset is detected. The callback is only called synchronously.
Axel Davyc4268fd2016-12-19 20:06:51 +0100886
Samuel Pitoiset8a68b4d2017-03-29 01:34:05 +0200887Bindless
888^^^^^^^^
889
890If PIPE_CAP_BINDLESS_TEXTURE is TRUE, the following ``pipe_context`` functions
891are used to create/delete bindless handles, and to make them resident in the
892current context when they are going to be used by shaders.
893
894* ``create_texture_handle`` creates a 64-bit unsigned integer texture handle
895 that is going to be directly used in shaders.
896* ``delete_texture_handle`` deletes a 64-bit unsigned integer texture handle.
897* ``make_texture_handle_resident`` makes a 64-bit unsigned texture handle
898 resident in the current context to be accessible by shaders for texture
899 mapping.
900* ``create_image_handle`` creates a 64-bit unsigned integer image handle that
901 is going to be directly used in shaders.
902* ``delete_image_handle`` deletes a 64-bit unsigned integer image handle.
903* ``make_image_handle_resident`` makes a 64-bit unsigned integer image handle
904 resident in the current context to be accessible by shaders for image loads,
905 stores and atomic operations.
906
Axel Davyc4268fd2016-12-19 20:06:51 +0100907Using several contexts
908----------------------
909
910Several contexts from the same screen can be used at the same time. Objects
911created on one context cannot be used in another context, but the objects
912created by the screen methods can be used by all contexts.
913
914Transfers
915^^^^^^^^^
916A transfer on one context is not expected to synchronize properly with
917rendering on other contexts, thus only areas not yet used for rendering should
918be locked.
919
920A flush is required after transfer_unmap to expect other contexts to see the
921uploaded data, unless:
922
923* Using persistent mapping. Associated with coherent mapping, unmapping the
924 resource is also not required to use it in other contexts. Without coherent
925 mapping, memory_barrier(PIPE_BARRIER_MAPPED_BUFFER) should be called on the
926 context that has mapped the resource. No flush is required.
927
Marek Olšák22253e62020-07-01 08:16:12 -0400928* Mapping the resource with PIPE_MAP_DIRECTLY.