#include "st_cb_fbo.h"
#include "st_draw.h"
#include "st_format.h"
+#include "st_nir.h"
#include "st_program.h"
+#include "st_util.h"
#include "pipe/p_context.h"
#include "pipe/p_shader_tokens.h"
static inline void
set_fragment_shader(struct st_context *st)
{
- if (!st->clear.fs)
- st->clear.fs =
- util_make_fragment_passthrough_shader(st->pipe, TGSI_SEMANTIC_GENERIC,
- TGSI_INTERPOLATE_CONSTANT,
- TRUE);
+ struct pipe_screen *pscreen = st->pipe->screen;
+ bool use_nir = PIPE_SHADER_IR_NIR ==
+ pscreen->get_shader_param(pscreen, PIPE_SHADER_VERTEX,
+ PIPE_SHADER_CAP_PREFERRED_IR);
+
+ if (!st->clear.fs) {
+ if (use_nir) {
+ unsigned inputs[] = { VARYING_SLOT_VAR0 };
+ unsigned outputs[] = { FRAG_RESULT_COLOR };
+ unsigned interpolation[] = { INTERP_MODE_FLAT };
+ st->clear.fs = st_nir_make_passthrough_shader(st, "clear FS",
+ MESA_SHADER_FRAGMENT,
+ 1, inputs, outputs,
+ interpolation, 0);
+ } else {
+ st->clear.fs =
+ util_make_fragment_passthrough_shader(st->pipe,
+ TGSI_SEMANTIC_GENERIC,
+ TGSI_INTERPOLATE_CONSTANT,
+ TRUE);
+ }
+ }
cso_set_fragment_shader_handle(st->cso_context, st->clear.fs);
}
+static void *
+make_nir_clear_vertex_shader(struct st_context *st, bool layered)
+{
+ const char *shader_name = layered ? "layered clear VS" : "clear VS";
+ unsigned inputs[] = {
+ VERT_ATTRIB_POS,
+ VERT_ATTRIB_GENERIC0,
+ SYSTEM_VALUE_INSTANCE_ID,
+ };
+ unsigned outputs[] = {
+ VARYING_SLOT_POS,
+ VARYING_SLOT_VAR0,
+ VARYING_SLOT_LAYER
+ };
+
+ return st_nir_make_passthrough_shader(st, shader_name, MESA_SHADER_VERTEX,
+ layered ? 3 : 2, inputs, outputs,
+ NULL, (1 << 2));
+}
+
+
/**
* Helper function to set the vertex shader.
*/
static inline void
set_vertex_shader(struct st_context *st)
{
+ struct pipe_screen *pscreen = st->pipe->screen;
+ bool use_nir = PIPE_SHADER_IR_NIR ==
+ pscreen->get_shader_param(pscreen, PIPE_SHADER_VERTEX,
+ PIPE_SHADER_CAP_PREFERRED_IR);
+
/* vertex shader - still required to provide the linkage between
* fragment shader input semantics and vertex_element/buffers.
*/
if (!st->clear.vs)
{
- const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
- TGSI_SEMANTIC_GENERIC };
- const uint semantic_indexes[] = { 0, 0 };
- st->clear.vs = util_make_vertex_passthrough_shader(st->pipe, 2,
- semantic_names,
- semantic_indexes,
- FALSE);
+ if (use_nir) {
+ st->clear.vs = make_nir_clear_vertex_shader(st, false);
+ } else {
+ const enum tgsi_semantic semantic_names[] = {
+ TGSI_SEMANTIC_POSITION,
+ TGSI_SEMANTIC_GENERIC
+ };
+ const uint semantic_indexes[] = { 0, 0 };
+ st->clear.vs = util_make_vertex_passthrough_shader(st->pipe, 2,
+ semantic_names,
+ semantic_indexes,
+ FALSE);
+ }
}
cso_set_vertex_shader_handle(st->cso_context, st->clear.vs);
set_vertex_shader_layered(struct st_context *st)
{
struct pipe_context *pipe = st->pipe;
+ struct pipe_screen *pscreen = pipe->screen;
+ bool use_nir = PIPE_SHADER_IR_NIR ==
+ pscreen->get_shader_param(pscreen, PIPE_SHADER_VERTEX,
+ PIPE_SHADER_CAP_PREFERRED_IR);
if (!pipe->screen->get_param(pipe->screen, PIPE_CAP_TGSI_INSTANCEID)) {
assert(!"Got layered clear, but VS instancing is unsupported");
bool vs_layer =
pipe->screen->get_param(pipe->screen, PIPE_CAP_TGSI_VS_LAYER_VIEWPORT);
if (vs_layer) {
- st->clear.vs_layered = util_make_layered_clear_vertex_shader(pipe);
+ st->clear.vs_layered =
+ use_nir ? make_nir_clear_vertex_shader(st, true)
+ : util_make_layered_clear_vertex_shader(pipe);
} else {
st->clear.vs_layered = util_make_layered_clear_helper_vertex_shader(pipe);
st->clear.gs_layered = util_make_layered_clear_geometry_shader(pipe);
CSO_BIT_STREAM_OUTPUTS |
CSO_BIT_VERTEX_ELEMENTS |
CSO_BIT_AUX_VERTEX_BUFFER_SLOT |
- CSO_BIT_PAUSE_QUERIES |
+ (st->active_queries ? CSO_BIT_PAUSE_QUERIES : 0) |
CSO_BITS_ALL_SHADERS));
/* blend state: RGBA masking */
cso_set_stream_outputs(cso, 0, NULL, NULL);
cso_set_sample_mask(cso, ~0);
cso_set_min_samples(cso, 1);
+ st->clear.raster.multisample = st->state.fb_num_samples > 1;
cso_set_rasterizer(cso, &st->clear.raster);
/* viewport state: viewport matching window dims */
if (!strb || !strb->surface)
continue;
- if (!GET_COLORMASK(ctx->Color.ColorMask, colormask_index))
+ unsigned colormask =
+ GET_COLORMASK(ctx->Color.ColorMask, colormask_index);
+
+ if (!colormask)
continue;
+ unsigned surf_colormask =
+ util_format_colormask(util_format_description(strb->surface->format));
+
if (is_scissor_enabled(ctx, rb) ||
is_window_rectangle_enabled(ctx) ||
- GET_COLORMASK(ctx->Color.ColorMask, colormask_index) != 0xf)
+ ((colormask & surf_colormask) != surf_colormask))
quad_buffers |= PIPE_CLEAR_COLOR0 << i;
else
clear_buffers |= PIPE_CLEAR_COLOR0 << i;
* use pipe->clear. We want to always use pipe->clear for the other
* renderbuffers, because it's likely to be faster.
*/
- if (quad_buffers) {
- clear_with_quad(ctx, quad_buffers);
- }
if (clear_buffers) {
/* We can't translate the clear color to the colorbuffer format,
* because different colorbuffers may have different formats.
(union pipe_color_union*)&ctx->Color.ClearColor,
ctx->Depth.Clear, ctx->Stencil.Clear);
}
+ if (quad_buffers) {
+ clear_with_quad(ctx, quad_buffers);
+ }
if (mask & BUFFER_BIT_ACCUM)
_mesa_clear_accum_buffer(ctx);
}