llvmpipe: Eliminate constant mapping/unmapping.
This commit is contained in:
parent
c1013f5d40
commit
c4d54b62f5
|
@ -86,9 +86,6 @@ struct llvmpipe_context {
|
||||||
/** Mapped vertex buffers */
|
/** Mapped vertex buffers */
|
||||||
ubyte *mapped_vbuffer[PIPE_MAX_ATTRIBS];
|
ubyte *mapped_vbuffer[PIPE_MAX_ATTRIBS];
|
||||||
|
|
||||||
/** Mapped constant buffers */
|
|
||||||
void *mapped_constants[PIPE_SHADER_TYPES];
|
|
||||||
|
|
||||||
/** Vertex format */
|
/** Vertex format */
|
||||||
struct vertex_info vertex_info;
|
struct vertex_info vertex_info;
|
||||||
struct vertex_info vertex_info_vbuf;
|
struct vertex_info vertex_info_vbuf;
|
||||||
|
|
|
@ -45,54 +45,6 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
llvmpipe_map_constant_buffers(struct llvmpipe_context *lp)
|
|
||||||
{
|
|
||||||
struct pipe_screen *screen = lp->pipe.screen;
|
|
||||||
uint i, size;
|
|
||||||
|
|
||||||
for (i = 0; i < PIPE_SHADER_TYPES; i++) {
|
|
||||||
if (lp->constants[i].buffer && lp->constants[i].buffer->size)
|
|
||||||
lp->mapped_constants[i] = screen->buffer_map(screen, lp->constants[i].buffer,
|
|
||||||
PIPE_BUFFER_USAGE_CPU_READ);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lp->constants[PIPE_SHADER_VERTEX].buffer)
|
|
||||||
size = lp->constants[PIPE_SHADER_VERTEX].buffer->size;
|
|
||||||
else
|
|
||||||
size = 0;
|
|
||||||
|
|
||||||
lp->jit_context.constants = lp->mapped_constants[PIPE_SHADER_FRAGMENT];
|
|
||||||
|
|
||||||
draw_set_mapped_constant_buffer(lp->draw,
|
|
||||||
lp->mapped_constants[PIPE_SHADER_VERTEX],
|
|
||||||
size);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
llvmpipe_unmap_constant_buffers(struct llvmpipe_context *lp)
|
|
||||||
{
|
|
||||||
struct pipe_screen *screen = lp->pipe.screen;
|
|
||||||
uint i;
|
|
||||||
|
|
||||||
/* really need to flush all prims since the vert/frag shaders const buffers
|
|
||||||
* are going away now.
|
|
||||||
*/
|
|
||||||
draw_flush(lp->draw);
|
|
||||||
|
|
||||||
draw_set_mapped_constant_buffer(lp->draw, NULL, 0);
|
|
||||||
|
|
||||||
lp->jit_context.constants = NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
|
||||||
if (lp->constants[i].buffer && lp->constants[i].buffer->size)
|
|
||||||
screen->buffer_unmap(screen, lp->constants[i].buffer);
|
|
||||||
lp->mapped_constants[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
boolean
|
boolean
|
||||||
llvmpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
|
llvmpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
|
||||||
unsigned start, unsigned count)
|
unsigned start, unsigned count)
|
||||||
|
@ -123,8 +75,6 @@ llvmpipe_draw_range_elements(struct pipe_context *pipe,
|
||||||
if (lp->dirty)
|
if (lp->dirty)
|
||||||
llvmpipe_update_derived( lp );
|
llvmpipe_update_derived( lp );
|
||||||
|
|
||||||
llvmpipe_map_constant_buffers(lp);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Map vertex buffers
|
* Map vertex buffers
|
||||||
*/
|
*/
|
||||||
|
@ -160,10 +110,6 @@ llvmpipe_draw_range_elements(struct pipe_context *pipe,
|
||||||
draw_set_mapped_element_buffer(draw, 0, NULL);
|
draw_set_mapped_element_buffer(draw, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Note: leave drawing surfaces mapped */
|
|
||||||
llvmpipe_unmap_constant_buffers(lp);
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,7 @@
|
||||||
#include "lp_bld_debug.h"
|
#include "lp_bld_debug.h"
|
||||||
#include "lp_screen.h"
|
#include "lp_screen.h"
|
||||||
#include "lp_context.h"
|
#include "lp_context.h"
|
||||||
|
#include "lp_buffer.h"
|
||||||
#include "lp_state.h"
|
#include "lp_state.h"
|
||||||
#include "lp_tex_sample.h"
|
#include "lp_tex_sample.h"
|
||||||
|
|
||||||
|
@ -670,16 +671,29 @@ llvmpipe_delete_fs_state(struct pipe_context *pipe, void *fs)
|
||||||
void
|
void
|
||||||
llvmpipe_set_constant_buffer(struct pipe_context *pipe,
|
llvmpipe_set_constant_buffer(struct pipe_context *pipe,
|
||||||
uint shader, uint index,
|
uint shader, uint index,
|
||||||
const struct pipe_constant_buffer *buf)
|
const struct pipe_constant_buffer *constants)
|
||||||
{
|
{
|
||||||
struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
|
struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
|
||||||
|
struct pipe_buffer *buffer = constants ? constants->buffer : NULL;
|
||||||
|
unsigned size = buffer ? buffer->size : 0;
|
||||||
|
const void *data = buffer ? llvmpipe_buffer(buffer)->data : NULL;
|
||||||
|
|
||||||
assert(shader < PIPE_SHADER_TYPES);
|
assert(shader < PIPE_SHADER_TYPES);
|
||||||
assert(index == 0);
|
assert(index == 0);
|
||||||
|
|
||||||
|
if(shader == PIPE_SHADER_VERTEX)
|
||||||
|
draw_flush(llvmpipe->draw);
|
||||||
|
|
||||||
/* note: reference counting */
|
/* note: reference counting */
|
||||||
pipe_buffer_reference(&llvmpipe->constants[shader].buffer,
|
pipe_buffer_reference(&llvmpipe->constants[shader].buffer, buffer);
|
||||||
buf ? buf->buffer : NULL);
|
|
||||||
|
if(shader == PIPE_SHADER_FRAGMENT) {
|
||||||
|
llvmpipe->jit_context.constants = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(shader == PIPE_SHADER_VERTEX) {
|
||||||
|
draw_set_mapped_constant_buffer(llvmpipe->draw, data, size);
|
||||||
|
}
|
||||||
|
|
||||||
llvmpipe->dirty |= LP_NEW_CONSTANTS;
|
llvmpipe->dirty |= LP_NEW_CONSTANTS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue