[virglrenderer-devel] [PATCH 1/2] vrend: Support caps struct v2
Dave Airlie
airlied at gmail.com
Tue Feb 13 01:13:40 UTC 2018
From: Stéphane Marchesin <marcheu at chromium.org>
This new struct allows us to report:
- accurate max point size and line width
- accurate texel and texture gather offsets
- vertex and geometry shader limits
- one future tessellation limit
Signed-off-by: Stéphane Marchesin <marcheu at chromium.org>
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/virgl_hw.h | 26 ++++++++++++++++++++++++++
src/vrend_renderer.c | 39 +++++++++++++++++++++++++++++++++++++--
2 files changed, 63 insertions(+), 2 deletions(-)
diff --git a/src/virgl_hw.h b/src/virgl_hw.h
index 8c6f523..6468e27 100644
--- a/src/virgl_hw.h
+++ b/src/virgl_hw.h
@@ -230,6 +230,9 @@ struct virgl_caps_bool_set1 {
unsigned texture_query_lod:1;
unsigned has_fp64:1;
unsigned has_tessellation_shaders:1;
+ unsigned has_indirect_draw:1;
+ unsigned has_sample_shading:1;
+ unsigned has_cull:1;
};
/* endless expansion capabilites - current gallium has 252 formats */
@@ -257,9 +260,32 @@ struct virgl_caps_v1 {
uint32_t max_texture_gather_components;
};
+struct virgl_caps_v2 {
+ struct virgl_caps_v1 v1;
+ float min_aliased_point_size;
+ float max_aliased_point_size;
+ float min_smooth_point_size;
+ float max_smooth_point_size;
+ float min_aliased_line_width;
+ float max_aliased_line_width;
+ float min_smooth_line_width;
+ float max_smooth_line_width;
+ float max_texture_lod_bias;
+ uint32_t max_geom_output_vertices;
+ uint32_t max_geom_total_output_components;
+ uint32_t max_vertex_outputs;
+ uint32_t max_vertex_attribs;
+ uint32_t max_shader_patch_varyings;
+ int32_t min_texel_offset;
+ int32_t max_texel_offset;
+ int32_t min_texture_gather_offset;
+ int32_t max_texture_gather_offset;
+};
+
union virgl_caps {
uint32_t max_version;
struct virgl_caps_v1 v1;
+ struct virgl_caps_v2 v2;
};
enum virgl_errors {
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index ec37fc8..1a7d3c8 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -6208,6 +6208,7 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
{
int i;
GLint max;
+ GLfloat range[2];
int gl_ver = epoxy_gl_version();
if (!caps)
@@ -6220,7 +6221,7 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
return;
}
- caps->max_version = 1;
+ caps->max_version = 2;
caps->v1.bset.occlusion_query = 1;
if (gl_ver >= 30) {
@@ -6381,6 +6382,40 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
}
}
}
+
+ 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_SMOOTH_POINT_SIZE_RANGE, range);
+ caps->v2.min_smooth_point_size = range[0];
+ caps->v2.max_smooth_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_SMOOTH_LINE_WIDTH_RANGE, range);
+ caps->v2.min_smooth_line_width = range[0];
+ caps->v2.max_smooth_line_width = range[1];
+
+ glGetFloatv(GL_MAX_TEXTURE_LOD_BIAS, &caps->v2.max_texture_lod_bias);
+ glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &caps->v2.max_vertex_attribs);
+ glGetIntegerv(GL_MAX_VERTEX_OUTPUT_COMPONENTS, &max);
+ caps->v2.max_vertex_outputs = max / 4;
+
+ if (gl_ver >= 32) {
+ glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &caps->v2.max_geom_output_vertices);
+ glGetIntegerv(GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS, &caps->v2.max_geom_total_output_components);
+ }
+ caps->v2.max_shader_patch_varyings = 0; // until we do tess.
+
+ if (epoxy_has_gl_extension("GL_ARB_texture_gather")) {
+ glGetIntegerv(GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET, &caps->v2.min_texture_gather_offset);
+ glGetIntegerv(GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET, &caps->v2.max_texture_gather_offset);
+ }
+ glGetIntegerv(GL_MIN_PROGRAM_TEXEL_OFFSET, &caps->v2.min_texel_offset);
+ glGetIntegerv(GL_MAX_PROGRAM_TEXEL_OFFSET, &caps->v2.max_texel_offset);
}
GLint64 vrend_renderer_get_timestamp(void)
@@ -6552,7 +6587,7 @@ void vrend_renderer_get_cap_set(uint32_t cap_set, uint32_t *max_ver,
return;
}
- *max_ver = 1;
+ *max_ver = 2;
*max_size = sizeof(union virgl_caps);
}
--
2.14.3
More information about the virglrenderer-devel
mailing list