mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
mesa/st: avoid u_vbuf for GLES
64b VBO types are not required for GLES. So avoid u_vbuf if that was otherwise the only reason it was used. Signed-off-by: Rob Clark <robdclark@chromium.org> Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com> Reviewed-by: Eric Anholt <eric@anholt.net> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4619>
This commit is contained in:
parent
7e1b57a6d9
commit
b88778e2de
5 changed files with 25 additions and 5 deletions
|
|
@ -291,8 +291,9 @@ static void cso_init_vbuf(struct cso_context *cso, unsigned flags)
|
|||
{
|
||||
struct u_vbuf_caps caps;
|
||||
bool uses_user_vertex_buffers = !(flags & CSO_NO_USER_VERTEX_BUFFERS);
|
||||
bool needs64b = !(flags & CSO_NO_64B_VERTEX_BUFFERS);
|
||||
|
||||
u_vbuf_get_caps(cso->pipe->screen, &caps);
|
||||
u_vbuf_get_caps(cso->pipe->screen, &caps, needs64b);
|
||||
|
||||
/* Enable u_vbuf if needed. */
|
||||
if (caps.fallback_always ||
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ struct cso_context;
|
|||
struct u_vbuf;
|
||||
|
||||
#define CSO_NO_USER_VERTEX_BUFFERS (1 << 0)
|
||||
#define CSO_NO_64B_VERTEX_BUFFERS (1 << 1)
|
||||
|
||||
struct cso_context *cso_create_context(struct pipe_context *pipe,
|
||||
unsigned flags);
|
||||
|
|
|
|||
|
|
@ -256,7 +256,8 @@ static const struct {
|
|||
{ PIPE_FORMAT_R8G8B8A8_SSCALED, PIPE_FORMAT_R32G32B32A32_FLOAT },
|
||||
};
|
||||
|
||||
void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps)
|
||||
void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
|
||||
bool needs64b)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
|
|
@ -272,6 +273,10 @@ void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps)
|
|||
|
||||
for (i = 0; i < ARRAY_SIZE(vbuf_format_fallbacks); i++) {
|
||||
enum pipe_format format = vbuf_format_fallbacks[i].from;
|
||||
unsigned comp_bits = util_format_get_component_bits(format, 0, 0);
|
||||
|
||||
if ((comp_bits > 32) && !needs64b)
|
||||
continue;
|
||||
|
||||
if (!screen->is_format_supported(screen, format, PIPE_BUFFER, 0, 0,
|
||||
PIPE_BIND_VERTEX_BUFFER)) {
|
||||
|
|
|
|||
|
|
@ -62,7 +62,8 @@ struct u_vbuf_caps {
|
|||
};
|
||||
|
||||
|
||||
void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps);
|
||||
void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
|
||||
bool needs64b);
|
||||
|
||||
struct u_vbuf *
|
||||
u_vbuf_create(struct pipe_context *pipe, struct u_vbuf_caps *caps);
|
||||
|
|
|
|||
|
|
@ -592,8 +592,20 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
|
|||
* profile, so that u_vbuf is bypassed completely if there is nothing else
|
||||
* to do.
|
||||
*/
|
||||
unsigned cso_flags =
|
||||
ctx->API == API_OPENGL_CORE ? CSO_NO_USER_VERTEX_BUFFERS : 0;
|
||||
unsigned cso_flags;
|
||||
switch (ctx->API) {
|
||||
case API_OPENGL_CORE:
|
||||
cso_flags = CSO_NO_USER_VERTEX_BUFFERS;
|
||||
break;
|
||||
case API_OPENGLES:
|
||||
case API_OPENGLES2:
|
||||
cso_flags = CSO_NO_64B_VERTEX_BUFFERS;
|
||||
break;
|
||||
default:
|
||||
cso_flags = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
st->cso_context = cso_create_context(pipe, cso_flags);
|
||||
|
||||
st_init_atoms(st);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue