Merge branch 'softpipe_0_1_branch' of git+ssh://brianp@git.freedesktop.org/git/mesa/mesa into softpipe_0_1_branch
This commit is contained in:
@@ -48,6 +48,7 @@ DRIVER_SOURCES = \
|
||||
intel_screen.c \
|
||||
intel_span.c \
|
||||
intel_state.c \
|
||||
intel_surface.c \
|
||||
intel_tris.c \
|
||||
intel_fbo.c \
|
||||
intel_depthstencil.c \
|
||||
|
@@ -71,6 +71,8 @@ i915InvalidateState(GLcontext * ctx, GLuint new_state)
|
||||
_tnl_invalidate_vertex_state(ctx, new_state);
|
||||
intel_context(ctx)->NewGLState |= new_state;
|
||||
|
||||
st_invalidate_state(ctx, new_state);
|
||||
|
||||
/* Todo: gather state values under which tracked parameters become
|
||||
* invalidated, add callbacks for things like
|
||||
* ProgramLocalParameters, etc.
|
||||
|
@@ -29,9 +29,25 @@
|
||||
#define INTEL_FBO_H
|
||||
|
||||
|
||||
#include "pipe/p_state.h"
|
||||
#include "pipe/softpipe/sp_surface.h"
|
||||
|
||||
|
||||
struct intel_context;
|
||||
struct intel_region;
|
||||
|
||||
|
||||
/**
|
||||
* Intel "pipe" surface. This is kind of a temporary thing as
|
||||
* renderbuffers and surfaces should eventually become one.
|
||||
*/
|
||||
struct intel_surface
|
||||
{
|
||||
struct softpipe_surface surface; /**< base class */
|
||||
struct intel_renderbuffer *rb; /**< ptr back to matching renderbuffer */
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Intel framebuffer, derived from gl_framebuffer.
|
||||
*/
|
||||
@@ -82,6 +98,8 @@ struct intel_renderbuffer
|
||||
GLuint pf_pending; /**< sequence number of pending flip */
|
||||
|
||||
GLuint vbl_pending; /**< vblank sequence number of pending flip */
|
||||
|
||||
struct intel_surface *surface;
|
||||
};
|
||||
|
||||
|
||||
|
163
src/mesa/drivers/dri/i915tex/intel_surface.c
Normal file
163
src/mesa/drivers/dri/i915tex/intel_surface.c
Normal file
@@ -0,0 +1,163 @@
|
||||
#include "glheader.h"
|
||||
#include "context.h"
|
||||
#include "framebuffer.h"
|
||||
#include "renderbuffer.h"
|
||||
#include "utils.h"
|
||||
#include "main/macros.h"
|
||||
|
||||
|
||||
#include "intel_screen.h"
|
||||
|
||||
#include "intel_context.h"
|
||||
#include "intel_buffers.h"
|
||||
#include "intel_regions.h"
|
||||
#include "intel_span.h"
|
||||
#include "intel_fbo.h"
|
||||
|
||||
#include "pipe/p_state.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/softpipe/sp_surface.h"
|
||||
|
||||
|
||||
/*
|
||||
* XXX a lof of this is a temporary kludge
|
||||
*/
|
||||
|
||||
extern void
|
||||
intel_map_unmap_buffers(struct intel_context *intel, GLboolean map);
|
||||
|
||||
|
||||
|
||||
static void
|
||||
read_quad_f_swz(struct softpipe_surface *gs, GLint x, GLint y,
|
||||
GLfloat (*rrrr)[QUAD_SIZE])
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
write_quad_f_swz(struct softpipe_surface *sps, GLint x, GLint y,
|
||||
GLfloat (*rrrr)[QUAD_SIZE])
|
||||
{
|
||||
struct intel_surface *is = (struct intel_surface *) sps;
|
||||
struct intel_renderbuffer *irb = is->rb;
|
||||
const GLfloat *src = (const GLfloat *) rrrr;
|
||||
GLubyte *dst = (GLubyte *) irb->region->map
|
||||
+ (y * irb->region->pitch + x) * irb->region->cpp;
|
||||
GLubyte temp[16];
|
||||
GLuint i, j;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
for (j = 0; j < 4; j++) {
|
||||
UNCLAMPED_FLOAT_TO_UBYTE(temp[j * 4 + i], src[i * 4 + j]);
|
||||
}
|
||||
}
|
||||
|
||||
printf("intel_surface::write_quad\n");
|
||||
|
||||
memcpy(dst, temp, 8);
|
||||
memcpy(dst + irb->region->pitch * irb->region->cpp, temp + 8, 8);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void *
|
||||
map_surface_buffer(struct pipe_buffer *pb, GLuint access_mode)
|
||||
{
|
||||
struct intel_surface *is = (struct intel_surface *) pb;
|
||||
struct intel_renderbuffer *irb = is->rb;
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
|
||||
assert(access_mode == PIPE_MAP_READ_WRITE);
|
||||
|
||||
intelFinish(&intel->ctx);
|
||||
|
||||
/*LOCK_HARDWARE(intel);*/
|
||||
|
||||
if (irb->region) {
|
||||
intel_region_map(intel->intelScreen, irb->region);
|
||||
}
|
||||
pb->ptr = irb->region->map;
|
||||
|
||||
return pb->ptr;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
unmap_surface_buffer(struct pipe_buffer *pb)
|
||||
{
|
||||
struct intel_surface *is = (struct intel_surface *) pb;
|
||||
struct intel_renderbuffer *irb = is->rb;
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
|
||||
if (irb->region) {
|
||||
intel_region_unmap(intel->intelScreen, irb->region);
|
||||
}
|
||||
pb->ptr = NULL;
|
||||
|
||||
/*UNLOCK_HARDWARE(intel);*/
|
||||
}
|
||||
|
||||
|
||||
struct pipe_surface *
|
||||
xmesa_get_color_surface(GLcontext *ctx, GLuint i)
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
struct intel_framebuffer *intel_fb;
|
||||
struct intel_renderbuffer *intel_rb;
|
||||
|
||||
intel_fb = (struct intel_framebuffer *) ctx->DrawBuffer;
|
||||
intel_rb = intel_fb->color_rb[1];
|
||||
|
||||
if (!intel_rb->surface) {
|
||||
/* create surface and attach to intel_rb */
|
||||
struct intel_surface *is;
|
||||
is = CALLOC_STRUCT(intel_surface);
|
||||
if (is) {
|
||||
is->surface.surface.width = intel_rb->Base.Width;
|
||||
is->surface.surface.height = intel_rb->Base.Height;
|
||||
|
||||
is->surface.read_quad_f_swz = read_quad_f_swz;
|
||||
is->surface.write_quad_f_swz = write_quad_f_swz;
|
||||
|
||||
is->surface.surface.buffer.map = map_surface_buffer;
|
||||
is->surface.surface.buffer.unmap = unmap_surface_buffer;
|
||||
|
||||
is->rb = intel_rb;
|
||||
}
|
||||
intel_rb->surface = is;
|
||||
}
|
||||
else {
|
||||
/* update surface size */
|
||||
struct intel_surface *is = intel_rb->surface;
|
||||
is->surface.surface.width = intel_rb->Base.Width;
|
||||
is->surface.surface.height = intel_rb->Base.Height;
|
||||
/* sanity check */
|
||||
assert(is->surface.surface.buffer.map == map_surface_buffer);
|
||||
}
|
||||
|
||||
return &intel_rb->surface->surface.surface;
|
||||
}
|
||||
|
||||
|
||||
struct pipe_surface *
|
||||
xmesa_get_z_surface(GLcontext *ctx)
|
||||
{
|
||||
/* XXX fix */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
struct pipe_surface *
|
||||
xmesa_get_stencil_surface(GLcontext *ctx)
|
||||
{
|
||||
/* XXX fix */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -69,6 +69,20 @@ xmesa_surface(struct softpipe_surface *sps)
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
map_surface_buffer(struct pipe_buffer *pb, GLuint access_mode)
|
||||
{
|
||||
/* no-op */
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
unmap_surface_buffer(struct pipe_buffer *pb)
|
||||
{
|
||||
/* no-op */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* quad reading/writing
|
||||
* These functions are just wrappers around the existing renderbuffer
|
||||
@@ -199,6 +213,9 @@ create_surface(XMesaContext xmctx, struct xmesa_renderbuffer *xrb)
|
||||
xmsurf->sps.write_quad_ub = write_quad_ub;
|
||||
xmsurf->sps.write_mono_row_ub = write_mono_row_ub;
|
||||
|
||||
xmsurf->sps.surface.buffer.map = map_surface_buffer;
|
||||
xmsurf->sps.surface.buffer.unmap = unmap_surface_buffer;
|
||||
|
||||
#if 0
|
||||
if (xrb->ximage) {
|
||||
xmsurf->sps.surface.ptr = (GLubyte *) xrb->ximage->data;
|
||||
|
@@ -32,12 +32,40 @@
|
||||
#include "main/imports.h"
|
||||
#include "main/macros.h"
|
||||
#include "pipe/draw/draw_context.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "sp_context.h"
|
||||
#include "sp_clear.h"
|
||||
#include "sp_state.h"
|
||||
#include "sp_surface.h"
|
||||
#include "sp_prim_setup.h"
|
||||
|
||||
|
||||
static void map_surfaces(struct softpipe_context *sp)
|
||||
{
|
||||
GLuint i;
|
||||
|
||||
for (i = 0; i < sp->framebuffer.num_cbufs; i++) {
|
||||
struct softpipe_surface *sps = softpipe_surface(sp->framebuffer.cbufs[i]);
|
||||
struct pipe_buffer *buf = &sps->surface.buffer;
|
||||
buf->map(buf, PIPE_MAP_READ_WRITE);
|
||||
}
|
||||
/* XXX depth & stencil bufs */
|
||||
}
|
||||
|
||||
|
||||
static void unmap_surfaces(struct softpipe_context *sp)
|
||||
{
|
||||
GLuint i;
|
||||
|
||||
for (i = 0; i < sp->framebuffer.num_cbufs; i++) {
|
||||
struct softpipe_surface *sps = softpipe_surface(sp->framebuffer.cbufs[i]);
|
||||
struct pipe_buffer *buf = &sps->surface.buffer;
|
||||
buf->unmap(buf);
|
||||
}
|
||||
/* XXX depth & stencil bufs */
|
||||
}
|
||||
|
||||
|
||||
static void softpipe_destroy( struct pipe_context *pipe )
|
||||
{
|
||||
struct softpipe_context *softpipe = softpipe_context( pipe );
|
||||
@@ -56,7 +84,10 @@ static void softpipe_draw_vb( struct pipe_context *pipe,
|
||||
if (softpipe->dirty)
|
||||
softpipe_update_derived( softpipe );
|
||||
|
||||
/* XXX move mapping/unmapping to higher/coarser level? */
|
||||
map_surfaces(softpipe);
|
||||
draw_vb( softpipe->draw, VB );
|
||||
unmap_surfaces(softpipe);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -1010,20 +1010,11 @@ static void setup_begin( struct draw_stage *stage )
|
||||
struct setup_stage *setup = setup_stage(stage);
|
||||
|
||||
setup->quad.nr_attrs = setup->softpipe->nr_frag_attrs;
|
||||
|
||||
/*
|
||||
* XXX this is where we might map() the renderbuffers to begin
|
||||
* s/w rendering.
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
static void setup_end( struct draw_stage *stage )
|
||||
{
|
||||
/*
|
||||
* XXX this is where we might unmap() the renderbuffers after
|
||||
* s/w rendering.
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
@@ -153,7 +153,9 @@ void st_init_cb_program( struct st_context *st )
|
||||
st->ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
|
||||
st->ctx->FragmentProgram._UseTexEnvProgram = GL_TRUE;
|
||||
|
||||
#if 0
|
||||
assert(functions->ProgramStringNotify == _tnl_program_string);
|
||||
#endif
|
||||
functions->BindProgram = st_bind_program;
|
||||
functions->NewProgram = st_new_program;
|
||||
functions->DeleteProgram = st_delete_program;
|
||||
|
Reference in New Issue
Block a user