st/mesa: implement layered framebuffer clear for the clear_with_quad fallback
Same approach as in u_blitter.
This commit is contained in:
parent
6b919b1b2d
commit
e47af58bb4
|
@ -1416,3 +1416,23 @@ cso_draw_arrays(struct cso_context *cso, uint mode, uint start, uint count)
|
||||||
|
|
||||||
cso_draw_vbo(cso, &info);
|
cso_draw_vbo(cso, &info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cso_draw_arrays_instanced(struct cso_context *cso, uint mode,
|
||||||
|
uint start, uint count,
|
||||||
|
uint start_instance, uint instance_count)
|
||||||
|
{
|
||||||
|
struct pipe_draw_info info;
|
||||||
|
|
||||||
|
util_draw_init_info(&info);
|
||||||
|
|
||||||
|
info.mode = mode;
|
||||||
|
info.start = start;
|
||||||
|
info.count = count;
|
||||||
|
info.min_index = start;
|
||||||
|
info.max_index = start + count - 1;
|
||||||
|
info.start_instance = start_instance;
|
||||||
|
info.instance_count = instance_count;
|
||||||
|
|
||||||
|
cso_draw_vbo(cso, &info);
|
||||||
|
}
|
||||||
|
|
|
@ -228,6 +228,11 @@ void
|
||||||
cso_draw_vbo(struct cso_context *cso,
|
cso_draw_vbo(struct cso_context *cso,
|
||||||
const struct pipe_draw_info *info);
|
const struct pipe_draw_info *info);
|
||||||
|
|
||||||
|
void
|
||||||
|
cso_draw_arrays_instanced(struct cso_context *cso, uint mode,
|
||||||
|
uint start, uint count,
|
||||||
|
uint start_instance, uint instance_count);
|
||||||
|
|
||||||
/* helper drawing function */
|
/* helper drawing function */
|
||||||
void
|
void
|
||||||
cso_draw_arrays(struct cso_context *cso, uint mode, uint start, uint count);
|
cso_draw_arrays(struct cso_context *cso, uint mode, uint start, uint count);
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
#include "pipe/p_state.h"
|
#include "pipe/p_state.h"
|
||||||
#include "pipe/p_defines.h"
|
#include "pipe/p_defines.h"
|
||||||
#include "util/u_format.h"
|
#include "util/u_format.h"
|
||||||
|
#include "util/u_framebuffer.h"
|
||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
#include "util/u_simple_shaders.h"
|
#include "util/u_simple_shaders.h"
|
||||||
#include "util/u_draw_quad.h"
|
#include "util/u_draw_quad.h"
|
||||||
|
@ -129,6 +130,26 @@ set_vertex_shader(struct st_context *st)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_vertex_shader_layered(struct st_context *st)
|
||||||
|
{
|
||||||
|
struct pipe_context *pipe = st->pipe;
|
||||||
|
|
||||||
|
if (!pipe->screen->get_param(pipe->screen, PIPE_CAP_TGSI_INSTANCEID) ||
|
||||||
|
!pipe->screen->get_param(pipe->screen, PIPE_CAP_TGSI_VS_LAYER)) {
|
||||||
|
assert(!"Got layered clear, but the VS layer output is unsupported");
|
||||||
|
set_vertex_shader(st);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!st->clear.vs_layered) {
|
||||||
|
st->clear.vs_layered = util_make_layered_clear_vertex_shader(pipe);
|
||||||
|
}
|
||||||
|
|
||||||
|
cso_set_vertex_shader_handle(st->cso_context, st->clear.vs_layered);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw a screen-aligned quadrilateral.
|
* Draw a screen-aligned quadrilateral.
|
||||||
* Coords are clip coords with y=0=bottom.
|
* Coords are clip coords with y=0=bottom.
|
||||||
|
@ -136,15 +157,19 @@ set_vertex_shader(struct st_context *st)
|
||||||
static void
|
static void
|
||||||
draw_quad(struct st_context *st,
|
draw_quad(struct st_context *st,
|
||||||
float x0, float y0, float x1, float y1, GLfloat z,
|
float x0, float y0, float x1, float y1, GLfloat z,
|
||||||
|
unsigned num_instances,
|
||||||
const union pipe_color_union *color)
|
const union pipe_color_union *color)
|
||||||
{
|
{
|
||||||
struct pipe_context *pipe = st->pipe;
|
struct cso_context *cso = st->cso_context;
|
||||||
struct pipe_resource *vbuf = NULL;
|
struct pipe_vertex_buffer vb = {0};
|
||||||
GLuint i, offset;
|
GLuint i;
|
||||||
float (*vertices)[2][4]; /**< vertex pos + color */
|
float (*vertices)[2][4]; /**< vertex pos + color */
|
||||||
|
|
||||||
|
vb.stride = 8 * sizeof(float);
|
||||||
|
|
||||||
if (u_upload_alloc(st->uploader, 0, 4 * sizeof(vertices[0]),
|
if (u_upload_alloc(st->uploader, 0, 4 * sizeof(vertices[0]),
|
||||||
&offset, &vbuf, (void **) &vertices) != PIPE_OK) {
|
&vb.buffer_offset, &vb.buffer,
|
||||||
|
(void **) &vertices) != PIPE_OK) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,16 +199,10 @@ draw_quad(struct st_context *st,
|
||||||
u_upload_unmap(st->uploader);
|
u_upload_unmap(st->uploader);
|
||||||
|
|
||||||
/* draw */
|
/* draw */
|
||||||
util_draw_vertex_buffer(pipe,
|
cso_set_vertex_buffers(cso, cso_get_aux_vertex_buffer_slot(cso), 1, &vb);
|
||||||
st->cso_context,
|
cso_draw_arrays_instanced(cso, PIPE_PRIM_TRIANGLE_FAN, 0, 4,
|
||||||
vbuf,
|
0, num_instances);
|
||||||
cso_get_aux_vertex_buffer_slot(st->cso_context),
|
pipe_resource_reference(&vb.buffer, NULL);
|
||||||
offset,
|
|
||||||
PIPE_PRIM_TRIANGLE_FAN,
|
|
||||||
4, /* verts */
|
|
||||||
2); /* attribs/vert */
|
|
||||||
|
|
||||||
pipe_resource_reference(&vbuf, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -206,6 +225,8 @@ clear_with_quad(struct gl_context *ctx,
|
||||||
const GLfloat y0 = (GLfloat) ctx->DrawBuffer->_Ymin / fb_height * 2.0f - 1.0f;
|
const GLfloat y0 = (GLfloat) ctx->DrawBuffer->_Ymin / fb_height * 2.0f - 1.0f;
|
||||||
const GLfloat y1 = (GLfloat) ctx->DrawBuffer->_Ymax / fb_height * 2.0f - 1.0f;
|
const GLfloat y1 = (GLfloat) ctx->DrawBuffer->_Ymax / fb_height * 2.0f - 1.0f;
|
||||||
union pipe_color_union clearColor;
|
union pipe_color_union clearColor;
|
||||||
|
unsigned num_layers =
|
||||||
|
util_framebuffer_get_num_layers(&st->state.framebuffer);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
printf("%s %s%s%s %f,%f %f,%f\n", __FUNCTION__,
|
printf("%s %s%s%s %f,%f %f,%f\n", __FUNCTION__,
|
||||||
|
@ -305,9 +326,13 @@ clear_with_quad(struct gl_context *ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
set_fragment_shader(st);
|
set_fragment_shader(st);
|
||||||
set_vertex_shader(st);
|
|
||||||
cso_set_geometry_shader_handle(st->cso_context, NULL);
|
cso_set_geometry_shader_handle(st->cso_context, NULL);
|
||||||
|
|
||||||
|
if (num_layers > 1)
|
||||||
|
set_vertex_shader_layered(st);
|
||||||
|
else
|
||||||
|
set_vertex_shader(st);
|
||||||
|
|
||||||
if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
|
if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
|
||||||
struct gl_renderbuffer *rb = ctx->DrawBuffer->_ColorDrawBuffers[0];
|
struct gl_renderbuffer *rb = ctx->DrawBuffer->_ColorDrawBuffers[0];
|
||||||
GLboolean is_integer = _mesa_is_enum_format_integer(rb->InternalFormat);
|
GLboolean is_integer = _mesa_is_enum_format_integer(rb->InternalFormat);
|
||||||
|
@ -319,7 +344,8 @@ clear_with_quad(struct gl_context *ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draw quad matching scissor rect */
|
/* draw quad matching scissor rect */
|
||||||
draw_quad(st, x0, y0, x1, y1, (GLfloat) ctx->Depth.Clear, &clearColor);
|
draw_quad(st, x0, y0, x1, y1, (GLfloat) ctx->Depth.Clear, num_layers,
|
||||||
|
&clearColor);
|
||||||
|
|
||||||
/* Restore pipe state */
|
/* Restore pipe state */
|
||||||
cso_restore_blend(st->cso_context);
|
cso_restore_blend(st->cso_context);
|
||||||
|
|
|
@ -178,6 +178,7 @@ struct st_context
|
||||||
struct pipe_viewport_state viewport;
|
struct pipe_viewport_state viewport;
|
||||||
void *vs;
|
void *vs;
|
||||||
void *fs;
|
void *fs;
|
||||||
|
void *vs_layered;
|
||||||
} clear;
|
} clear;
|
||||||
|
|
||||||
/** used for anything using util_draw_vertex_buffer */
|
/** used for anything using util_draw_vertex_buffer */
|
||||||
|
|
Loading…
Reference in New Issue