[PATCH 7/9] glamor: Extract the streamed vertex data code used by Render.
Eric Anholt
eric at anholt.net
Mon Mar 10 13:59:13 PDT 2014
Markus Wick <markus at selfnet.de> writes:
> Am 2014-03-09 05:07, schrieb Eric Anholt:
>> diff --git a/glamor/glamor_vbo.c b/glamor/glamor_vbo.c
>> new file mode 100644
>> index 0000000..be2c2af
>> --- /dev/null
>> +++ b/glamor/glamor_vbo.c
>> @@ -0,0 +1,138 @@
>> +/*
>> + * Copyright © 2014 Intel Corporation
>> + *
>> + * 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.
>> + */
>> +
>> +/**
>> + * @file glamor_vbo.c
>> + *
>> + * Helpers for managing streamed vertex bufffers used in glamor.
>> + */
>> +
>> +#include "glamor_priv.h"
>> +
>> +/** Default size of the VBO, in bytes.
>> + *
>> + * If a single request is larger than this size, we'll resize the VBO
>> + * and return an appropriate mapping, but we'll resize back down after
>> + * that to avoid hogging that memory forever. We don't anticipate
>> + * normal usage actually requiring larger VBO sizes.
>> + */
>> +#define GLAMOR_VBO_SIZE (64 * 1024)
>
> This is a bit too small imo. iirc glamor was used to split up renderings
> to 64k vertices, not 64k bytes.
> What is the cache implact on too big buffers? i965 must fall through to
> LLC, so will it pollute the L1+L2 caches?
> For non-coherent gpus, write combining also shouldn't pollute any
> caches.
64k seems like plenty, but against a non-bufferstorage Mesa, 512k did
give 1.6% improvement, so I swapped to your value.
>> +
>> +/**
>> + * Returns a pointer to @size bytes of VBO storage, which should be
>> + * accessed by the GL using vbo_offset within the VBO.
>> + */
>> +void *
>> +glamor_get_vbo_space(ScreenPtr screen, unsigned size, char
>> **vbo_offset)
>> +{
>> + glamor_screen_private *glamor_priv =
>> glamor_get_screen_private(screen);
>> + void *data;
>> +
>> + glamor_get_context(glamor_priv);
>> +
>> + glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
>> +
>> + if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
>> + if (glamor_priv->vbo_size < glamor_priv->vbo_offset + size) {
>> + glamor_priv->vbo_size = MAX(GLAMOR_VBO_SIZE, size);
>> + glamor_priv->vbo_offset = 0;
>> + glBufferData(GL_ARRAY_BUFFER,
>> + glamor_priv->vbo_size, NULL, GL_STREAM_DRAW);
>> + }
>> +
>> + data = glMapBufferRange(GL_ARRAY_BUFFER,
>> + glamor_priv->vbo_offset,
>> + size,
>> + GL_MAP_WRITE_BIT |
>> + GL_MAP_UNSYNCHRONIZED_BIT |
>> + GL_MAP_INVALIDATE_RANGE_BIT);
>> + assert(data != NULL);
>> + *vbo_offset = (void *)(uintptr_t)glamor_priv->vbo_offset;
>
> (char *) instead of (void *).
Changed.
>> + glamor_priv->vbo_offset += size;
>> + } else {
>> + /* Return a pointer to the statically allocated non-VBO
>> + * memory. We'll upload it through glBufferData() later.
>> + */
>> + if (glamor_priv->vbo_size < size) {
>> + glamor_priv->vbo_size = MAX(GLAMOR_VBO_SIZE, size);
>> +
>> + glBufferData(GL_ARRAY_BUFFER,
>> + glamor_priv->vbo_size, NULL, GL_STREAM_DRAW);
>
> Is this call needed at all? As we upload by glBufferData, we will alloc
> the buffer then.
Nope, you're right.
>> +
>> + free(glamor_priv->vb);
>> + glamor_priv->vb = XNFalloc(size);
>> + }
>> + *vbo_offset = NULL;
>> + glamor_priv->vbo_offset = 0;
>
> This variable is used for the size on uploading. So it must be set to
> "size".
Good catch. Fixed (and commented).
>> +void
>> +glamor_put_vbo_space(ScreenPtr screen)
>> +{
>> + glamor_screen_private *glamor_priv =
>> glamor_get_screen_private(screen);
>> +
>> + glamor_get_context(glamor_priv);
>> +
>> + if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
>> + glUnmapBuffer(GL_ARRAY_BUFFER);
>> + } else {
>> + glBufferData(GL_ARRAY_BUFFER, glamor_priv->vbo_offset,
>> + glamor_priv->vb, GL_DYNAMIC_DRAW);
>> + }
>> +
>> + glBindBuffer(GL_ARRAY_BUFFER, 0);
>> +
>> + glamor_put_context(glamor_priv);
>> +}
>> +
>> +void
>> +glamor_init_vbo(ScreenPtr screen)
>> +{
>> + glamor_screen_private *glamor_priv =
>> glamor_get_screen_private(screen);
>> +
>> + glamor_get_context(glamor_priv);
>> +
>> + glGenBuffers(1, &glamor_priv->vbo);
>> +
>> + glamor_put_context(glamor_priv);
>> +}
>> +
>> +void
>> +glamor_fini_vbo(ScreenPtr screen)
>> +{
>> + glamor_screen_private *glamor_priv =
>> glamor_get_screen_private(screen);
>> +
>> + glamor_get_context(glamor_priv);
>> +
>> + glDeleteBuffers(1, &glamor_priv->vbo);
>> + if (glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP)
>> + free(glamor_priv->vb);
>> +
>> + glamor_put_context(glamor_priv);
>> +}
>
> I don't like the idea to select the code by desktop vs gles as both
> don't have to support ARB_mbr.
Yeah, we should definitely extend this to GLES's ARB_mbr in the future.
> Do we have to care about allocing zero bytes? I don't think so, but it's
> broken right now.
I don't think so.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg-devel/attachments/20140310/2b512d89/attachment.pgp>
More information about the xorg-devel
mailing list