On Fri, Jun 15, 2012 at 2:26 PM, Paul Berry <span dir="ltr"><<a href="mailto:stereotype441@gmail.com" target="_blank">stereotype441@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="HOEnZb"><div class="h5">On 8 June 2012 14:41,  <span dir="ltr"><<a href="mailto:anuj.phogat@gmail.com" target="_blank">anuj.phogat@gmail.com</a>></span> wrote:<br></div></div><div class="gmail_quote"><div>

<div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>From: Anuj Phogat <<a href="mailto:anuj.phogat@gmail.com" target="_blank">anuj.phogat@gmail.com</a>><br>
<br>
This test verifies if glBlitFramebuffer() throws expected GL errors with<br>
multisample framebuffers and no blitting occurs in case of error.<br>
<br>
V2: Test is rewritten to utilize the functionality defined in common.cpp<br>
    and to match the testing pattern of other blitting tests written by<br>
    Paul Berry. Command line options are provided to choose sample count<br>
    and color/depth/stencil buffers for testing.<br>
<br>
</div>V3: Modified the code inline with recent changes in common.cpp to setup the<br>
    FBO. Also made changes to avoid sRGB related failures on NVIDIA<br>
<div><br>
Signed-off-by: Anuj Phogat <<a href="mailto:anuj.phogat@gmail.com" target="_blank">anuj.phogat@gmail.com</a>><br>
---<br>
</div><div> tests/all.tests                                    |    7 +<br>
 .../ext_framebuffer_multisample/CMakeLists.gl.txt  |    1 +<br>
</div> .../non-matching-blit.cpp                          |  288 ++++++++++++++++++++<br>
 3 files changed, 296 insertions(+), 0 deletions(-)<br>
<div> create mode 100644 tests/spec/ext_framebuffer_multisample/non-matching-blit.cpp<br>
<br>
diff --git a/tests/all.tests b/tests/all.tests<br>
</div>index 129a923..463e927 100644<br>
<div>--- a/tests/all.tests<br>
+++ b/tests/all.tests<br>
@@ -1356,6 +1356,13 @@ for num_samples in (2, 4, 8, 16, 32):<br>
                         ext_framebuffer_multisample[test_name] = PlainExecTest(executable)<br>
<br>
 for num_samples in (2, 4, 8, 16, 32):<br>
+        for buffer_type in ('color', 'depth', 'stencil'):<br>
+                test_name = ' ' .join(['non-matching-blit', str(num_samples), buffer_type])<br>
+                executable = 'ext_framebuffer_multisample-{0} -auto'.format(<br>
+                        test_name)<br>
+                ext_framebuffer_multisample[test_name] = PlainExecTest(executable)<br>
+<br>
+for num_samples in (2, 4, 8, 16, 32):<br>
        test_name = ' ' .join(['line-smooth', str(num_samples)])<br>
        executable = 'ext_framebuffer_multisample-{0} -auto'.format(<br>
                test_name)<br>
diff --git a/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt b/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt<br>
</div>index 1660067..e18f410 100644<br>
--- a/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt<br>
+++ b/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt<br>
@@ -20,6 +20,7 @@ piglit_add_executable (ext_framebuffer_multisample-negative-copyteximage negativ<br>
<div> piglit_add_executable (ext_framebuffer_multisample-negative-max-samples negative-max-samples.c)<br>
 piglit_add_executable (ext_framebuffer_multisample-negative-mismatched-samples negative-mismatched-samples.c)<br>
 piglit_add_executable (ext_framebuffer_multisample-negative-readpixels negative-readpixels.c)<br>
+piglit_add_executable (ext_framebuffer_multisample-non-matching-blit common.cpp non-matching-blit.cpp)<br>
 piglit_add_executable (ext_framebuffer_multisample-point-smooth common.cpp point-smooth.cpp)<br>
 piglit_add_executable (ext_framebuffer_multisample-polygon-smooth common.cpp polygon-smooth.cpp)<br>
 piglit_add_executable (ext_framebuffer_multisample-renderbuffer-samples renderbuffer-samples.c)<br>
diff --git a/tests/spec/ext_framebuffer_multisample/non-matching-blit.cpp b/tests/spec/ext_framebuffer_multisample/non-matching-blit.cpp<br>
new file mode 100644<br>
</div>index 0000000..432c26f<br>
--- /dev/null<br>
+++ b/tests/spec/ext_framebuffer_multisample/non-matching-blit.cpp<br>
@@ -0,0 +1,288 @@<br>
<div><div>+/*<br>
+ * Copyright © 2012 Intel Corporation<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a<br>
+ * copy of this software and associated documentation files (the "Software"),<br>
+ * to deal in the Software without restriction, including without limitation<br>
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
+ * and/or sell copies of the Software, and to permit persons to whom the<br>
+ * Software is furnished to do so, subject to the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice (including the next<br>
+ * paragraph) shall be included in all copies or substantial portions of the<br>
+ * Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS<br>
+ * IN THE SOFTWARE.<br>
+ */<br>
+<br>
+/**<br>
+ * @file non-matching-blit.cpp<br>
+ *<br>
+ * This test verifies if glBlitFramebuffer() throws expected GL errors with<br>
+ * multisample framebuffers.<br>
+ *<br>
+ * We generate FBOs with specified sample count, draw a test pattern in to<br>
+ * them, do blitting operation and then compare test image with the reference<br>
+ * image.<br></div></div></blockquote></div></div><div><br>Wow, it looks like you put a lot of effort into this test, and I appreciate your thoroughness in wanting to verify that no blitting has occurred, so I'm sorry to say that I think we could achieve an equally effective test with a lot less work.  Here's what I have in mind:<br>



<br>First of all, I'm not convinced that it's necessary to check that no blitting occurred.  For one thing, we can tell by code inspection that Mesa does 
all of its error checking before attempting the blit.  So as long as we verify that Mesa reported the proper error (GL_INVALID_OPERATION) there's little danger that it went ahead and did the blit anyway.  Secondly, a properly written client app is not going to exercise the error checking paths very often (hopefully, almost never), so making sure that the implementation *doesn't* blit when there's an error is a lot less critical than making sure that it blits properly when there's no error.<br>



<br>I realize that may not convince you; after all, if we removed the code that verifies that no blitting has occurred, the test would be strictly weaker.  But on the other hand, it would be a lot shorter (and therefore easier to understand, so if it ever fails, it will be easier to find and fix the Mesa bug).<br>



<br>If it's really important to you to verify that no blit occurred, I'd recommend using solid colors as your test patterns, rather than the complex test patterns from common.cpp, so that the test does less work.  In addition to making the test simpler, this will reduce the risk of an unrelated bug elsewhere in the GL implementation causing the test to produce confusing results.  For example, one possibility would be to do the following:<br>




<br>
1. Clear src_fbo to red<br>
2. Clear dst_fbo to green<br>
3. Try to blit src_fbo to dst_fbo and verify that the appropriate error was generated.<br>
4. Blit dst_fbo to resolve_fbo.<br>
5. Verify that resolve_fbo is all green (and therefore, src_fbo wasn't copied to dst_fbo). <br>
<br>Also, I don't think it's necessary to blit the final comparison images to the screen; that's only useful when checking that MSAA rendering is correct (so that we can diagnose bugs if it isn't).  Since this test is trying to verify that *no* blitting occurs, being able to see an image if it does occur won't be a useful debugging aid.<br>



<br>Finally, I don't think it's necessary to run this test for every possible sample count and buffer type.  Eliminating these variations would let you remove command-line parsing from the test, as well as the complications of using a ManifestProgram.<br>



</div></div></blockquote><div><br></div><div>I think we can skip verifying that no blitting occurs after generating the error.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="gmail_quote"><div> </div><div class="im"><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div>
+ *<br>
+ * Tests following cases:<br></div></div></blockquote></div><div><br>I would recommend splitting these into three separate tests, each 
testing a single case.  That way if one of the cases fails we'll be able
 to tell directly from the Piglit output what went wrong.  Also, the 
"non-matching sample count" test needs to skip sometimes (see my comments on "test_blit_ms_ms_non_matching_samples" below), 
and we still want the other tests to run if it skips.<br> </div><div class="im"><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div>
+ * - Blit multisample-to-multisample with non-matching sample count<br>
+ * - Blit multisample-to-multisample with non-matching format<br>
+ * - Blit multisample-to-multisample non-matching buffer size<br></div></div></blockquote></div><div><br>Actually, the third item, blitting between multisample framebuffers of non-matching buffer sizes, is ok, provided that the source and destination rectangles of the blit are the same.  I would recommend splitting this third "non-matching buffer size" case out to its own test, and changing it accordingly.<br>

</div></div></blockquote><div>As suggested, I will split this test in to three individual test cases.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="gmail_quote"><div>

 </div><div><div class="h5"><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div>
+ *<br>
+ * No blitting should happen in all the above cases and the driver should<br>
+ * report GL_INVALID_OPERATION.<br>
+ *<br>
+ * Left half of default framebuffer draws test image.<br>
+ * Right half of default framebuffer draws reference image.<br>
+ *<br>
+ * Author: Anuj Phogat <<a href="mailto:anuj.phogat@gmail.com" target="_blank">anuj.phogat@gmail.com</a>><br>
+ */<br>
+<br>
+#include "common.h"<br>
+<br>
+int piglit_width = 512; int piglit_height = 256;<br>
+int piglit_window_mode =<br>
+       GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL;<br>
+<br>
+const int pattern_width = 256; const int pattern_height = 256;<br>
+int num_samples;<br>
+<br>
+Fbo src_fbo, dst_fbo, resolve_fbo;<br>
+TestPattern *test_pattern = NULL;<br>
+ManifestProgram *manifest_program = NULL;<br>
+GLbitfield buffer_to_test;<br>
+<br>
+static GLenum color_formats[] = {<br>
+       GL_RED,<br>
+       GL_RG,<br>
+       GL_RGB,<br>
+       GL_ALPHA};<br>
+<br>
</div></div><div>+void blit_fbo_to_fbo(Fbo *src, struct Fbo *dst, float scale)<br>
+{<br>
+       glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, src->handle);<br>
+       glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, dst->handle);<br>
+<br>
+       glBlitFramebufferEXT(0, 0,<br>
</div>+                            src->config.width * scale,<br>
+                            src->config.height * scale,<br>
+                            0, 0,<br>
+                            dst->config.width,<br>
+                            dst->config.height,<br>
<div>+                            buffer_to_test, GL_NEAREST);<br>
+}<br>
+<br>
+void blit_fbo_to_default(Fbo *src, int x_offset, int y_offset)<br>
+{<br>
+       glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, src->handle);<br>
+       glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);<br>
+<br>
+       /* In case of multisample FBO, glBlitFramebufferEXT invokes the<br>
+        * multisample to single sample resolution for each pixel */<br>
+       glBlitFramebufferEXT(0, 0,<br>
</div>+                            src->config.width,<br>
+                            src->config.height,<br>
<div>+                            x_offset, y_offset,<br>
+                            pattern_width + x_offset,<br>
+                            pattern_height + y_offset,<br>
+                            GL_COLOR_BUFFER_BIT, GL_NEAREST);<br>
+}<br>
+<br>
+static bool<br>
+test_blit_ms_ms(GLfloat scale)<br>
+{<br>
+       bool pass = true;<br>
+<br>
</div>+       /* Clear default framebuffer */<br>
+       glClear(GL_COLOR_BUFFER_BIT);<br>
<div>+<br>
+       float proj[4][4] = {<br>
+               { 1, 0, 0, 0 },<br>
+               { 0, 1, 0, 0 },<br>
+               { 0, 0, 1, 0 },<br>
+               { 0, 0, 0, 1 }<br>
+       };<br></div></blockquote></div></div><div><br>FYI, I recently did a refactor so that we don't need to duplicate these identity matrices all over the place.  You can now just pass TestPattern::no_projection to the draw() call.  Of course, if we replace the complex test patterns with solid colors this won't be relevant.<br>



 </div><div class="im"><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>
+<br>
+       /* Draw the test pattern in dst_fbo. */<br>
+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dst_fbo.handle);<br>
+       dst_fbo.set_viewport();<br>
</div>+       glClear(buffer_to_test);<br></blockquote></div><div><br>This call to glClear isn't technically necessary, since all of the draw() functions begin with a call to glClear().<br> </div><div><div class="h5">

<blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


+       test_pattern->draw(proj);<br>
+<br>
+       /* Blit dst_fbo first in to resolve_fbo and manifest in to color<br>
+        * image if required, followed by blitting to right half of default<br>
+        * framebuffer. This is used as a reference image.<br>
+        */<br>
<div>+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolve_fbo.handle);<br>
+       resolve_fbo.set_viewport();<br>
</div>+       glClear(buffer_to_test); <br></blockquote><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+       blit_fbo_to_fbo(&dst_fbo, &resolve_fbo, 1.0 /* scale */);<br>
<div>+<br>
+       if (manifest_program)<br>
+               manifest_program->run();<br>
+<br>
</div><div>+       blit_fbo_to_default(&resolve_fbo, pattern_width, 0);<br>
+<br>
</div><div>+       /* Clear the src_fbo to a default color/depth/stencil value */<br>
+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, src_fbo.handle);<br>
+       src_fbo.set_viewport();<br>
+       glClear(buffer_to_test);<br>
+<br>
+       /* Blit from src_fbo to dst_fbo. scale variable is used to change<br>
+        * the buffer size used for blitting.<br>
+        */<br>
+       blit_fbo_to_fbo(&src_fbo, &dst_fbo, scale);<br>
+<br>
+       pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;<br>
+<br>
</div>+       /* Resolve dst_fbo into resolve_fbo and manifest in to color image if<br>
+        * required. Then blit resolve_fbo to the left half of the window<br>
+        * system framebuffer.  This is the test image.<br>
+        */<br>
+       blit_fbo_to_fbo(&dst_fbo, &resolve_fbo, 1.0 /* scale */);<br>
<div>+<br>
+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolve_fbo.handle);<br>
+       resolve_fbo.set_viewport();<br>
</div><div>+       if (manifest_program)<br>
+               manifest_program->run();<br>
+<br>
</div>+       blit_fbo_to_default(&resolve_fbo, 0, 0);<br>
<div>+<br>
+       /* Check that the left and right halves of the screen match.<br>
+        * If they don't, that means blitting operation modified<br>
+        * dst_fbo.<br>
+        */<br>
+       glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);<br>
+       pass = piglit_probe_rect_halves_equal_rgba(0, 0, piglit_width,<br>
+                                                  piglit_height) && pass;<br>
+<br>
</div>+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);<br>
<div>+       return pass;<br>
+}<br>
+<br>
+<br>
+static bool<br>
+test_blit_ms_ms_non_matching_samples(void)<br>
+{<br>
</div>+       src_fbo.setup(FboConfig(num_samples / 2,<br>
+                     pattern_width,<br>
+                     pattern_height));<br>
+       return test_blit_ms_ms(1.0 /* scale */);<br>
<div>+}<br></div></blockquote></div></div><div><br>This isn't going to work for i965/Gen6, because it only supports 4x oversampling, so every multisampled framebuffer always has a matching sample count, no matter what sample count you requested.  A similar situation exists today for i965/Gen7 (although soon I hope to implement 8x oversampling for Gen7).<br>

</div></div></blockquote><div>Thanks for noticing this.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_quote"><div>

<br>Here's what I would recommend doing instead for the non-matching samples test:<br><br>1. Create a framebuffer requesting num_samples=1.  The implementation is supposed to round this up to the next available sample count, so this will give you the minimum supported sample count.<br>



2. Query the sample count of the framebuffer and call it N.  If N == GL_MAX_SAMPLES, then skip the test, because this means that the implementation only supports one possible sample count.<br>3. Create a second framebuffer requesting num_samples=N+1.  This guarantees that the second framebuffer will have a different sample count than the first framebuffer.<br>


4. Try to blit between the two framebuffers and verify that the proper error is generated.<br></div></div></blockquote><div><br></div><div>I will make the relevant changes to fix this problem in the test case.</div><div>

 </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_quote"><div></div><div><div class="h5"><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">



<div>
+<br>
+static bool<br>
+test_blit_ms_ms_non_matching_buffer_size(void)<br>
+{<br>
</div>+       return test_blit_ms_ms(0.5 /* scale */ );<br>
<div>+}<br>
+<br>
+static bool<br>
+test_blit_ms_ms_non_matching_formats(void)<br>
+{<br>
+       GLuint i, array_size;<br>
</div>+       bool result = true;<br>
+       FboConfig config_ms(num_samples, pattern_width, pattern_height);<br>
<div>+<br>
+       array_size = ARRAY_SIZE(color_formats);<br>
+<br>
</div><div>+       for(i = 0; i < array_size; i++) {<br>
</div>+               config_ms.color_internalformat = color_formats[i];<br>
+               src_fbo.setup(config_ms);<br>
+               result = test_blit_ms_ms(1.0 /* scale */ ) && result;<br>
+       }<br>
+       return result;<br>
<div>+}<br>
+<br>
+enum piglit_result<br>
+piglit_display()<br>
+{<br>
+       bool pass = true, nm_samples = true, nm_size = true, nm_formats = true;<br>
+<br>
</div><div>+       /* Blit multisample-to-multisample with non-matching sample count */<br>
+       nm_samples = test_blit_ms_ms_non_matching_samples();<br>
+       if(!nm_samples && !piglit_automatic)<br>
+               printf("test_blit_ms_ms_non_matching_samples failed\n");<br>
+<br>
</div><div>+       /* Blit multisample-to-multisample with non-matching buffer size */<br>
+       nm_size = test_blit_ms_ms_non_matching_buffer_size();<br>
+       if(!nm_size && !piglit_automatic)<br>
+               printf("test_blit_ms_ms_non_matching_buffer_size failed\n");<br>
+<br>
</div>+       if (buffer_to_test == GL_COLOR_BUFFER_BIT) {<br>
<div>+               /* Blit multisample-to-multisample with non-matching format */<br>
+               nm_formats = test_blit_ms_ms_non_matching_formats();<br>
+               if(!nm_formats && !piglit_automatic)<br>
+                       printf("test_blit_ms_ms_non_matching_formats failed\n");<br>
+       }<br>
+<br>
</div>+       pass = piglit_check_gl_error(GL_NO_ERROR) && pass;<br>
<div>+<br>
+       if (!piglit_automatic)<br>
+               piglit_present_results();<br>
+<br>
</div>+       pass =  pass && nm_samples && nm_size && nm_formats;<br>
<div><div>+       return (pass ? PIGLIT_PASS : PIGLIT_FAIL);<br>
+}<br>
+<br>
+void<br>
+print_usage_and_exit(char *prog_name)<br>
+{<br>
+       printf("Usage: %s <num_samples> <buffer_type>\n"<br>
+              "  where <buffer_type> is one of:\n"<br>
+              "    color\n"<br>
+              "    stencil\n"<br>
+              "    depth\n",<br>
+              prog_name);<br>
+       piglit_report_result(PIGLIT_FAIL);<br>
+}<br>
+<br>
+void<br>
+piglit_init(int argc, char **argv)<br>
+{<br>
+       if (argc < 3)<br>
+               print_usage_and_exit(argv[0]);<br>
+       {<br>
+               char *endptr = NULL;<br>
+               num_samples = strtol(argv[1], &endptr, 0);<br>
+               if (endptr != argv[1] + strlen(argv[1]))<br>
+                       print_usage_and_exit(argv[0]);<br>
+       }<br>
+<br>
+       piglit_require_gl_version(30);<br>
+<br>
+       /* Skip the test if num_samples > GL_MAX_SAMPLES */<br>
+       GLint max_samples;<br>
+       glGetIntegerv(GL_MAX_SAMPLES, &max_samples);<br>
+       if (num_samples > max_samples)<br>
+               piglit_report_result(PIGLIT_SKIP);<br>
+<br>
+       if (strcmp(argv[2], "color") == 0) {<br>
+               test_pattern = new Triangles();<br>
+               buffer_to_test = GL_COLOR_BUFFER_BIT;<br>
+       } else if (strcmp(argv[2], "depth") == 0) {<br>
+               test_pattern = new DepthSunburst();<br>
+               manifest_program = new ManifestDepth();<br>
+               buffer_to_test = GL_DEPTH_BUFFER_BIT;<br>
+       } else if (strcmp(argv[2], "stencil") == 0) {<br>
+               test_pattern = new StencilSunburst();<br>
+               manifest_program = new ManifestStencil();<br>
+               buffer_to_test = GL_STENCIL_BUFFER_BIT;<br>
+       } else {<br>
+               print_usage_and_exit(argv[0]);<br>
+       }<br>
+<br>
+       test_pattern->compile();<br>
+       if (manifest_program)<br>
+               manifest_program->compile();<br>
+<br>
</div></div>+       dst_fbo.setup(FboConfig(num_samples, pattern_width, pattern_height));<br>
+       resolve_fbo.setup(FboConfig(0, pattern_width, pattern_height));<br>
+}<br>
<span><font color="#888888">--<br>
1.7.7.6<br>
<br>
</font></span></blockquote></div></div></div><br>
</blockquote></div><br>