On 09/06/2012 05:13 PM, Vadim Girlin wrote:
On Thu, 2012-09-06 at 16:56 -0600, Brian Paul wrote:
On 09/06/2012 04:42 PM, Vadim Girlin wrote:
On Thu, 2012-09-06 at 08:01 -0600, Brian Paul wrote:
On 09/05/2012 06:26 PM, Vadim Girlin wrote:
On Tue, 2012-09-04 at 17:05 -0600, Brian Paul wrote:
---
    tests/all.tests                          |    1 +
    tests/texturing/CMakeLists.gl.txt        |    1 +
    tests/texturing/max-texture-size-level.c |   87 
++++++++++++++++++++++++++++++
    3 files changed, 89 insertions(+), 0 deletions(-)
    create mode 100644 tests/texturing/max-texture-size-level.c

diff --git a/tests/all.tests b/tests/all.tests
index 5b1c1cc..154e1e5 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -734,6 +734,7 @@ add_plain_test(texturing, 'lodclamp-between')
    add_plain_test(texturing, 'lodclamp-between-max')
    add_plain_test(texturing, 'mipmap-setup')
    add_plain_test(texturing, 'max-texture-size')
+add_concurrent_test(texturing, 'max-texture-size-level')
    add_concurrent_test(texturing, 'proxy-texture')
    add_plain_test(texturing, 'rg-draw-pixels')
    add_plain_test(texturing, 'rg-teximage-01')
diff --git a/tests/texturing/CMakeLists.gl.txt 
b/tests/texturing/CMakeLists.gl.txt
index 4fa0f7f..c439273 100644
--- a/tests/texturing/CMakeLists.gl.txt
+++ b/tests/texturing/CMakeLists.gl.txt
@@ -45,6 +45,7 @@ piglit_add_executable (lodclamp lodclamp.c)
    piglit_add_executable (lodclamp-between lodclamp-between.c)
    piglit_add_executable (lodclamp-between-max lodclamp-between-max.c)
    piglit_add_executable (max-texture-size max-texture-size.c)
+piglit_add_executable (max-texture-size-level max-texture-size-level.c)
    piglit_add_executable (mipmap-setup mipmap-setup.c)
    piglit_add_executable (proxy-texture proxy-texture.c)
    piglit_add_executable (rg-draw-pixels rg-draw-pixels.c)
diff --git a/tests/texturing/max-texture-size-level.c 
b/tests/texturing/max-texture-size-level.c
new file mode 100644
index 0000000..390e862
--- /dev/null
+++ b/tests/texturing/max-texture-size-level.c
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2012 VMware, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+/**
+ * Test glTexImage with an image too large for the given mipmap level.
+ *
+ * Page 157 of the OpenGL 2.1 spec says:
+ *
+ * "In a similar fashion, the maximum allowable width of a one- or
+ * two- dimensional texture image, and the maximum allowable height of a
+ * two- dimensional texture image, must be at least 2k−lod + 2bt for
+ * image arrays of level 0 through k, where k is the log base 2 of MAX
+ * TEXTURE SIZE. The maximum allowable width and height of a cube map
+ * texture must be the same, and must be at least 2k−lod + 2bt for image
+ * arrays level 0 through k, where k is the log base 2 of MAX CUBE MAP
+ * TEXTURE SIZE."
+ */
+
+#include "piglit-util-gl-common.h"
+
+PIGLIT_GL_TEST_MAIN(100, 100, GLUT_RGBA | GLUT_DOUBLE)
+
+enum piglit_result
+piglit_display(void)
+{
+       /* no op */
+       return PIGLIT_PASS;
+}
+
+
+void
+piglit_init(int argc, char **argv)
+{
+       GLint maxSize;
+       GLuint tex;
+       bool pass;
+
+       glGetIntegerv(GL_MAX_TEXTURE_SIZE,&maxSize);
+       printf("GL_MAX_TEXTURE_SIZE = %d\n", maxSize);
+
+       glGenTextures(1,&tex);
+       glBindTexture(GL_TEXTURE_2D, tex);
+
+       /* The max texture size should be OK for mipmap level zero. */
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+                    maxSize, maxSize, 0,
+                    GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+       pass = piglit_check_gl_error(GL_NO_ERROR);

I think we can also expect OUT_OF_MEMORY here, is it correct?

It's unlikely.

FWIW, GL_OUT_OF_MEMORY can theoretically be generated by almost any GL
call.

-Brian

MAX_TEXTURE_SIZE is 16384 for my radeon 5750, so this test is trying to
create the texture consuming 16384 x 16384 x 4bytes + mipmap levels =
1.3GB. There is 0.5GB of onboard VRAM. I guess the probability of
OUT_OF_MEMORY in my case is close to 100%.

I don't think that the driver should return lower value for
MAX_TEXTURE_SIZE - it's possible to create 16384x1 texture, or 1x16384,
or even 16384x16384 in some other format. As far as I understand it,
MAX_TEXTURE_SIZE doesn't give any guarantees about possibility of using
MAX_TEXTURE_SIZE x MAX_TEXTURE_SIZE texture in any format, it just tells
that sizes greater than MAX_TEXTURE_SIZE aren't allowed.

Here is a fragment of FAQ from opengl.org:
http://www.opengl.org/archives/resources/faq/technical/texture.htm#text0120

You can obtain an estimate of the maximum texture size your
implementation supports with the following call:

GLint texSize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE,&texSize);

...

This is only an estimate, because the glGet*() function doesn't know
what format, internalformat, type, and other parameters you'll be
using for any given texture. OpenGL 1.1 and greater solves this
problem by allowing texture proxy.

I'm sure that this test will always fail on my hw due to OOM.

OK, I see your point.

I think we can fix the test by testing a 2D texture that's maxSize x 1
(and 1 x maxSize) or so.  I'll post a patch in a bit.

Could you try the test as-is?  I'm just curious to see if it does
indeed fail as you expect.


Yes, it fails:

GL_MAX_TEXTURE_SIZE = 16384
radeon: Failed to allocate a buffer:
radeon:    size      : 1431656448 bytes
radeon:    alignment : 32768 bytes
radeon:    domains   : 4
radeon: Failed to allocate a buffer:
radeon:    size      : 1431656448 bytes
radeon:    alignment : 32768 bytes
radeon:    domains   : 4
Unexpected GL error: GL_OUT_OF_MEMORY 0x505
(Error at 
/home/vg/build/video/64_piglit/tests/texturing/max-texture-size-level.c:68)
PIGLIT: {'result': 'fail' }

Thanks for looking into that issue.

PS. Probably some related bugs were fixed recently, but some time ago
"max-texture-size" due to similar problems usually killed my apps (with
OOM killer) when I was running piglit, that's why I'd like to avoid such
problems.

Yeah, that test still has some issues.

But Mesa/gallium is missing some stuff too. A while ago I added a ctx->Const.MaxTextureMbytes field to limit the max texture size. But there's no way for a gallium driver to report such a value up to Mesa (we may need a new PIPE_CAP_).

I'll try to look into that when I get some time.

-Brian
_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to