Commit c64285ae authored by Roland Scheidegger's avatar Roland Scheidegger

python: fixes for resource changes

doesn't look quite ok yet, but sort of compiles.
parent 03d4d5a4
......@@ -72,9 +72,8 @@
%rename(Device) st_device;
%rename(Context) st_context;
%rename(Texture) pipe_texture;
%rename(Resource) pipe_resource;
%rename(Surface) st_surface;
%rename(Buffer) pipe_buffer;
%rename(BlendColor) pipe_blend_color;
%rename(Blend) pipe_blend_state;
......
......@@ -144,7 +144,7 @@ struct st_context {
}
void set_constant_buffer(unsigned shader, unsigned index,
struct pipe_buffer *buffer )
struct pipe_resource *buffer )
{
$self->pipe->set_constant_buffer($self->pipe, shader, index, buffer);
}
......@@ -168,7 +168,7 @@ struct st_context {
}
void set_fragment_sampler_texture(unsigned index,
struct pipe_texture *texture) {
struct pipe_resource *texture) {
struct pipe_sampler_view templ;
if(!texture)
......@@ -186,7 +186,7 @@ struct st_context {
}
void set_vertex_sampler_texture(unsigned index,
struct pipe_texture *texture) {
struct pipe_resource *texture) {
struct pipe_sampler_view templ;
if(!texture)
......@@ -208,7 +208,7 @@ struct st_context {
unsigned stride,
unsigned max_index,
unsigned buffer_offset,
struct pipe_buffer *buffer)
struct pipe_resource *buffer)
{
unsigned i;
struct pipe_vertex_buffer state;
......@@ -252,7 +252,7 @@ struct st_context {
$self->pipe->draw_arrays($self->pipe, mode, start, count);
}
void draw_elements( struct pipe_buffer *indexBuffer,
void draw_elements( struct pipe_resource *indexBuffer,
unsigned indexSize,
unsigned mode, unsigned start, unsigned count)
{
......@@ -262,7 +262,7 @@ struct st_context {
mode, start, count);
}
void draw_range_elements( struct pipe_buffer *indexBuffer,
void draw_range_elements( struct pipe_resource *indexBuffer,
unsigned indexSize, unsigned minIndex, unsigned maxIndex,
unsigned mode, unsigned start, unsigned count)
{
......@@ -279,7 +279,8 @@ struct st_context {
{
struct pipe_context *pipe = $self->pipe;
struct pipe_screen *screen = pipe->screen;
struct pipe_buffer *vbuf;
struct pipe_resource *vbuf;
struct pipe_transfer *transfer;
struct pipe_vertex_element velements[PIPE_MAX_ATTRIBS];
struct pipe_vertex_buffer vbuffer;
float *map;
......@@ -293,12 +294,12 @@ struct st_context {
size);
if(!vbuf)
goto error1;
map = pipe_buffer_map(screen, vbuf, PIPE_TRANSFER_WRITE);
map = pipe_buffer_map(pipe, vbuf, PIPE_TRANSFER_WRITE, &transfer);
if (!map)
goto error2;
memcpy(map, vertices, size);
pipe_buffer_unmap(screen, vbuf);
pipe_buffer_unmap(pipe, vbuf, transfer);
cso_save_vertex_elements($self->cso);
......@@ -325,7 +326,7 @@ struct st_context {
cso_restore_vertex_elements($self->cso);
error2:
pipe_buffer_reference(&vbuf, NULL);
pipe_resource_reference(&vbuf, NULL);
error1:
;
}
......@@ -399,7 +400,7 @@ error1:
unsigned x, unsigned y, unsigned w, unsigned h,
char **STRING, int *LENGTH)
{
struct pipe_texture *texture = surface->texture;
struct pipe_resource *texture = surface->texture;
struct pipe_context *pipe = $self->pipe;
struct pipe_transfer *transfer;
unsigned stride;
......@@ -410,16 +411,16 @@ error1:
if(!*STRING)
return;
transfer = pipe->get_tex_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_READ,
x, y, w, h);
transfer = pipe_get_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_READ,
x, y, w, h);
if(transfer) {
pipe_get_tile_raw(pipe, transfer, 0, 0, w, h, *STRING, stride);
pipe->tex_transfer_destroy(pipe, transfer);
pipe->transfer_destroy(pipe, transfer);
}
}
......@@ -429,7 +430,7 @@ error1:
unsigned x, unsigned y, unsigned w, unsigned h,
const char *STRING, unsigned LENGTH, unsigned stride = 0)
{
struct pipe_texture *texture = surface->texture;
struct pipe_resource *texture = surface->texture;
struct pipe_context *pipe = $self->pipe;
struct pipe_transfer *transfer;
......@@ -439,18 +440,18 @@ error1:
if(LENGTH < util_format_get_nblocksy(texture->format, h) * stride)
SWIG_exception(SWIG_ValueError, "offset must be smaller than buffer size");
transfer = pipe->get_tex_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_WRITE,
x, y, w, h);
transfer = pipe_get_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_WRITE,
x, y, w, h);
if(!transfer)
SWIG_exception(SWIG_MemoryError, "couldn't initiate transfer");
pipe_put_tile_raw(pipe, transfer, 0, 0, w, h, STRING, stride);
pipe->tex_transfer_destroy(pipe, transfer);
pipe->transfer_destroy(pipe, transfer);
fail:
return;
......@@ -463,16 +464,16 @@ error1:
{
struct pipe_context *pipe = $self->pipe;
struct pipe_transfer *transfer;
transfer = pipe->get_tex_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_READ,
x, y, w, h);
transfer = pipe_get_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_READ,
x, y, w, h);
if(transfer) {
pipe_get_tile_rgba(pipe, transfer, 0, 0, w, h, rgba);
pipe->tex_transfer_destroy(pipe, transfer);
pipe->transfer_destroy(pipe, transfer);
}
}
......@@ -483,16 +484,16 @@ error1:
{
struct pipe_context *pipe = $self->pipe;
struct pipe_transfer *transfer;
transfer = pipe->get_tex_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_WRITE,
x, y, w, h);
transfer = pipe_get_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_WRITE,
x, y, w, h);
if(transfer) {
pipe_put_tile_rgba(pipe, transfer, 0, 0, w, h, rgba);
pipe->tex_transfer_destroy(pipe, transfer);
pipe->transfer_destroy(pipe, transfer);
}
}
......@@ -525,14 +526,13 @@ error1:
rgba8 = (unsigned char *) *STRING;
transfer = pipe->get_tex_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_READ,
x, y,
w, h);
transfer = pipe_get_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_READ,
x, y, w, h);
if(transfer) {
pipe_get_tile_rgba(pipe, transfer, 0, 0, w, h, rgba);
for(j = 0; j < h; ++j) {
......@@ -540,7 +540,7 @@ error1:
for(k = 0; k <4; ++k)
rgba8[j*w*4 + i*4 + k] = float_to_ubyte(rgba[j*w*4 + i*4 + k]);
}
pipe->tex_transfer_destroy(pipe, transfer);
pipe->transfer_destroy(pipe, transfer);
}
free(rgba);
......@@ -553,16 +553,16 @@ error1:
{
struct pipe_context *pipe = $self->pipe;
struct pipe_transfer *transfer;
transfer = pipe->get_tex_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_READ,
x, y, w, h);
transfer = pipe_get_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_READ,
x, y, w, h);
if(transfer) {
pipe_get_tile_z(pipe, transfer, 0, 0, w, h, z);
pipe->tex_transfer_destroy(pipe, transfer);
pipe->transfer_destroy(pipe, transfer);
}
}
......@@ -573,16 +573,16 @@ error1:
{
struct pipe_context *pipe = $self->pipe;
struct pipe_transfer *transfer;
transfer = pipe->get_tex_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_WRITE,
x, y, w, h);
transfer = pipe_get_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_WRITE,
x, y, w, h);
if(transfer) {
pipe_put_tile_z(pipe, transfer, 0, 0, w, h, z);
pipe->tex_transfer_destroy(pipe, transfer);
pipe->transfer_destroy(pipe, transfer);
}
}
......@@ -609,20 +609,20 @@ error1:
if(!rgba2)
return ~0;
transfer = pipe->get_tex_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_READ,
x, y, w, h);
transfer = pipe_get_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_READ,
x, y, w, h);
if(!transfer) {
FREE(rgba2);
return ~0;
}
pipe_get_tile_rgba(pipe, transfer, 0, 0, w, h, rgba2);
pipe->tex_transfer_destroy(pipe, transfer);
pipe->transfer_destroy(pipe, transfer);
p1 = rgba;
p2 = rgba2;
......
......@@ -81,7 +81,7 @@ struct st_device {
/**
* Check if the given pipe_format is supported as a texture or
* drawing surface.
* \param type one of PIPE_TEXTURE, PIPE_SURFACE
* \param tex_usage bitmask of PIPE_BIND flags
*/
int is_format_supported( enum pipe_format format,
enum pipe_texture_target target,
......@@ -103,7 +103,7 @@ struct st_device {
return st_context_create($self);
}
struct pipe_texture *
struct pipe_resource *
texture_create(
enum pipe_format format,
unsigned width,
......@@ -113,7 +113,7 @@ struct st_device {
enum pipe_texture_target target = PIPE_TEXTURE_2D,
unsigned tex_usage = 0
) {
struct pipe_texture templat;
struct pipe_resource templat;
/* We can't really display surfaces with the python statetracker so mask
* out that usage */
......@@ -128,12 +128,12 @@ struct st_device {
templat.target = target;
templat.bind = tex_usage;
return $self->screen->texture_create($self->screen, &templat);
return $self->screen->resource_create($self->screen, &templat);
}
struct pipe_buffer *
buffer_create(unsigned size, unsigned alignment = 0, unsigned usage = 0) {
return pipe_buffer_create($self->screen, alignment, usage, size);
struct pipe_resource *
buffer_create(unsigned size, unsigned bind = 0) {
return pipe_buffer_create($self->screen, bind, size);
}
};
......@@ -33,97 +33,144 @@
*/
%nodefaultctor pipe_texture;
%nodefaultctor pipe_resource;
%nodefaultctor st_surface;
%nodefaultctor pipe_buffer;
%nodefaultdtor pipe_texture;
%nodefaultdtor pipe_resource;
%nodefaultdtor st_surface;
%nodefaultdtor pipe_buffer;
%ignore pipe_texture::screen;
%ignore pipe_resource::screen;
%immutable st_surface::texture;
%immutable st_surface::face;
%immutable st_surface::level;
%immutable st_surface::zslice;
%newobject pipe_texture::get_surface;
%newobject pipe_resource::get_surface;
/* Avoid naming conflict with p_inlines.h's pipe_buffer_read/write */
%rename(read) read_;
%rename(write) write_;
%extend pipe_texture {
~pipe_texture() {
struct pipe_texture *ptr = $self;
pipe_texture_reference(&ptr, NULL);
%extend pipe_resource {
~pipe_resource() {
struct pipe_resource *ptr = $self;
pipe_resource_reference(&ptr, NULL);
}
unsigned get_width(unsigned level=0) {
return u_minify($self->width0, level);
}
unsigned get_height(unsigned level=0) {
return u_minify($self->height0, level);
}
unsigned get_depth(unsigned level=0) {
return u_minify($self->depth0, level);
}
/** Get a surface which is a "view" into a texture */
struct st_surface *
get_surface(unsigned face=0, unsigned level=0, unsigned zslice=0)
{
struct st_surface *surface;
if(face >= ($self->target == PIPE_TEXTURE_CUBE ? 6U : 1U))
SWIG_exception(SWIG_ValueError, "face out of bounds");
if(level > $self->last_level)
SWIG_exception(SWIG_ValueError, "level out of bounds");
if(zslice >= u_minify($self->depth0, level))
SWIG_exception(SWIG_ValueError, "zslice out of bounds");
surface = CALLOC_STRUCT(st_surface);
if(!surface)
return NULL;
pipe_texture_reference(&surface->texture, $self);
pipe_resource_reference(&surface->texture, $self);
surface->face = face;
surface->level = level;
surface->zslice = zslice;
return surface;
fail:
return NULL;
}
unsigned __len__(void)
{
assert($self->target == PIPE_BUFFER);
assert(p_atomic_read(&$self->reference.count) > 0);
return $self->width0;
}
%cstring_output_allocate_size(char **STRING, int *LENGTH, free(*$1));
void read_(char **STRING, int *LENGTH)
{
struct pipe_screen *screen = $self->screen;
/* XXX need context here not screen */
assert($self->target == PIPE_BUFFER);
assert(p_atomic_read(&$self->reference.count) > 0);
*LENGTH = $self->width0;
*STRING = (char *) malloc($self->width0);
if(!*STRING)
return;
pipe_buffer_read(screen, $self, 0, $self->width0, *STRING);
}
%cstring_input_binary(const char *STRING, unsigned LENGTH);
void write_(const char *STRING, unsigned LENGTH, unsigned offset = 0)
{
struct pipe_screen *screen = $self->screen;
/* XXX need context here not screen */
assert($self->target == PIPE_BUFFER);
assert(p_atomic_read(&$self->reference.count) > 0);
if(offset > $self->width0)
SWIG_exception(SWIG_ValueError, "offset must be smaller than buffer size");
if(offset + LENGTH > $self->width0)
SWIG_exception(SWIG_ValueError, "data length must fit inside the buffer");
pipe_buffer_write(screen, $self, offset, LENGTH, STRING);
fail:
return;
}
};
struct st_surface
{
%immutable;
struct pipe_texture *texture;
struct pipe_resource *texture;
unsigned face;
unsigned level;
unsigned zslice;
};
%extend st_surface {
%immutable;
unsigned format;
unsigned width;
unsigned height;
~st_surface() {
pipe_texture_reference(&$self->texture, NULL);
pipe_resource_reference(&$self->texture, NULL);
FREE($self);
}
};
......@@ -146,55 +193,3 @@ struct st_surface
return u_minify(surface->texture->height0, surface->level);
}
%}
/* Avoid naming conflict with p_inlines.h's pipe_buffer_read/write */
%rename(read) read_;
%rename(write) write_;
%extend pipe_buffer {
~pipe_buffer() {
struct pipe_buffer *ptr = $self;
pipe_buffer_reference(&ptr, NULL);
}
unsigned __len__(void)
{
assert(p_atomic_read(&$self->reference.count) > 0);
return $self->size;
}
%cstring_output_allocate_size(char **STRING, int *LENGTH, free(*$1));
void read_(char **STRING, int *LENGTH)
{
struct pipe_screen *screen = $self->screen;
assert(p_atomic_read(&$self->reference.count) > 0);
*LENGTH = $self->size;
*STRING = (char *) malloc($self->size);
if(!*STRING)
return;
pipe_buffer_read(screen, $self, 0, $self->size, *STRING);
}
%cstring_input_binary(const char *STRING, unsigned LENGTH);
void write_(const char *STRING, unsigned LENGTH, unsigned offset = 0)
{
struct pipe_screen *screen = $self->screen;
assert(p_atomic_read(&$self->reference.count) > 0);
if(offset > $self->size)
SWIG_exception(SWIG_ValueError, "offset must be smaller than buffer size");
if(offset + LENGTH > $self->size)
SWIG_exception(SWIG_ValueError, "data length must fit inside the buffer");
pipe_buffer_write(screen, $self, offset, LENGTH, STRING);
fail:
return;
}
};
......@@ -249,7 +249,7 @@ st_context_create(struct st_device *st_dev)
struct pipe_box box;
uint32_t zero = 0;
u_box_wh( 1, 1, &box );
u_box_origin_2d( 1, 1, &box );
pipe->transfer_inline_write(pipe,
st_ctx->default_texture,
......
......@@ -534,15 +534,15 @@ st_sample_surface(struct pipe_context *pipe,
struct pipe_transfer *transfer;
void *raw;
transfer = pipe->get_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_WRITE,
0, 0,
width,
height);
transfer = pipe_get_transfer(pipe,
surface->texture,
surface->face,
surface->level,
surface->zslice,
PIPE_TRANSFER_WRITE,
0, 0,
width,