summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/pipe/i915simple/i915_regions.c11
-rw-r--r--src/mesa/pipe/p_context.h3
-rw-r--r--src/mesa/pipe/p_defines.h19
-rw-r--r--src/mesa/pipe/p_state.h10
-rw-r--r--src/mesa/pipe/softpipe/sp_region.c2
-rw-r--r--src/mesa/state_tracker/st_cb_bufferobjects.c5
-rw-r--r--src/mesa/state_tracker/st_cb_drawpixels.c9
-rw-r--r--src/mesa/state_tracker/st_cb_fbo.c9
-rw-r--r--src/mesa/state_tracker/st_mipmap_tree.c9
9 files changed, 44 insertions, 33 deletions
diff --git a/src/mesa/pipe/i915simple/i915_regions.c b/src/mesa/pipe/i915simple/i915_regions.c
index e2b807f959a..b3bcae547d1 100644
--- a/src/mesa/pipe/i915simple/i915_regions.c
+++ b/src/mesa/pipe/i915simple/i915_regions.c
@@ -31,6 +31,7 @@
* - refcounting of buffer mappings.
*/
+#include "pipe/p_defines.h"
#include "i915_context.h"
#include "i915_winsys.h"
#include "i915_blit.h"
@@ -70,7 +71,7 @@ i915_region_unmap(struct pipe_context *pipe, struct pipe_region *region)
static struct pipe_region *
i915_region_alloc(struct pipe_context *pipe,
- GLuint cpp, GLuint width, GLuint height)
+ GLuint cpp, GLuint width, GLuint height, GLbitfield flags)
{
struct i915_context *i915 = i915_context( pipe );
struct pipe_region *region = calloc(sizeof(*region), 1);
@@ -82,7 +83,13 @@ i915_region_alloc(struct pipe_context *pipe,
* clearly want to be able to render to textures under some
* circumstances, but maybe not always a requirement.
*/
- unsigned pitch = ((cpp * width + 63) & ~63) / cpp;
+ unsigned pitch;
+
+ /* XXX is the pitch different for textures vs. drawables? */
+ if (flags & PIPE_SURFACE_FLAG_TEXTURE) /* or PIPE_SURFACE_FLAG_RENDER? */
+ pitch = ((cpp * width + 63) & ~63) / cpp;
+ else
+ pitch = ((cpp * width + 63) & ~63) / cpp;
region->cpp = cpp;
region->pitch = pitch;
diff --git a/src/mesa/pipe/p_context.h b/src/mesa/pipe/p_context.h
index b5dd149603c..7eb492816b4 100644
--- a/src/mesa/pipe/p_context.h
+++ b/src/mesa/pipe/p_context.h
@@ -140,7 +140,8 @@ struct pipe_context {
* Some of these may go away...
*/
struct pipe_region *(*region_alloc)(struct pipe_context *pipe,
- GLuint cpp, GLuint pitch, GLuint height);
+ GLuint cpp, GLuint width, GLuint height,
+ GLbitfield flags);
void (*region_release)(struct pipe_context *pipe, struct pipe_region **r);
diff --git a/src/mesa/pipe/p_defines.h b/src/mesa/pipe/p_defines.h
index efbb3239a2e..52ecd5b1190 100644
--- a/src/mesa/pipe/p_defines.h
+++ b/src/mesa/pipe/p_defines.h
@@ -176,11 +176,22 @@
/**
- * Buffer mapping access modes
+ * Surface flags
*/
-#define PIPE_MAP_READ 1
-#define PIPE_MAP_WRITE 2
-#define PIPE_MAP_READ_WRITE 3
+#define PIPE_SURFACE_FLAG_TEXTURE 0x1
+#define PIPE_SURFACE_FLAG_RENDER 0x2
+
+
+/**
+ * Buffer flags
+ */
+#define PIPE_BUFFER_FLAG_READ 0x1
+#define PIPE_BUFFER_FLAG_WRITE 0x2
+
+#define PIPE_BUFFER_USE_TEXTURE 0x1
+#define PIPE_BUFFER_USE_VERTEX_BUFFER 0x2
+#define PIPE_BUFFER_USE_INDEX_BUFFER 0x4
+#define PIPE_BUFFER_USE_RENDER_TARGET 0x8
/**
diff --git a/src/mesa/pipe/p_state.h b/src/mesa/pipe/p_state.h
index 64a475ba00d..df456cc2edd 100644
--- a/src/mesa/pipe/p_state.h
+++ b/src/mesa/pipe/p_state.h
@@ -329,15 +329,5 @@ struct pipe_mipmap_tree
struct pipe_buffer_handle;
-#define PIPE_BUFFER_FLAG_READ 0x1
-#define PIPE_BUFFER_FLAG_WRITE 0x2
-
-#define PIPE_BUFFER_USE_TEXTURE 0x1
-#define PIPE_BUFFER_USE_VERTEX_BUFFER 0x2
-#define PIPE_BUFFER_USE_INDEX_BUFFER 0x4
-#define PIPE_BUFFER_USE_RENDER_TARGET 0x8
-
-
-
#endif
diff --git a/src/mesa/pipe/softpipe/sp_region.c b/src/mesa/pipe/softpipe/sp_region.c
index 58749492ec1..1db508f028f 100644
--- a/src/mesa/pipe/softpipe/sp_region.c
+++ b/src/mesa/pipe/softpipe/sp_region.c
@@ -70,7 +70,7 @@ sp_region_unmap(struct pipe_context *pipe, struct pipe_region *region)
static struct pipe_region *
sp_region_alloc(struct pipe_context *pipe,
- GLuint cpp, GLuint pitch, GLuint height)
+ GLuint cpp, GLuint pitch, GLuint height, GLbitfield flags)
{
struct softpipe_context *sp = softpipe_context( pipe );
struct pipe_region *region = calloc(sizeof(*region), 1);
diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c
index d020eb2007b..78fc18a49ad 100644
--- a/src/mesa/state_tracker/st_cb_bufferobjects.c
+++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
@@ -34,6 +34,9 @@
#include "st_cb_bufferobjects.h"
#include "pipe/p_context.h"
+#include "pipe/p_defines.h"
+
+
/* Pixel buffers and Vertex/index buffers are handled through these
* mesa callbacks. Framebuffer/Renderbuffer objects are
@@ -160,7 +163,7 @@ st_bufferobj_map(GLcontext *ctx,
flags = PIPE_BUFFER_FLAG_WRITE;
break;
-
+ case GL_READ_ONLY:
flags = PIPE_BUFFER_FLAG_READ;
break;
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index f0c7a2bfc5a..6981097ef4a 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -101,20 +101,19 @@ make_mipmap_tree(struct st_context *st,
const GLvoid *pixels)
{
GLuint pipeFormat = st_choose_pipe_format(st->pipe, GL_RGBA, format, type);
- int cpp = 4, pitch;
+ int cpp = 4;
struct pipe_mipmap_tree *mt = CALLOC_STRUCT(pipe_mipmap_tree);
+ GLbitfield flags = PIPE_SURFACE_FLAG_TEXTURE;
assert(pipeFormat);
- pitch = width; /* XXX pad */
-
if (unpack->BufferObj) {
/*
mt->region = buffer_object_region(unpack->BufferObj);
*/
}
else {
- mt->region = st->pipe->region_alloc(st->pipe, cpp, pitch, height);
+ mt->region = st->pipe->region_alloc(st->pipe, cpp, width, height, flags);
/* XXX do texstore() here */
}
@@ -128,7 +127,7 @@ make_mipmap_tree(struct st_context *st,
mt->depth0 = 1;
mt->cpp = cpp;
mt->compressed = 0;
- mt->pitch = pitch;
+ mt->pitch = mt->region->pitch;
mt->depth_pitch = 0;
mt->total_height = height;
mt->level[0].level_offset = 0;
diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
index 64ec8022164..bb588d10ea2 100644
--- a/src/mesa/state_tracker/st_cb_fbo.c
+++ b/src/mesa/state_tracker/st_cb_fbo.c
@@ -62,7 +62,8 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
const GLuint pipeFormat
= st_choose_pipe_format(pipe, internalFormat, GL_NONE, GL_NONE);
const struct pipe_format_info *info = st_get_format_info(pipeFormat);
- GLuint cpp, pitch;
+ GLuint cpp;
+ GLbitfield flags = PIPE_SURFACE_FLAG_RENDER; /* want to render to surface */
assert(info);
if (!info)
@@ -98,11 +99,7 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
pipe->region_release(pipe, &strb->surface->region);
}
- /* Choose a pitch to match hardware requirements:
- */
- pitch = ((cpp * width + 63) & ~63) / cpp; /* XXX fix: device-specific */
-
- strb->surface->region = pipe->region_alloc(pipe, cpp, pitch, height);
+ strb->surface->region = pipe->region_alloc(pipe, cpp, width, height, flags);
if (!strb->surface->region)
return GL_FALSE; /* out of memory, try s/w buffer? */
diff --git a/src/mesa/state_tracker/st_mipmap_tree.c b/src/mesa/state_tracker/st_mipmap_tree.c
index ac74335ba13..3cbe697ab3f 100644
--- a/src/mesa/state_tracker/st_mipmap_tree.c
+++ b/src/mesa/state_tracker/st_mipmap_tree.c
@@ -62,6 +62,7 @@ st_miptree_create(struct pipe_context *pipe,
{
GLboolean ok;
struct pipe_mipmap_tree *mt = calloc(sizeof(*mt), 1);
+ GLbitfield flags = 0x0;
DBG("%s target %s format %s level %d..%d\n", __FUNCTION__,
_mesa_lookup_enum_by_nr(target),
@@ -79,9 +80,11 @@ st_miptree_create(struct pipe_context *pipe,
mt->refcount = 1;
ok = pipe->mipmap_tree_layout(pipe, mt);
- if (ok)
- mt->region = pipe->region_alloc(pipe,
- mt->cpp, mt->pitch, mt->total_height);
+ if (ok) {
+ /* note: it's OK to pass 'pitch' as 'width' here: */
+ mt->region = pipe->region_alloc(pipe, mt->cpp, mt->pitch,
+ mt->total_height, flags);
+ }
if (!mt->region) {
free(mt);