gallium: Add new PIPE_CAP_SURFACE_SAMPLE_COUNT
This new pipe cap and the new nr_samples field in pipe_surface lets a state tracker bind a render target with a different sample count than the resource. This allows for implementing EXT_multisampled_render_to_texture and EXT_multisampled_render_to_texture2. Reviewed-by: Eric Anholt <eric@anholt.net> Signed-off-by: Kristian H. Kristensen <hoegsberg@chromium.org>
This commit is contained in:
@@ -229,13 +229,19 @@ util_framebuffer_get_num_samples(const struct pipe_framebuffer_state *fb)
|
|||||||
if (!(fb->nr_cbufs || fb->zsbuf))
|
if (!(fb->nr_cbufs || fb->zsbuf))
|
||||||
return MAX2(fb->samples, 1);
|
return MAX2(fb->samples, 1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If a driver doesn't advertise PIPE_CAP_SURFACE_SAMPLE_COUNT,
|
||||||
|
* pipe_surface::nr_samples will always be 0.
|
||||||
|
*/
|
||||||
for (i = 0; i < fb->nr_cbufs; i++) {
|
for (i = 0; i < fb->nr_cbufs; i++) {
|
||||||
if (fb->cbufs[i]) {
|
if (fb->cbufs[i]) {
|
||||||
return MAX2(1, fb->cbufs[i]->texture->nr_samples);
|
return MAX3(1, fb->cbufs[i]->texture->nr_samples,
|
||||||
|
fb->cbufs[i]->nr_samples);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fb->zsbuf) {
|
if (fb->zsbuf) {
|
||||||
return MAX2(1, fb->zsbuf->texture->nr_samples);
|
return MAX3(1, fb->zsbuf->texture->nr_samples,
|
||||||
|
fb->zsbuf->nr_samples);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -477,6 +477,9 @@ subpixel precision bias in bits during conservative rasterization.
|
|||||||
0 means no limit.
|
0 means no limit.
|
||||||
* ``PIPE_CAP_MAX_VERTEX_ELEMENT_SRC_OFFSET``: The maximum supported value for
|
* ``PIPE_CAP_MAX_VERTEX_ELEMENT_SRC_OFFSET``: The maximum supported value for
|
||||||
of pipe_vertex_element::src_offset.
|
of pipe_vertex_element::src_offset.
|
||||||
|
* ``PIPE_CAP_SURFACE_SAMPLE_COUNT_TEXTURE``: Whether the driver
|
||||||
|
supports pipe_surface overrides of resource nr_samples. If set, will
|
||||||
|
enable EXT_multisampled_render_to_texture.
|
||||||
|
|
||||||
.. _pipe_capf:
|
.. _pipe_capf:
|
||||||
|
|
||||||
|
|||||||
@@ -832,6 +832,7 @@ enum pipe_cap
|
|||||||
PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS,
|
PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS,
|
||||||
PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET,
|
PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET,
|
||||||
PIPE_CAP_MAX_VERTEX_ELEMENT_SRC_OFFSET,
|
PIPE_CAP_MAX_VERTEX_ELEMENT_SRC_OFFSET,
|
||||||
|
PIPE_CAP_SURFACE_SAMPLE_COUNT,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -443,6 +443,13 @@ struct pipe_surface
|
|||||||
uint16_t width; /**< logical width in pixels */
|
uint16_t width; /**< logical width in pixels */
|
||||||
uint16_t height; /**< logical height in pixels */
|
uint16_t height; /**< logical height in pixels */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of samples for the surface. This will be 0 if rendering
|
||||||
|
* should use the resource's nr_samples, or another value if the resource
|
||||||
|
* is bound using FramebufferTexture2DMultisampleEXT.
|
||||||
|
*/
|
||||||
|
unsigned nr_samples:8;
|
||||||
|
|
||||||
union pipe_surface_desc u;
|
union pipe_surface_desc u;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user