[virglrenderer-devel] [PATCH 2/2] formats: reorder sample count reading and emultate it for low sample counts
Gert Wollny
gert.wollny at collabora.com
Fri Aug 3 19:37:56 UTC 2018
On GLES low MSAA textures with low sample counts like 1 and 2 are not
supported as render targets, therefore, copy the sample positions from the
lowest number of samples.
Remove the debug output too.
Fixes on GLES host:
dEQP-GLES31.functional.texture.multisample.samples_1.sample_position
dEQP-GLES31.functional.texture.multisample.samples_2.sample_position
Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
---
src/vrend_formats.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/src/vrend_formats.c b/src/vrend_formats.c
index b9f85a0..18e2223 100644
--- a/src/vrend_formats.c
+++ b/src/vrend_formats.c
@@ -473,35 +473,47 @@ unsigned vrend_renderer_query_multisample_caps(unsigned max_samples, struct virg
uint max_samples_confirmed = 1;
uint test_num_samples[4] = {2,4,8,16};
int out_buf_offsets[4] = {0,1,2,4};
+ int lowest_working_ms_count_idx = -1;
glGenFramebuffers( 1, &fbo );
memset(caps->sample_locations, 0, 8 * sizeof(uint32_t));
- for (int i = 0; i < 4 && test_num_samples[i] <= max_samples; ++i) {
+ for (int i = 3; i >= 0; i--) {
+ if (test_num_samples[i] > max_samples)
+ continue;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
- glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, test_num_samples[i], GL_RGBA32F, 16, 16, GL_TRUE);
+ glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, test_num_samples[i], GL_RGBA32F, 64, 64, GL_TRUE);
status = glGetError();
if (status == GL_NO_ERROR) {
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex, 0);
status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status == GL_FRAMEBUFFER_COMPLETE) {
- max_samples_confirmed = test_num_samples[i];
+ if (max_samples_confirmed < test_num_samples[i])
+ max_samples_confirmed = test_num_samples[i];
for (uint k = 0; k < test_num_samples[i]; ++k) {
float msp[2];
uint32_t compressed;
glGetMultisamplefv(GL_SAMPLE_POSITION, k, msp);
- debug_printf("VIRGL: sample postion [%2d/%2d] = (%f, %f)\n",
- k, test_num_samples[i], msp[0], msp[1]);
compressed = ((unsigned)(floor(msp[0] * 16.0f)) & 0xf) << 4;
compressed |= ((unsigned)(floor(msp[1] * 16.0f)) & 0xf);
caps->sample_locations[out_buf_offsets[i] + (k >> 2)] |= compressed << (8 * (k & 3));
}
+ lowest_working_ms_count_idx = i;
+ } else {
+ /* If a framebuffer doesn't support low sample counts,
+ * use the sample position from the last working larger count. */
+ if (lowest_working_ms_count_idx > 0) {
+ for (uint k = 0; k < test_num_samples[i]; ++k) {
+ caps->sample_locations[out_buf_offsets[i] + (k >> 2)] =
+ caps->sample_locations[out_buf_offsets[lowest_working_ms_count_idx] + (k >> 2)];
+ }
+ }
}
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDeleteTextures(1, &tex);
}
glDeleteFramebuffers(1, &fbo);
--
2.17.1
More information about the virglrenderer-devel
mailing list