diff --git a/docs/features.txt b/docs/features.txt index cde9bb7fe152c9b36fa6a10f0be0a4227b3ac909..8a7cec4bc147b2ae142d89b7a03b6eed6571e7df 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -86,7 +86,7 @@ GL 3.2, GLSL 1.50 --- all DONE: i965, nv50, nvc0, r600, radeonsi, llvmpipe, soft Core/compatibility profiles DONE Geometry shaders DONE () - GL_ARB_vertex_array_bgra (BGRA vertex order) DONE (freedreno, panfrost) + GL_ARB_vertex_array_bgra (BGRA vertex order) DONE (freedreno, v3d, panfrost) GL_ARB_draw_elements_base_vertex (Base vertex offset) DONE (freedreno, v3d, panfrost) GL_ARB_fragment_coord_conventions (Frag shader coord) DONE (freedreno, v3d, panfrost) GL_ARB_provoking_vertex (Provoking vertex) DONE (freedreno, v3d, panfrost) diff --git a/src/gallium/drivers/v3d/v3d_program.c b/src/gallium/drivers/v3d/v3d_program.c index 3ea9d953abc2973b7f61090c7e485a631f36c23e..3132eb5e473aaffa48a3e7ba66261b667ddd2002 100644 --- a/src/gallium/drivers/v3d/v3d_program.c +++ b/src/gallium/drivers/v3d/v3d_program.c @@ -762,6 +762,29 @@ v3d_update_compiled_vs(struct v3d_context *v3d, uint8_t prim_mode) (prim_mode == PIPE_PRIM_POINTS && v3d->rasterizer->base.point_size_per_vertex); + nir_shader *s = v3d->prog.bind_vs->base.ir.nir; + uint64_t inputs_read = s->info.inputs_read; + assert(util_bitcount(inputs_read) <= v3d->vtx->num_elements); + + while (inputs_read) { + int location = u_bit_scan64(&inputs_read); + nir_variable *var = + nir_find_variable_with_location(s, nir_var_shader_in, location); + assert (var != NULL); + int driver_location = var->data.driver_location; + switch (v3d->vtx->pipe[driver_location].src_format) { + case PIPE_FORMAT_B8G8R8A8_UNORM: + case PIPE_FORMAT_B10G10R10A2_UNORM: + case PIPE_FORMAT_B10G10R10A2_SNORM: + case PIPE_FORMAT_B10G10R10A2_USCALED: + case PIPE_FORMAT_B10G10R10A2_SSCALED: + key->va_swap_rb_mask |= 1 << location; + break; + default: + break; + } + } + struct v3d_compiled_shader *vs = v3d_get_compiled_shader(v3d, &key->base, sizeof(*key)); if (vs != v3d->prog.vs) { diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c index 0c5327c63bc00331f2446c5f55b48f1c0fde8bdf..1b9d76b8956db9c96eb1a6351201f820649648f1 100644 --- a/src/gallium/drivers/v3d/v3d_screen.c +++ b/src/gallium/drivers/v3d/v3d_screen.c @@ -560,6 +560,7 @@ v3d_screen_is_format_supported(struct pipe_screen *pscreen, case PIPE_FORMAT_R16G16B16_SSCALED: case PIPE_FORMAT_R16G16_SSCALED: case PIPE_FORMAT_R16_SSCALED: + case PIPE_FORMAT_B8G8R8A8_UNORM: case PIPE_FORMAT_R8G8B8A8_UNORM: case PIPE_FORMAT_R8G8B8_UNORM: case PIPE_FORMAT_R8G8_UNORM: