mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-10 08:10:14 +01:00
pipe->region_alloc() now takes width instead of pitch, plus a flags param
This commit is contained in:
parent
519aacef03
commit
9ac1a8d416
9 changed files with 44 additions and 33 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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? */
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue