vrend,caps: move all caps for version 1 into one function (v4)

Also rename the function caps_common to indicated that only v1 caps are
set here.
(This is part one of the cleanup suggested by Gurchetan)

v4: rebase after image and compute shader patches landed

Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org> (v3)
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
macos/master
Gert Wollny 6 years ago committed by Jakob Bornecrantz
parent 20592e390c
commit be46fcef3e
  1. 214
      src/vrend_renderer.c

@ -7816,7 +7816,7 @@ static void vrend_fill_caps_glsl_version(int gl_ver, int gles_ver,
* Does all of the common caps setting,
* if it dedects a early out returns true.
*/
static void vrend_renderer_fill_caps_common(union virgl_caps *caps)
static void vrend_renderer_fill_caps_v1(int gl_ver, int gles_ver, union virgl_caps *caps)
{
int i;
GLint max;
@ -7833,62 +7833,7 @@ static void vrend_renderer_fill_caps_common(union virgl_caps *caps)
(1 << PIPE_PRIM_TRIANGLES) | (1 << PIPE_PRIM_TRIANGLE_STRIP) |
(1 << PIPE_PRIM_TRIANGLE_FAN);
/* Common limits for all backends. */
caps->v1.max_render_targets = vrend_state.max_draw_buffers;
glGetIntegerv(GL_MAX_SAMPLES, &max);
caps->v1.max_samples = max;
/* All of the formats are common. */
for (i = 0; i < VIRGL_FORMAT_MAX; i++) {
uint32_t offset = i / 32;
uint32_t index = i % 32;
if (tex_conv_table[i].internalformat != 0) {
if (vrend_format_can_sample(i)) {
caps->v1.sampler.bitmask[offset] |= (1 << index);
if (vrend_format_can_render(i))
caps->v1.render.bitmask[offset] |= (1 << index);
}
}
}
/* These are filled in by the init code, so are common. */
if (has_feature(feat_nv_prim_restart) ||
has_feature(feat_gl_prim_restart)) {
caps->v1.bset.primitive_restart = 1;
}
}
static void vrend_renderer_fill_caps_v2_common(union virgl_caps *caps)
{
GLint max;
GLfloat range[2];
glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, range);
caps->v2.min_aliased_point_size = range[0];
caps->v2.max_aliased_point_size = range[1];
glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, range);
caps->v2.min_aliased_line_width = range[0];
caps->v2.max_aliased_line_width = range[1];
glGetFloatv(GL_MAX_TEXTURE_LOD_BIAS, &caps->v2.max_texture_lod_bias);
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, (GLint*)&caps->v2.max_vertex_attribs);
glGetIntegerv(GL_MAX_VERTEX_OUTPUT_COMPONENTS, &max);
caps->v2.max_vertex_outputs = max / 4;
glGetIntegerv(GL_MIN_PROGRAM_TEXEL_OFFSET, &caps->v2.min_texel_offset);
glGetIntegerv(GL_MAX_PROGRAM_TEXEL_OFFSET, &caps->v2.max_texel_offset);
glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, (GLint*)&caps->v2.uniform_buffer_offset_alignment);
}
static void vrend_renderer_fill_caps_gl(bool fill_capset2, union virgl_caps *caps)
{
GLfloat range[2];
if (!vrend_state.use_core_profile) {
if (gl_ver > 0 && !vrend_state.use_core_profile) {
caps->v1.bset.poly_stipple = 1;
caps->v1.bset.color_clamping = 1;
caps->v1.prim_mask |= (1 << PIPE_PRIM_QUADS) |
@ -7896,56 +7841,6 @@ static void vrend_renderer_fill_caps_gl(bool fill_capset2, union virgl_caps *cap
(1 << PIPE_PRIM_POLYGON);
}
if (!fill_capset2)
return;
glGetFloatv(GL_SMOOTH_POINT_SIZE_RANGE, range);
caps->v2.min_smooth_point_size = range[0];
caps->v2.max_smooth_point_size = range[1];
glGetFloatv(GL_SMOOTH_LINE_WIDTH_RANGE, range);
caps->v2.min_smooth_line_width = range[0];
caps->v2.max_smooth_line_width = range[1];
}
void vrend_renderer_fill_caps(uint32_t set, UNUSED uint32_t version,
union virgl_caps *caps)
{
GLint max;
int gl_ver, gles_ver;
bool fill_capset2 = false;
if (!caps)
return;
if (set > 2) {
caps->max_version = 0;
return;
}
if (set == 1) {
memset(caps, 0, sizeof(struct virgl_caps_v1));
caps->max_version = 1;
} else if (set == 2) {
memset(caps, 0, sizeof(*caps));
caps->max_version = 2;
fill_capset2 = true;
}
if (vrend_state.use_gles) {
gles_ver = epoxy_gl_version();
gl_ver = 0;
} else {
gles_ver = 0;
gl_ver = epoxy_gl_version();
}
vrend_fill_caps_glsl_version(gl_ver, gles_ver, caps);
vrend_renderer_fill_caps_common(caps);
if (!vrend_state.use_gles)
vrend_renderer_fill_caps_gl(fill_capset2, caps);
if (caps->v1.glsl_level >= 150) {
caps->v1.prim_mask |= (1 << PIPE_PRIM_LINES_ADJACENCY) |
(1 << PIPE_PRIM_LINE_STRIP_ADJACENCY) |
@ -8099,6 +7994,111 @@ void vrend_renderer_fill_caps(uint32_t set, UNUSED uint32_t version,
caps->v1.max_viewports = 1;
}
/* Common limits for all backends. */
caps->v1.max_render_targets = vrend_state.max_draw_buffers;
glGetIntegerv(GL_MAX_SAMPLES, &max);
caps->v1.max_samples = max;
/* All of the formats are common. */
for (i = 0; i < VIRGL_FORMAT_MAX; i++) {
uint32_t offset = i / 32;
uint32_t index = i % 32;
if (tex_conv_table[i].internalformat != 0) {
if (vrend_format_can_sample(i)) {
caps->v1.sampler.bitmask[offset] |= (1 << index);
if (vrend_format_can_render(i))
caps->v1.render.bitmask[offset] |= (1 << index);
}
}
}
/* These are filled in by the init code, so are common. */
if (has_feature(feat_nv_prim_restart) ||
has_feature(feat_gl_prim_restart)) {
caps->v1.bset.primitive_restart = 1;
}
}
static void vrend_renderer_fill_caps_v2_common(union virgl_caps *caps)
{
GLint max;
GLfloat range[2];
glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, range);
caps->v2.min_aliased_point_size = range[0];
caps->v2.max_aliased_point_size = range[1];
glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, range);
caps->v2.min_aliased_line_width = range[0];
caps->v2.max_aliased_line_width = range[1];
glGetFloatv(GL_MAX_TEXTURE_LOD_BIAS, &caps->v2.max_texture_lod_bias);
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, (GLint*)&caps->v2.max_vertex_attribs);
glGetIntegerv(GL_MAX_VERTEX_OUTPUT_COMPONENTS, &max);
caps->v2.max_vertex_outputs = max / 4;
glGetIntegerv(GL_MIN_PROGRAM_TEXEL_OFFSET, &caps->v2.min_texel_offset);
glGetIntegerv(GL_MAX_PROGRAM_TEXEL_OFFSET, &caps->v2.max_texel_offset);
glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, (GLint*)&caps->v2.uniform_buffer_offset_alignment);
}
static void vrend_renderer_fill_caps_gl(bool fill_capset2, union virgl_caps *caps)
{
GLfloat range[2];
if (!fill_capset2)
return;
glGetFloatv(GL_SMOOTH_POINT_SIZE_RANGE, range);
caps->v2.min_smooth_point_size = range[0];
caps->v2.max_smooth_point_size = range[1];
glGetFloatv(GL_SMOOTH_LINE_WIDTH_RANGE, range);
caps->v2.min_smooth_line_width = range[0];
caps->v2.max_smooth_line_width = range[1];
}
void vrend_renderer_fill_caps(uint32_t set, UNUSED uint32_t version,
union virgl_caps *caps)
{
GLint max;
int gl_ver, gles_ver;
bool fill_capset2 = false;
if (!caps)
return;
if (set > 2) {
caps->max_version = 0;
return;
}
if (set == 1) {
memset(caps, 0, sizeof(struct virgl_caps_v1));
caps->max_version = 1;
} else if (set == 2) {
memset(caps, 0, sizeof(*caps));
caps->max_version = 2;
fill_capset2 = true;
}
if (vrend_state.use_gles) {
gles_ver = epoxy_gl_version();
gl_ver = 0;
} else {
gles_ver = 0;
gl_ver = epoxy_gl_version();
}
vrend_fill_caps_glsl_version(gl_ver, gles_ver, caps);
vrend_renderer_fill_caps_v1(gl_ver, gles_ver, caps);
if (!vrend_state.use_gles)
vrend_renderer_fill_caps_gl(fill_capset2, caps);
if (!fill_capset2)
return;

Loading…
Cancel
Save