sketch out new pipe surface/sampler types
This commit is contained in:
@@ -578,7 +578,9 @@ intel_render_texture(GLcontext * ctx,
|
||||
}
|
||||
|
||||
/* store that offset in the region */
|
||||
#if 0
|
||||
st_image->mt->region->draw_offset = imageOffset;
|
||||
#endif
|
||||
|
||||
/* update drawing region, etc */
|
||||
intel_draw_buffer(ctx, fb);
|
||||
|
@@ -32,6 +32,7 @@
|
||||
|
||||
#include "macros.h"
|
||||
#include "pipe/p_state.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "intel_tex_layout.h"
|
||||
#include "state_tracker/st_mipmap_tree.h"
|
||||
|
||||
@@ -472,3 +473,4 @@ i945_miptree_layout(struct pipe_context *pipe, struct pipe_mipmap_tree * mt)
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
@@ -130,6 +130,10 @@ struct pipe_context {
|
||||
struct pipe_surface *(*surface_alloc)(struct pipe_context *pipe,
|
||||
GLuint format);
|
||||
|
||||
struct pipe_surface *(*get_tex_surface)(struct pipe_context *pipe,
|
||||
struct pipe_mipmap_tree *texture,
|
||||
GLuint face, GLuint level,
|
||||
GLuint zslice);
|
||||
|
||||
/*
|
||||
* Memory region functions
|
||||
@@ -230,5 +234,16 @@ pipe_region_reference(struct pipe_region **dst, struct pipe_region *src)
|
||||
}
|
||||
|
||||
|
||||
static INLINE void
|
||||
pipe_surface_reference(struct pipe_surface **dst, struct pipe_surface *src)
|
||||
{
|
||||
assert(*dst == NULL);
|
||||
if (src) {
|
||||
src->refcount++;
|
||||
*dst = src;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif /* PIPE_CONTEXT_H */
|
||||
|
@@ -245,13 +245,11 @@ struct pipe_region
|
||||
GLuint height; /**< in pixels */
|
||||
GLubyte *map; /**< only non-NULL when region is actually mapped */
|
||||
GLuint map_refcount; /**< Reference count for mapping */
|
||||
|
||||
GLuint draw_offset; /**< Offset of drawing address within the region */
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 2D surface.
|
||||
* 2D surface. This is basically a view into a pipe_region (memory buffer).
|
||||
* May be a renderbuffer, texture mipmap level, etc.
|
||||
*/
|
||||
struct pipe_surface
|
||||
@@ -259,39 +257,32 @@ struct pipe_surface
|
||||
struct pipe_region *region;
|
||||
GLuint format:5; /**< PIPE_FORMAT_x */
|
||||
GLuint width, height;
|
||||
GLuint offset; /**< offset from start of region, in bytes */
|
||||
GLint refcount;
|
||||
|
||||
void *rb; /**< Ptr back to renderbuffer (temporary?) */
|
||||
|
||||
/** get block/tile of pixels from surface */
|
||||
void (*get_tile)(struct pipe_surface *ps,
|
||||
GLuint x, GLuint y, GLuint w, GLuint h, GLfloat *p);
|
||||
|
||||
/** put block/tile of pixels into surface */
|
||||
void (*put_tile)(struct pipe_surface *ps,
|
||||
GLuint x, GLuint y, GLuint w, GLuint h, const GLfloat *p);
|
||||
};
|
||||
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* Texture object.
|
||||
* Mipmap levels, cube faces, 3D slices can be accessed as surfaces.
|
||||
* surface sampler object
|
||||
* XXX prototype
|
||||
*/
|
||||
struct pipe_texture_object
|
||||
struct pipe_surface_sampler
|
||||
{
|
||||
GLuint type:2; /**< PIPE_TEXTURE_x */
|
||||
GLuint format:5; /**< PIPE_FORMAT_x */
|
||||
GLuint width:13; /**< 13 bits = 8K max size */
|
||||
GLuint height:13;
|
||||
GLuint depth:13;
|
||||
GLuint mipmapped:1;
|
||||
|
||||
/** to access a 1D or 2D texture object as a surface */
|
||||
struct pipe_surface *(*get_2d_surface)(struct pipe_texture_object *pto,
|
||||
GLuint level);
|
||||
/** to access a 3D texture object as a surface */
|
||||
struct pipe_surface *(*get_3d_surface)(struct pipe_texture_object *pto,
|
||||
GLuint level, GLuint slice);
|
||||
/** to access a cube texture object as a surface */
|
||||
struct pipe_surface *(*get_cube_surface)(struct pipe_texture_object *pto,
|
||||
GLuint face, GLuint level);
|
||||
/** when finished with surface: */
|
||||
void (*release_surface)(struct pipe_texture_object *pto,
|
||||
struct pipe_surface *ps);
|
||||
struct pipe_sampler_state state;
|
||||
struct pipe_mipmap_tree *texture;
|
||||
void (*get_sample)(struct pipe_surface_sampler *sampler,
|
||||
const GLfloat strq[4], GLfloat rgba[4]);
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
|
@@ -201,6 +201,7 @@ struct pipe_context *softpipe_create( struct softpipe_winsys *sws )
|
||||
softpipe->pipe.get_occlusion_counter = softpipe_get_occlusion_counter;
|
||||
|
||||
softpipe->pipe.mipmap_tree_layout = softpipe_mipmap_tree_layout;
|
||||
softpipe->pipe.get_tex_surface = softpipe_get_tex_surface;
|
||||
|
||||
softpipe->quad.polygon_stipple = sp_quad_polygon_stipple_stage(softpipe);
|
||||
softpipe->quad.shade = sp_quad_shade_stage(softpipe);
|
||||
|
@@ -351,12 +351,54 @@ sp_surface_alloc(struct pipe_context *pipe, GLenum format)
|
||||
return NULL;
|
||||
|
||||
sps->surface.format = format;
|
||||
sps->surface.refcount = 1;
|
||||
init_quad_funcs(sps);
|
||||
|
||||
return &sps->surface;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Called via pipe->get_tex_surface()
|
||||
* XXX is this in the right place?
|
||||
*/
|
||||
struct pipe_surface *
|
||||
softpipe_get_tex_surface(struct pipe_context *pipe,
|
||||
struct pipe_mipmap_tree *mt,
|
||||
GLuint face, GLuint level, GLuint zslice)
|
||||
{
|
||||
struct pipe_surface *ps;
|
||||
GLuint offset; /* in bytes */
|
||||
|
||||
offset = mt->level[level].level_offset;
|
||||
|
||||
if (mt->target == GL_TEXTURE_CUBE_MAP_ARB) {
|
||||
offset += mt->level[level].image_offset[face] * mt->cpp;
|
||||
}
|
||||
else if (mt->target == GL_TEXTURE_3D) {
|
||||
offset += mt->level[level].image_offset[zslice] * mt->cpp;
|
||||
}
|
||||
else {
|
||||
assert(face == 0);
|
||||
assert(zslice == 0);
|
||||
}
|
||||
|
||||
ps = pipe->surface_alloc(pipe, mt->internal_format);
|
||||
if (ps) {
|
||||
assert(ps->format);
|
||||
assert(ps->refcount);
|
||||
ps->region = mt->region;
|
||||
ps->width = mt->level[level].width;
|
||||
ps->height = mt->level[level].height;
|
||||
ps->offset = offset;
|
||||
}
|
||||
return ps;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sp_init_surface_functions(struct softpipe_context *sp)
|
||||
{
|
||||
|
@@ -85,6 +85,12 @@ struct softpipe_surface {
|
||||
};
|
||||
|
||||
|
||||
extern struct pipe_surface *
|
||||
softpipe_get_tex_surface(struct pipe_context *pipe,
|
||||
struct pipe_mipmap_tree *mt,
|
||||
GLuint face, GLuint level, GLuint zslice);
|
||||
|
||||
|
||||
/** Cast wrapper */
|
||||
static INLINE struct softpipe_surface *
|
||||
softpipe_surface(struct pipe_surface *ps)
|
||||
|
Reference in New Issue
Block a user