By removing some code from cso_cache.h, u_format.c, and u_inlines.h, we can remove p_context.h, p_screen.h, and u_surface.h as well. Signed-off-by: Chia-I Wu <olvaffe@gmail.com> Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org> Reviewed-by: Ryan Neph <ryanneph@google.com> Acked-by: Gert Wollny <gert.wollny@collabora.com> v2: u_box.h, u_pack_color.h and u_rect.h became unused as wellmacos/master
parent
f720e2497e
commit
cecd190247
@ -1,80 +0,0 @@ |
||||
#ifndef UTIL_BOX_INLINES_H |
||||
#define UTIL_BOX_INLINES_H |
||||
|
||||
#include "pipe/p_state.h" |
||||
|
||||
static inline |
||||
void u_box_1d( unsigned x, |
||||
unsigned w, |
||||
struct pipe_box *box ) |
||||
{ |
||||
box->x = x; |
||||
box->y = 0; |
||||
box->z = 0; |
||||
box->width = w; |
||||
box->height = 1; |
||||
box->depth = 1; |
||||
} |
||||
|
||||
static inline |
||||
void u_box_2d( unsigned x, |
||||
unsigned y, |
||||
unsigned w, |
||||
unsigned h, |
||||
struct pipe_box *box ) |
||||
{ |
||||
box->x = x; |
||||
box->y = y; |
||||
box->z = 0; |
||||
box->width = w; |
||||
box->height = h; |
||||
box->depth = 1; |
||||
} |
||||
|
||||
static inline |
||||
void u_box_origin_2d( unsigned w, |
||||
unsigned h, |
||||
struct pipe_box *box ) |
||||
{ |
||||
box->x = 0; |
||||
box->y = 0; |
||||
box->z = 0; |
||||
box->width = w; |
||||
box->height = h; |
||||
box->depth = 1; |
||||
} |
||||
|
||||
static inline |
||||
void u_box_2d_zslice( unsigned x, |
||||
unsigned y, |
||||
unsigned z, |
||||
unsigned w, |
||||
unsigned h, |
||||
struct pipe_box *box ) |
||||
{ |
||||
box->x = x; |
||||
box->y = y; |
||||
box->z = z; |
||||
box->width = w; |
||||
box->height = h; |
||||
box->depth = 1; |
||||
} |
||||
|
||||
static inline |
||||
void u_box_3d( unsigned x, |
||||
unsigned y, |
||||
unsigned z, |
||||
unsigned w, |
||||
unsigned h, |
||||
unsigned d, |
||||
struct pipe_box *box ) |
||||
{ |
||||
box->x = x; |
||||
box->y = y; |
||||
box->z = z; |
||||
box->width = w; |
||||
box->height = h; |
||||
box->depth = d; |
||||
} |
||||
|
||||
#endif |
@ -1,87 +0,0 @@ |
||||
/**************************************************************************
|
||||
* |
||||
* Copyright 2008 VMware, Inc. |
||||
* All Rights Reserved. |
||||
* |
||||
* Permission is hereby granted, free of charge, to any person obtaining a |
||||
* copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sub license, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
* |
||||
* The above copyright notice and this permission notice (including the |
||||
* next paragraph) shall be included in all copies or substantial portions |
||||
* of the Software. |
||||
* |
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
||||
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR |
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
* |
||||
**************************************************************************/ |
||||
|
||||
/**
|
||||
* @file |
||||
* Functions to produce packed colors/Z from floats. |
||||
*/ |
||||
|
||||
|
||||
#ifndef U_PACK_COLOR_H |
||||
#define U_PACK_COLOR_H |
||||
|
||||
|
||||
#include "pipe/p_compiler.h" |
||||
#include "pipe/p_format.h" |
||||
#include "util/u_debug.h" |
||||
#include "util/u_format.h" |
||||
#include "util/u_math.h" |
||||
|
||||
|
||||
/**
|
||||
* Helper union for packing pixel values. |
||||
* Will often contain values in formats which are too complex to be described |
||||
* in simple terms, hence might just effectively contain a number of bytes. |
||||
* Must be big enough to hold data for all formats (currently 256 bits). |
||||
*/ |
||||
union util_color { |
||||
ubyte ub; |
||||
ushort us; |
||||
uint ui[4]; |
||||
ushort h[4]; /* half float */ |
||||
float f[4]; |
||||
double d[4]; |
||||
}; |
||||
|
||||
/**
|
||||
* Pack 4 ubytes into a 4-byte word |
||||
*/ |
||||
static inline unsigned |
||||
pack_ub4(ubyte b0, ubyte b1, ubyte b2, ubyte b3) |
||||
{ |
||||
return ((((unsigned int)b0) << 0) | |
||||
(((unsigned int)b1) << 8) | |
||||
(((unsigned int)b2) << 16) | |
||||
(((unsigned int)b3) << 24)); |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* Pack/convert 4 floats into one 4-byte word. |
||||
*/ |
||||
static inline unsigned |
||||
pack_ui32_float4(float a, float b, float c, float d) |
||||
{ |
||||
return pack_ub4( float_to_ubyte(a), |
||||
float_to_ubyte(b), |
||||
float_to_ubyte(c), |
||||
float_to_ubyte(d) ); |
||||
} |
||||
|
||||
|
||||
|
||||
#endif /* U_PACK_COLOR_H */ |
@ -1,104 +0,0 @@ |
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2008 VMware, Inc. |
||||
* All Rights Reserved. |
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a |
||||
* copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sub license, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
*
|
||||
* The above copyright notice and this permission notice (including the |
||||
* next paragraph) shall be included in all copies or substantial portions |
||||
* of the Software. |
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
||||
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR |
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
*
|
||||
**************************************************************************/ |
||||
|
||||
|
||||
#ifndef U_RECT_H |
||||
#define U_RECT_H |
||||
|
||||
#include "pipe/p_compiler.h" |
||||
#include "util/u_math.h" |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
struct u_rect { |
||||
int x0, x1; |
||||
int y0, y1; |
||||
}; |
||||
|
||||
/* Do two rectangles intersect?
|
||||
*/ |
||||
static inline boolean |
||||
u_rect_test_intersection(const struct u_rect *a, |
||||
const struct u_rect *b) |
||||
{ |
||||
return (!(a->x1 < b->x0 || |
||||
b->x1 < a->x0 || |
||||
a->y1 < b->y0 || |
||||
b->y1 < a->y0)); |
||||
} |
||||
|
||||
/* Find the intersection of two rectangles known to intersect.
|
||||
*/ |
||||
static inline void |
||||
u_rect_find_intersection(const struct u_rect *a, |
||||
struct u_rect *b) |
||||
{ |
||||
/* Caller should verify intersection exists before calling.
|
||||
*/ |
||||
if (b->x0 < a->x0) b->x0 = a->x0; |
||||
if (b->x1 > a->x1) b->x1 = a->x1; |
||||
if (b->y0 < a->y0) b->y0 = a->y0; |
||||
if (b->y1 > a->y1) b->y1 = a->y1; |
||||
} |
||||
|
||||
|
||||
static inline int |
||||
u_rect_area(const struct u_rect *r) |
||||
{ |
||||
return (r->x1 - r->x0) * (r->y1 - r->y0); |
||||
} |
||||
|
||||
static inline void |
||||
u_rect_possible_intersection(const struct u_rect *a, |
||||
struct u_rect *b) |
||||
{ |
||||
if (u_rect_test_intersection(a,b)) { |
||||
u_rect_find_intersection(a,b); |
||||
} |
||||
else { |
||||
b->x0 = b->x1 = b->y0 = b->y1 = 0; |
||||
} |
||||
} |
||||
|
||||
/* Set @d to a rectangle that covers both @a and @b.
|
||||
*/ |
||||
static inline void |
||||
u_rect_union(struct u_rect *d, const struct u_rect *a, const struct u_rect *b) |
||||
{ |
||||
d->x0 = MIN2(a->x0, b->x0); |
||||
d->y0 = MIN2(a->y0, b->y0); |
||||
d->x1 = MAX2(a->x1, b->x1); |
||||
d->y1 = MAX2(a->y1, b->y1); |
||||
} |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* U_RECT_H */ |
@ -1,462 +0,0 @@ |
||||
/**************************************************************************
|
||||
* |
||||
* Copyright 2009 VMware, Inc. All Rights Reserved. |
||||
* |
||||
* Permission is hereby granted, free of charge, to any person obtaining a |
||||
* copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sub license, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
* |
||||
* The above copyright notice and this permission notice (including the |
||||
* next paragraph) shall be included in all copies or substantial portions |
||||
* of the Software. |
||||
* |
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
||||
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR |
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
* |
||||
**************************************************************************/ |
||||
|
||||
/**
|
||||
* @file |
||||
* Surface utility functions. |
||||
*
|
||||
* @author Brian Paul |
||||
*/ |
||||
|
||||
|
||||
#include "pipe/p_defines.h" |
||||
#include "pipe/p_screen.h" |
||||
#include "pipe/p_state.h" |
||||
|
||||
#include "util/u_format.h" |
||||
#include "util/u_inlines.h" |
||||
#include "util/u_rect.h" |
||||
#include "util/u_surface.h" |
||||
#include "util/u_pack_color.h" |
||||
|
||||
|
||||
/**
|
||||
* Initialize a pipe_surface object. 'view' is considered to have |
||||
* uninitialized contents. |
||||
*/ |
||||
void |
||||
u_surface_default_template(struct pipe_surface *surf, |
||||
const struct pipe_resource *texture) |
||||
{ |
||||
memset(surf, 0, sizeof(*surf)); |
||||
|
||||
surf->format = texture->format; |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* Copy 2D rect from one place to another. |
||||
* Position and sizes are in pixels. |
||||
* src_stride may be negative to do vertical flip of pixels from source. |
||||
*/ |
||||
void |
||||
util_copy_rect(ubyte * dst, |
||||
enum pipe_format format, |
||||
unsigned dst_stride, |
||||
unsigned dst_x, |
||||
unsigned dst_y, |
||||
unsigned width, |
||||
unsigned height, |
||||
const ubyte * src, |
||||
int src_stride, |
||||
unsigned src_x, |
||||
unsigned src_y) |
||||
{ |
||||
unsigned i; |
||||
int src_stride_pos = src_stride < 0 ? -src_stride : src_stride; |
||||
int blocksize = util_format_get_blocksize(format); |
||||
int blockwidth = util_format_get_blockwidth(format); |
||||
int blockheight = util_format_get_blockheight(format); |
||||
|
||||
assert(blocksize > 0); |
||||
assert(blockwidth > 0); |
||||
assert(blockheight > 0); |
||||
|
||||
dst_x /= blockwidth; |
||||
dst_y /= blockheight; |
||||
width = (width + blockwidth - 1)/blockwidth; |
||||
height = (height + blockheight - 1)/blockheight; |
||||
src_x /= blockwidth; |
||||
src_y /= blockheight; |
||||
|
||||
dst += dst_x * blocksize; |
||||
src += src_x * blocksize; |
||||
dst += dst_y * dst_stride; |
||||
src += src_y * src_stride_pos; |
||||
width *= blocksize; |
||||
|
||||
if (width == dst_stride && (int)width == src_stride) |
||||
memcpy(dst, src, height * width); |
||||
else { |
||||
for (i = 0; i < height; i++) { |
||||
memcpy(dst, src, width); |
||||
dst += dst_stride; |
||||
src += src_stride; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* Copy 3D box from one place to another. |
||||
* Position and sizes are in pixels. |
||||
*/ |
||||
void |
||||
util_copy_box(ubyte * dst, |
||||
enum pipe_format format, |
||||
unsigned dst_stride, unsigned dst_slice_stride, |
||||
unsigned dst_x, unsigned dst_y, unsigned dst_z, |
||||
unsigned width, unsigned height, unsigned depth, |
||||
const ubyte * src, |
||||
int src_stride, unsigned src_slice_stride, |
||||
unsigned src_x, unsigned src_y, unsigned src_z) |
||||
{ |
||||
unsigned z; |
||||
dst += dst_z * dst_slice_stride; |
||||
src += src_z * src_slice_stride; |
||||
for (z = 0; z < depth; ++z) { |
||||
util_copy_rect(dst, |
||||
format, |
||||
dst_stride, |
||||
dst_x, dst_y, |
||||
width, height, |
||||
src, |
||||
src_stride, |
||||
src_x, src_y); |
||||
|
||||
dst += dst_slice_stride; |
||||
src += src_slice_stride; |
||||
} |
||||
} |
||||
|
||||
|
||||
void |
||||
util_fill_rect(ubyte * dst, |
||||
enum pipe_format format, |
||||
unsigned dst_stride, |
||||
unsigned dst_x, |
||||
unsigned dst_y, |
||||
unsigned width, |
||||
unsigned height, |
||||
union util_color *uc) |
||||
{ |
||||
const struct util_format_description *desc = util_format_description(format); |
||||
unsigned i, j; |
||||
unsigned width_size; |
||||
int blocksize = desc->block.bits / 8; |
||||
int blockwidth = desc->block.width; |
||||
int blockheight = desc->block.height; |
||||
|
||||
assert(blocksize > 0); |
||||
assert(blockwidth > 0); |
||||
assert(blockheight > 0); |
||||
|
||||
dst_x /= blockwidth; |
||||
dst_y /= blockheight; |
||||
width = (width + blockwidth - 1)/blockwidth; |
||||
height = (height + blockheight - 1)/blockheight; |
||||
|
||||
dst += dst_x * blocksize; |
||||
dst += dst_y * dst_stride; |
||||
width_size = width * blocksize; |
||||
|
||||
switch (blocksize) { |
||||
case 1: |
||||
if(dst_stride == width_size) |
||||
memset(dst, uc->ub, height * width_size); |
||||
else { |
||||
for (i = 0; i < height; i++) { |
||||
memset(dst, uc->ub, width_size); |
||||
dst += dst_stride; |
||||
} |
||||
} |
||||
break; |
||||
case 2: |
||||
for (i = 0; i < height; i++) { |
||||
uint16_t *row = (uint16_t *)dst; |
||||
for (j = 0; j < width; j++) |
||||
*row++ = uc->us; |
||||
dst += dst_stride; |
||||
} |
||||
break; |
||||
case 4: |
||||
for (i = 0; i < height; i++) { |
||||
uint32_t *row = (uint32_t *)dst; |
||||
for (j = 0; j < width; j++) |
||||
*row++ = uc->ui[0]; |
||||
dst += dst_stride; |
||||
} |
||||
break; |
||||
default: |
||||
for (i = 0; i < height; i++) { |
||||
ubyte *row = dst; |
||||
for (j = 0; j < width; j++) { |
||||
memcpy(row, uc, blocksize); |
||||
row += blocksize; |
||||
} |
||||
dst += dst_stride; |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
|
||||
|
||||
void |
||||
util_fill_box(ubyte * dst, |
||||
enum pipe_format format, |
||||
unsigned stride, |
||||
unsigned layer_stride, |
||||
unsigned x, |
||||
unsigned y, |
||||
unsigned z, |
||||
unsigned width, |
||||
unsigned height, |
||||
unsigned depth, |
||||
union util_color *uc) |
||||
{ |
||||
unsigned layer; |
||||
dst += z * layer_stride; |
||||
for (layer = z; layer < depth; layer++) { |
||||
util_fill_rect(dst, format, |
||||
stride, |
||||
x, y, width, height, uc); |
||||
dst += layer_stride; |
||||
} |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* Fallback function for pipe->resource_copy_region(). |
||||
* Note: (X,Y)=(0,0) is always the upper-left corner. |
||||
*/ |
||||
void |
||||
util_resource_copy_region(struct pipe_context *pipe, |
||||
struct pipe_resource *dst, |
||||
unsigned dst_level, |
||||
unsigned dst_x, unsigned dst_y, unsigned dst_z, |
||||
struct pipe_resource *src, |
||||
unsigned src_level, |
||||
const struct pipe_box *src_box) |
||||
{ |
||||
struct pipe_transfer *src_trans, *dst_trans; |
||||
uint8_t *dst_map; |
||||
const uint8_t *src_map; |
||||
ASSERTED enum pipe_format src_format; |
||||
enum pipe_format dst_format; |
||||
struct pipe_box dst_box; |
||||
|
||||
assert(src && dst); |
||||
if (!src || !dst) |
||||
return; |
||||
|
||||
assert((src->target == PIPE_BUFFER && dst->target == PIPE_BUFFER) || |
||||
(src->target != PIPE_BUFFER && dst->target != PIPE_BUFFER)); |
||||
|
||||
src_format = src->format; |
||||
dst_format = dst->format; |
||||
|
||||
assert(util_format_get_blocksize(dst_format) == util_format_get_blocksize(src_format)); |
||||
assert(util_format_get_blockwidth(dst_format) == util_format_get_blockwidth(src_format)); |
||||
assert(util_format_get_blockheight(dst_format) == util_format_get_blockheight(src_format)); |
||||
|
||||
src_map = pipe->transfer_map(pipe, |
||||
src, |
||||
src_level, |
||||
PIPE_TRANSFER_READ, |
||||
src_box, &src_trans); |
||||
assert(src_map); |
||||
if (!src_map) { |
||||
goto no_src_map; |
||||
} |
||||
|
||||
dst_box.x = dst_x; |
||||
dst_box.y = dst_y; |
||||
dst_box.z = dst_z; |
||||
dst_box.width = src_box->width; |
||||
dst_box.height = src_box->height; |
||||
dst_box.depth = src_box->depth; |
||||
|
||||
dst_map = pipe->transfer_map(pipe, |
||||
dst, |
||||
dst_level, |
||||
PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, |
||||
&dst_box, &dst_trans); |
||||
assert(dst_map); |
||||
if (!dst_map) { |
||||
goto no_dst_map; |
||||
} |
||||
|
||||
if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) { |
||||
assert(src_box->height == 1); |
||||
assert(src_box->depth == 1); |
||||
memcpy(dst_map, src_map, src_box->width); |
||||
} else { |
||||
util_copy_box(dst_map, |
||||
dst_format, |
||||
dst_trans->stride, dst_trans->layer_stride, |
||||
0, 0, 0, |
||||
src_box->width, src_box->height, src_box->depth, |
||||
src_map, |
||||
src_trans->stride, src_trans->layer_stride, |
||||
0, 0, 0); |
||||
} |
||||
|
||||
pipe->transfer_unmap(pipe, dst_trans); |
||||
no_dst_map: |
||||
pipe->transfer_unmap(pipe, src_trans); |
||||
no_src_map: |
||||
; |
||||
} |
||||
|
||||
|
||||
|
||||
#define UBYTE_TO_USHORT(B) ((B) | ((B) << 8)) |
||||
|
||||
|
||||
/* Return if the box is totally inside the resource.
|
||||
*/ |
||||
static boolean |
||||
is_box_inside_resource(const struct pipe_resource *res, |
||||
const struct pipe_box *box, |
||||
unsigned level) |
||||
{ |
||||
unsigned width = 1, height = 1, depth = 1; |
||||
|
||||
switch (res->target) { |
||||
case PIPE_BUFFER: |
||||
width = res->width0; |
||||
height = 1; |
||||
depth = 1; |
||||
break; |
||||
case PIPE_TEXTURE_1D: |
||||
width = u_minify(res->width0, level); |
||||
height = 1; |
||||
depth = 1; |
||||
break; |
||||
case PIPE_TEXTURE_2D: |
||||
case PIPE_TEXTURE_RECT: |
||||
width = u_minify(res->width0, level); |
||||
height = u_minify(res->height0, level); |
||||
depth = 1; |
||||
break; |
||||
case PIPE_TEXTURE_3D: |
||||
width = u_minify(res->width0, level); |
||||
height = u_minify(res->height0, level); |
||||
depth = u_minify(res->depth0, level); |
||||
break; |
||||
case PIPE_TEXTURE_CUBE: |
||||
width = u_minify(res->width0, level); |
||||
height = u_minify(res->height0, level); |
||||
depth = 6; |
||||
break; |
||||
case PIPE_TEXTURE_1D_ARRAY: |
||||
width = u_minify(res->width0, level); |
||||
height = 1; |
||||
depth = res->array_size; |
||||
break; |
||||
case PIPE_TEXTURE_2D_ARRAY: |
||||
width = u_minify(res->width0, level); |
||||
height = u_minify(res->height0, level); |
||||
depth = res->array_size; |
||||
break; |
||||
case PIPE_TEXTURE_CUBE_ARRAY: |
||||
width = u_minify(res->width0, level); |
||||
height = u_minify(res->height0, level); |
||||
depth = res->array_size; |
||||
assert(res->array_size % 6 == 0); |
||||
break; |
||||
case PIPE_MAX_TEXTURE_TYPES:; |
||||
} |
||||
|
||||
return box->x >= 0 && |
||||
box->x + box->width <= (int) width && |
||||
box->y >= 0 && |
||||
box->y + box->height <= (int) height && |
||||
box->z >= 0 && |
||||
box->z + box->depth <= (int) depth; |
||||
} |
||||
|
||||
static unsigned |
||||
get_sample_count(const struct pipe_resource *res) |
||||
{ |
||||
return res->nr_samples ? res->nr_samples : 1; |
||||
} |
||||
|
||||
/**
|
||||
* Try to do a blit using resource_copy_region. The function calls |
||||
* resource_copy_region if the blit description is compatible with it. |
||||
* |
||||
* It returns TRUE if the blit was done using resource_copy_region. |
||||
* |
||||
* It returns FALSE otherwise and the caller must fall back to a more generic |
||||
* codepath for the blit operation. (e.g. by using u_blitter) |
||||
*/ |
||||
boolean |
||||
util_try_blit_via_copy_region(struct pipe_context *ctx, |
||||
const struct pipe_blit_info *blit) |
||||
{ |
||||
unsigned mask = util_format_get_mask(blit->dst.format); |
||||
|
||||
/* No format conversions. */ |
||||
if (blit->src.resource->format != blit->src.format || |
||||
blit->dst.resource->format != blit->dst.format || |
||||
!util_is_format_compatible( |
||||
util_format_description(blit->src.resource->format), |
||||
util_format_description(blit->dst.resource->format))) { |
||||
return FALSE; |
||||
} |
||||
|
||||
/* No masks, no filtering, no scissor. */ |
||||
if ((blit->mask & mask) != mask || |
||||
blit->filter != PIPE_TEX_FILTER_NEAREST || |
||||
blit->scissor_enable) { |
||||
return FALSE; |
||||
} |
||||
|
||||
/* No flipping. */ |
||||
if (blit->src.box.width < 0 || |
||||
blit->src.box.height < 0 || |
||||
blit->src.box.depth < 0) { |
||||
return FALSE; |
||||
} |
||||
|
||||
/* No scaling. */ |
||||
if (blit->src.box.width != blit->dst.box.width || |
||||
blit->src.box.height != blit->dst.box.height || |
||||
blit->src.box.depth != blit->dst.box.depth) { |
||||
return FALSE; |
||||
} |
||||
|
||||
/* No out-of-bounds access. */ |
||||
if (!is_box_inside_resource(blit->src.resource, &blit->src.box, |
||||
blit->src.level) || |
||||
!is_box_inside_resource(blit->dst.resource, &blit->dst.box, |
||||
blit->dst.level)) { |
||||
return FALSE; |
||||
} |
||||
|
||||
/* Sample counts must match. */ |
||||
if (get_sample_count(blit->src.resource) != |
||||
get_sample_count(blit->dst.resource)) { |
||||
return FALSE; |
||||
} |
||||
|
||||
ctx->resource_copy_region(ctx, blit->dst.resource, blit->dst.level, |
||||
blit->dst.box.x, blit->dst.box.y, blit->dst.box.z, |
||||
blit->src.resource, blit->src.level, |
||||
&blit->src.box); |
||||
return TRUE; |
||||
} |
@ -1,111 +0,0 @@ |
||||
/**************************************************************************
|
||||
* |
||||
* Copyright 2009 VMware, Inc. All Rights Reserved. |
||||
* |
||||
* Permission is hereby granted, free of charge, to any person obtaining a |
||||
* copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sub license, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
* |
||||
* The above copyright notice and this permission notice (including the |
||||
* next paragraph) shall be included in all copies or substantial portions |
||||
* of the Software. |
||||
* |
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
||||
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR |
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
* |
||||
**************************************************************************/ |
||||
|
||||
|
||||
#ifndef U_SURFACE_H |
||||
#define U_SURFACE_H |
||||
|
||||
|
||||
#include "pipe/p_compiler.h" |
||||
#include "pipe/p_state.h" |
||||
|
||||
#include "util/u_pack_color.h" |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
|
||||
extern void |
||||
u_surface_default_template(struct pipe_surface *view, |
||||
const struct pipe_resource *texture); |
||||
|
||||
extern void |
||||
util_copy_rect(ubyte * dst, enum pipe_format format, |
||||
unsigned dst_stride, unsigned dst_x, unsigned dst_y, |
||||
unsigned width, unsigned height, const ubyte * src, |
||||
int src_stride, unsigned src_x, unsigned src_y); |
||||
|
||||
extern void |
||||
util_copy_box(ubyte * dst, |
||||
enum pipe_format format, |
||||
unsigned dst_stride, unsigned dst_slice_stride, |
||||
unsigned dst_x, unsigned dst_y, unsigned dst_z, |
||||
unsigned width, unsigned height, unsigned depth, |
||||
const ubyte * src, |
||||
int src_stride, unsigned src_slice_stride, |
||||
unsigned src_x, unsigned src_y, unsigned src_z); |
||||
|
||||
extern void |
||||
util_fill_rect(ubyte * dst, enum pipe_format format, |
||||
unsigned dst_stride, unsigned dst_x, unsigned dst_y, |
||||
unsigned width, unsigned height, union util_color *uc); |
||||
|
||||
extern void |
||||
util_fill_box(ubyte * dst, enum pipe_format format, |
||||
unsigned stride, unsigned layer_stride, |
||||
unsigned x, unsigned y, unsigned z, |
||||
unsigned width, unsigned height, unsigned depth, |
||||
union util_color *uc); |
||||
|
||||
|
||||
extern void |
||||
util_resource_copy_region(struct pipe_context *pipe, |
||||
struct pipe_resource *dst, |
||||
unsigned dst_level, |
||||
unsigned dst_x, unsigned dst_y, unsigned dst_z, |
||||
struct pipe_resource *src, |
||||
unsigned src_level, |
||||
const struct pipe_box *src_box); |
||||
|
||||
extern void |
||||
util_clear_render_target(struct pipe_context *pipe, |
||||
struct pipe_surface *dst, |
||||
const union pipe_color_union *color, |
||||
unsigned dstx, unsigned dsty, |
||||
unsigned width, unsigned height); |
||||
|
||||
extern void |
||||
util_clear_depth_stencil(struct pipe_context *pipe, |
||||
struct pipe_surface *dst, |
||||
unsigned clear_flags, |
||||
double depth, |
||||
unsigned stencil, |
||||
unsigned dstx, unsigned dsty, |
||||
unsigned width, unsigned height); |
||||
|
||||
extern boolean |
||||
util_try_blit_via_copy_region(struct pipe_context *ctx, |
||||
const struct pipe_blit_info *blit); |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
|
||||
#endif /* U_SURFACE_H */ |
@ -1,546 +0,0 @@ |
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2007 VMware, Inc. |
||||
* All Rights Reserved. |
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a |
||||
* copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sub license, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
*
|
||||
* The above copyright notice and this permission notice (including the |
||||
* next paragraph) shall be included in all copies or substantial portions |
||||
* of the Software. |
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
||||
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR |
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
*
|
||||
**************************************************************************/ |
||||
|
||||
#ifndef PIPE_CONTEXT_H |
||||
#define PIPE_CONTEXT_H |
||||
|
||||
#include "p_compiler.h" |
||||
#include "p_format.h" |
||||
#include "p_video_enums.h" |
||||
#include "p_defines.h" |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
|
||||
struct pipe_blend_color; |
||||
struct pipe_blend_state; |
||||
struct pipe_blit_info; |
||||
struct pipe_box; |
||||
struct pipe_clip_state; |
||||
struct pipe_constant_buffer; |
||||
struct pipe_depth_stencil_alpha_state; |
||||
struct pipe_draw_info; |
||||
struct pipe_fence_handle; |
||||
struct pipe_framebuffer_state; |
||||
struct pipe_index_buffer; |
||||
struct pipe_query; |
||||
struct pipe_poly_stipple; |
||||
struct pipe_rasterizer_state; |
||||
struct pipe_resolve_info; |
||||
struct pipe_resource; |
||||
struct pipe_sampler_state; |
||||
struct pipe_sampler_view; |
||||
struct pipe_scissor_state; |
||||
struct pipe_shader_state; |
||||
struct pipe_stencil_ref; |
||||
struct pipe_stream_output_target; |
||||
struct pipe_surface; |
||||
struct pipe_transfer; |
||||
struct pipe_vertex_buffer; |
||||
struct pipe_vertex_element; |
||||
struct pipe_video_buffer; |
||||
struct pipe_video_codec; |
||||
struct pipe_viewport_state; |
||||
struct pipe_compute_state; |
||||
union pipe_color_union; |
||||
union pipe_query_result; |
||||
|
||||
/**
|
||||
* Gallium rendering context. Basically: |
||||
* - state setting functions |
||||
* - VBO drawing functions |
||||
* - surface functions |
||||
*/ |
||||
struct pipe_context { |
||||
struct pipe_screen *screen; |
||||
|
||||
void *priv; /**< context private data (for DRI for example) */ |
||||
void *draw; /**< private, for draw module (temporary?) */ |
||||
|
||||
void (*destroy)( struct pipe_context * ); |
||||
|
||||
/**
|
||||
* VBO drawing |
||||
*/ |
||||
/*@{*/ |
||||
void (*draw_vbo)( struct pipe_context *pipe, |
||||
const struct pipe_draw_info *info ); |
||||
/*@}*/ |
||||
|
||||
/**
|
||||
* Predicate subsequent rendering on occlusion query result |
||||
* \param query the query predicate, or NULL if no predicate |
||||
* \param condition whether to skip on FALSE or TRUE query results |
||||
* \param mode one of PIPE_RENDER_COND_x |
||||
*/ |
||||
void (*render_condition)( struct pipe_context *pipe, |
||||
struct pipe_query *query, |
||||
boolean condition, |
||||
uint mode ); |
||||
|
||||
/**
|
||||
* Query objects |
||||
*/ |
||||
/*@{*/ |
||||
struct pipe_query *(*create_query)( struct pipe_context *pipe, |
||||
unsigned query_type ); |
||||
|
||||
void (*destroy_query)(struct pipe_context *pipe, |
||||
struct pipe_query *q); |
||||
|
||||
void (*begin_query)(struct pipe_context *pipe, struct pipe_query *q); |
||||
void (*end_query)(struct pipe_context *pipe, struct pipe_query *q); |
||||
|
||||
/**
|
||||
* Get results of a query. |
||||
* \param wait if true, this query will block until the result is ready |
||||
* \return TRUE if results are ready, FALSE otherwise |
||||
*/ |
||||
boolean (*get_query_result)(struct pipe_context *pipe, |
||||
struct pipe_query *q, |
||||
boolean wait, |
||||
union pipe_query_result *result); |
||||
/*@}*/ |
||||
|
||||
/**
|
||||
* State functions (create/bind/destroy state objects) |
||||
*/ |
||||
/*@{*/ |
||||
void * (*create_blend_state)(struct pipe_context *, |
||||
const struct pipe_blend_state *); |
||||
void (*bind_blend_state)(struct pipe_context *, void *); |
||||
void (*delete_blend_state)(struct pipe_context *, void *); |
||||
|
||||
void * (*create_sampler_state)(struct pipe_context *, |
||||
const struct pipe_sampler_state *); |
||||
void (*bind_sampler_states)(struct pipe_context *, |
||||
unsigned shader, unsigned start_slot, |
||||
unsigned num_samplers, void **samplers); |
||||
void (*delete_sampler_state)(struct pipe_context *, void *); |
||||
|
||||
void * (*create_rasterizer_state)(struct pipe_context *, |
||||
const struct pipe_rasterizer_state *); |
||||
void (*bind_rasterizer_state)(struct pipe_context *, void *); |
||||
void (*delete_rasterizer_state)(struct pipe_context *, void *); |
||||
|
||||
void * (*create_depth_stencil_alpha_state)(struct pipe_context *, |
||||
const struct pipe_depth_stencil_alpha_state *); |
||||
void (*bind_depth_stencil_alpha_state)(struct pipe_context *, void *); |
||||
void (*delete_depth_stencil_alpha_state)(struct pipe_context *, void *); |
||||
|
||||
void * (*create_fs_state)(struct pipe_context *, |
||||
const struct pipe_shader_state *); |
||||
void (*bind_fs_state)(struct pipe_context *, void *); |
||||
void (*delete_fs_state)(struct pipe_context *, void *); |
||||
|
||||
void * (*create_vs_state)(struct pipe_context *, |
||||
const struct pipe_shader_state *); |
||||
void (*bind_vs_state)(struct pipe_context *, void *); |
||||
void (*delete_vs_state)(struct pipe_context *, void *); |
||||
|
||||
void * (*create_gs_state)(struct pipe_context *, |
||||
const struct pipe_shader_state *); |
||||
void (*bind_gs_state)(struct pipe_context *, void *); |
||||
void (*delete_gs_state)(struct pipe_context *, void *); |
||||
|
||||
void * (*create_vertex_elements_state)(struct pipe_context *, |
||||
unsigned num_elements, |
||||
const struct pipe_vertex_element *); |
||||
void (*bind_vertex_elements_state)(struct pipe_context *, void *); |
||||
void (*delete_vertex_elements_state)(struct pipe_context *, void *); |
||||
|
||||
/*@}*/ |
||||
|
||||
/**
|
||||
* Parameter-like state (or properties) |
||||
*/ |
||||
/*@{*/ |
||||
void (*set_blend_color)( struct pipe_context *, |
||||
const struct pipe_blend_color * ); |
||||
|
||||
void (*set_stencil_ref)( struct pipe_context *, |
||||
const struct pipe_stencil_ref * ); |
||||
|
||||
void (*set_sample_mask)( struct pipe_context *, |
||||
unsigned sample_mask ); |
||||
|
||||
void (*set_clip_state)( struct pipe_context *, |
||||
const struct pipe_clip_state * ); |
||||
|
||||
void (*set_constant_buffer)( struct pipe_context *, |
||||
uint shader, uint index, |
||||
struct pipe_constant_buffer *buf ); |
||||
|
||||
void (*set_framebuffer_state)( struct pipe_context *, |
||||
const struct pipe_framebuffer_state * ); |
||||
|
||||
void (*set_polygon_stipple)( struct pipe_context *, |
||||
const struct pipe_poly_stipple * ); |
||||
|
||||
void (*set_scissor_states)( struct pipe_context *, |
||||
unsigned start_slot, |
||||
unsigned num_scissors, |
||||
const struct pipe_scissor_state * ); |
||||
|
||||
void (*set_viewport_states)( struct pipe_context *, |
||||
unsigned start_slot, |
||||
unsigned num_viewports, |
||||
const struct pipe_viewport_state *); |
||||
|
||||
void (*set_sampler_views)(struct pipe_context *, unsigned shader, |
||||
unsigned start_slot, unsigned num_views, |
||||
struct pipe_sampler_view **); |
||||
|
||||
/**
|
||||
* Bind an array of shader resources that will be used by the |
||||
* graphics pipeline. Any resources that were previously bound to |
||||
* the specified range will be unbound after this call. |
||||
* |
||||
* \param start first resource to bind. |
||||
* \param count number of consecutive resources to bind. |
||||
* \param resources array of pointers to the resources to bind, it |
||||
* should contain at least \a count elements |
||||
* unless it's NULL, in which case no new |
||||
* resources will be bound. |
||||
*/ |
||||
void (*set_shader_resources)(struct pipe_context *, |
||||
unsigned start, unsigned count, |
||||
struct pipe_surface **resources); |
||||
|
||||
void (*set_vertex_buffers)( struct pipe_context *, |
||||
unsigned start_slot, |
||||
unsigned num_buffers, |
||||
const struct pipe_vertex_buffer * ); |
||||
|
||||
void (*set_index_buffer)( struct pipe_context *pipe, |
||||
const struct pipe_index_buffer * ); |
||||
|
||||
/*@}*/ |
||||
|
||||
/**
|
||||
* Stream output functions. |
||||
*/ |
||||
/*@{*/ |
||||
|
||||
struct pipe_stream_output_target *(*create_stream_output_target)( |
||||
struct pipe_context *, |
||||
struct pipe_resource *, |
||||
unsigned buffer_offset, |
||||
unsigned buffer_size); |
||||
|
||||
void (*stream_output_target_destroy)(struct pipe_context *, |
||||
struct pipe_stream_output_target *); |
||||
|
||||
void (*set_stream_output_targets)(struct pipe_context *, |
||||
unsigned num_targets, |
||||
struct pipe_stream_output_target **targets, |
||||
unsigned append_bitmask); |
||||
|
||||
/*@}*/ |
||||
|
||||
|
||||
/**
|
||||
* Resource functions for blit-like functionality |
||||
* |
||||
* If a driver supports multisampling, blit must implement color resolve. |
||||
*/ |
||||
/*@{*/ |
||||
|
||||
/**
|
||||
* Copy a block of pixels from one resource to another. |
||||
* The resource must be of the same format. |
||||
* Resources with nr_samples > 1 are not allowed. |
||||
*/ |
||||
void (*resource_copy_region)(struct pipe_context *pipe, |
||||
struct pipe_resource *dst, |
||||
unsigned dst_level, |
||||
unsigned dstx, unsigned dsty, unsigned dstz, |
||||
struct pipe_resource *src, |
||||
unsigned src_level, |
||||
const struct pipe_box *src_box); |
||||
|
||||
/* Optimal hardware path for blitting pixels.
|
||||
* Scaling, format conversion, up- and downsampling (resolve) are allowed. |
||||
*/ |
||||
void (*blit)(struct pipe_context *pipe, |
||||
const struct pipe_blit_info *info); |
||||
|
||||
/*@}*/ |
||||
|
||||
/**
|
||||
* Clear the specified set of currently bound buffers to specified values. |
||||
* The entire buffers are cleared (no scissor, no colormask, etc). |
||||
* |
||||
* \param buffers bitfield of PIPE_CLEAR_* values. |
||||
* \param color pointer to a union of fiu array for each of r, g, b, a. |
||||
* \param depth depth clear value in [0,1]. |
||||
* \param stencil stencil clear value |
||||
*/ |
||||
void (*clear)(struct pipe_context *pipe, |
||||
unsigned buffers, |
||||
const union pipe_color_union *color, |
||||
double depth, |
||||
unsigned stencil); |
||||
|
||||
/**
|
||||
* Clear a color rendertarget surface. |
||||
* \param color pointer to an union of fiu array for each of r, g, b, a. |
||||
*/ |
||||
void (*clear_render_target)(struct pipe_context *pipe, |
||||
struct pipe_surface *dst, |
||||
const union pipe_color_union *color, |
||||
unsigned dstx, unsigned dsty, |
||||
unsigned width, unsigned height); |
||||
|
||||
/**
|
||||
* Clear a depth-stencil surface. |
||||
* \param clear_flags bitfield of PIPE_CLEAR_DEPTH/STENCIL values. |
||||
* \param depth depth clear value in [0,1]. |
||||
* \param stencil stencil clear value |
||||
*/ |
||||
void (*clear_depth_stencil)(struct pipe_context *pipe, |
||||
struct pipe_surface *dst, |
||||
unsigned clear_flags, |
||||
double depth, |
||||
unsigned stencil, |
||||
unsigned dstx, unsigned dsty, |
||||
unsigned width, unsigned height); |
||||
|
||||
/** Flush draw commands
|
||||
* |
||||
* \param flags bitfield of enum pipe_flush_flags values. |
||||
*/ |
||||
void (*flush)(struct pipe_context *pipe, |
||||
struct pipe_fence_handle **fence, |
||||
unsigned flags); |
||||
|
||||
/**
|
||||
* Create a view on a texture to be used by a shader stage. |
||||
*/ |
||||
struct pipe_sampler_view * (*create_sampler_view)(struct pipe_context *ctx, |
||||
struct pipe_resource *texture, |
||||
const struct pipe_sampler_view *templat); |
||||
|
||||
void (*sampler_view_destroy)(struct pipe_context *ctx, |
||||
struct pipe_sampler_view *view); |
||||
|
||||
|
||||
/**
|
||||
* Get a surface which is a "view" into a resource, used by |
||||
* render target / depth stencil stages. |
||||
*/ |
||||
struct pipe_surface *(*create_surface)(struct pipe_context *ctx, |
||||
struct pipe_resource *resource, |
||||
const struct pipe_surface *templat); |
||||
|
||||
void (*surface_destroy)(struct pipe_context *ctx, |
||||
struct pipe_surface *); |
||||
|
||||
/**
|
||||
* Map a resource. |
||||
* |
||||
* Transfers are (by default) context-private and allow uploads to be |
||||
* interleaved with rendering. |
||||
* |
||||
* out_transfer will contain the transfer object that must be passed |
||||
* to all the other transfer functions. It also contains useful |
||||
* information (like texture strides). |
||||
*/ |
||||
void *(*transfer_map)(struct pipe_context *, |
||||
struct pipe_resource *resource, |
||||
unsigned level, |
||||
unsigned usage, /* a combination of PIPE_TRANSFER_x */ |
||||
const struct pipe_box *, |
||||
struct pipe_transfer **out_transfer); |
||||
|
||||
/* If transfer was created with WRITE|FLUSH_EXPLICIT, only the
|
||||
* regions specified with this call are guaranteed to be written to |
||||
* the resource. |
||||
*/ |
||||
void (*transfer_flush_region)( struct pipe_context *, |
||||
struct pipe_transfer *transfer, |
||||
const struct pipe_box *); |
||||
|
||||
void (*transfer_unmap)(struct pipe_context *, |
||||
struct pipe_transfer *transfer); |
||||
|
||||
/* One-shot transfer operation with data supplied in a user
|
||||
* pointer. XXX: strides?? |
||||
*/ |
||||
void (*transfer_inline_write)( struct pipe_context *, |
||||
struct pipe_resource *, |
||||
unsigned level, |
||||
unsigned usage, /* a combination of PIPE_TRANSFER_x */ |
||||
const struct pipe_box *, |
||||
const void *data, |
||||
unsigned stride, |
||||
unsigned layer_stride); |
||||
|
||||
/**
|
||||
* Flush any pending framebuffer writes and invalidate texture caches. |
||||
*/ |
||||
void (*texture_barrier)(struct pipe_context *); |
||||
|
||||
/**
|
||||
* Flush caches according to flags. |
||||
*/ |
||||
void (*memory_barrier)(struct pipe_context *, unsigned flags); |
||||
|
||||
/**
|
||||
* Creates a video codec for a specific video format/profile |
||||
*/ |
||||
struct pipe_video_codec *(*create_video_codec)( struct pipe_context *context, |
||||
const struct pipe_video_codec *templat ); |
||||
|
||||
/**
|
||||
* Creates a video buffer as decoding target |
||||
*/ |
||||
struct pipe_video_buffer *(*create_video_buffer)( struct pipe_context *context, |
||||
const struct pipe_video_buffer *templat ); |
||||
|
||||
/**
|
||||
* Compute kernel execution |
||||
*/ |
||||
/*@{*/ |
||||
/**
|
||||
* Define the compute program and parameters to be used by |
||||
* pipe_context::launch_grid. |
||||
*/ |
||||
void *(*create_compute_state)(struct pipe_context *context, |
||||
const struct pipe_compute_state *); |
||||
void (*bind_compute_state)(struct pipe_context *, void *); |
||||
void (*delete_compute_state)(struct pipe_context *, void *); |
||||
|
||||
/**
|
||||
* Bind an array of shader resources that will be used by the |
||||
* compute program. Any resources that were previously bound to |
||||
* the specified range will be unbound after this call. |
||||
* |
||||
* \param start first resource to bind. |
||||
* \param count number of consecutive resources to bind. |
||||
* \param resources array of pointers to the resources to bind, it |
||||
* should contain at least \a count elements |
||||
* unless it's NULL, in which case no new |
||||
* resources will be bound. |
||||
*/ |
||||
void (*set_compute_resources)(struct pipe_context *, |
||||
unsigned start, unsigned count, |
||||
struct pipe_surface **resources); |
||||
|
||||
/**
|
||||
* Bind an array of buffers to be mapped into the address space of |
||||
* the GLOBAL resource. Any buffers that were previously bound |
||||
* between [first, first + count - 1] are unbound after this call. |
||||
* |
||||
* \param first first buffer to map. |
||||
* \param count number of consecutive buffers to map. |
||||
* \param resources array of pointers to the buffers to map, it |
||||
* should contain at least \a count elements |
||||
* unless it's NULL, in which case no new |
||||
* resources will be bound. |
||||
* \param handles array of pointers to the memory locations that |
||||
* will be updated with the address each buffer |
||||
* will be mapped to. The base memory address of |
||||
* each of the buffers will be added to the value |
||||
* pointed to by its corresponding handle to form |
||||
* the final address argument. It should contain |
||||
* at least \a count elements, unless \a |
||||
* resources is NULL in which case \a handles |
||||
* should be NULL as well. |
||||
* |
||||
* Note that the driver isn't required to make any guarantees about |
||||
* the contents of the \a handles array being valid anytime except |
||||
* during the subsequent calls to pipe_context::launch_grid. This |
||||
* means that the only sensible location handles[i] may point to is |
||||
* somewhere within the INPUT buffer itself. This is so to |
||||
* accommodate implementations that lack virtual memory but |
||||
* nevertheless migrate buffers on the fly, leading to resource |
||||
* base addresses that change on each kernel invocation or are |
||||
* unknown to the pipe driver. |
||||
*/ |
||||
void (*set_global_binding)(struct pipe_context *context, |
||||
unsigned first, unsigned count, |
||||
struct pipe_resource **resources, |
||||
uint32_t **handles); |
||||
|
||||
/**
|
||||
* Launch the compute kernel starting from instruction \a pc of the |
||||
* currently bound compute program. |
||||
* |
||||
* \a grid_layout and \a block_layout are arrays of size \a |
||||
* PIPE_COMPUTE_CAP_GRID_DIMENSION that determine the layout of the |
||||
* grid (in block units) and working block (in thread units) to be |
||||
* used, respectively. |
||||
* |
||||
* \a pc For drivers that use PIPE_SHADER_IR_LLVM as their prefered IR, |
||||
* this value will be the index of the kernel in the opencl.kernels |
||||
* metadata list. |
||||
* |
||||
* \a input will be used to initialize the INPUT resource, and it |
||||
* should point to a buffer of at least |
||||
* pipe_compute_state::req_input_mem bytes. |
||||
*/ |
||||
void (*launch_grid)(struct pipe_context *context, |
||||
const uint *block_layout, const uint *grid_layout, |
||||
uint32_t pc, const void *input); |
||||
/*@}*/ |
||||
|
||||
/**
|
||||
* Get sample position for an individual sample point. |
||||
* |
||||
* \param sample_count - total number of samples |
||||
* \param sample_index - sample to get the position values for |
||||
* \param out_value - return value of 2 floats for x and y position for |
||||
* requested sample. |
||||
*/ |
||||
void (*get_sample_position)(struct pipe_context *context, |
||||
unsigned sample_count, |
||||
unsigned sample_index, |
||||
float *out_value); |
||||
|
||||
/**
|
||||
* Flush the resource cache, so that the resource can be used |
||||
* by an external client. Possible usage: |
||||
* - flushing a resource before presenting it on the screen |
||||
* - flushing a resource if some other process or device wants to use it |
||||
* This shouldn't be used to flush caches if the resource is only managed |
||||
* by a single pipe_screen and is not shared with another process. |
||||
* (i.e. you shouldn't use it to flush caches explicitly if you want to e.g. |
||||
* use the resource for texturing) |
||||
*/ |
||||
void (*flush_resource)(struct pipe_context *ctx, |
||||
struct pipe_resource *resource); |
||||
}; |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* PIPE_CONTEXT_H */ |
@ -1,230 +0,0 @@ |
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2007 VMware, Inc. |
||||
* All Rights Reserved. |
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a |
||||
* copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sub license, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
*
|
||||
* The above copyright notice and this permission notice (including the |
||||
* next paragraph) shall be included in all copies or substantial portions |
||||
* of the Software. |
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
||||
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR |
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
*
|
||||
**************************************************************************/ |
||||
|
||||
/**
|
||||
* @file |
||||
*
|
||||
* Screen, Adapter or GPU |
||||
* |
||||
* These are driver functions/facilities that are context independent. |
||||
*/ |
||||
|
||||
|
||||
#ifndef P_SCREEN_H |
||||
#define P_SCREEN_H |
||||
|
||||
|
||||
#include "pipe/p_compiler.h" |
||||
#include "pipe/p_format.h" |
||||
#include "pipe/p_defines.h" |
||||
#include "pipe/p_video_enums.h" |
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
|
||||
/** Opaque types */ |
||||
struct winsys_handle; |
||||
struct pipe_fence_handle; |
||||
struct pipe_resource; |
||||
struct pipe_surface; |
||||
struct pipe_transfer; |
||||
struct pipe_box; |
||||
|
||||
|
||||
/**
|
||||
* Gallium screen/adapter context. Basically everything |
||||
* hardware-specific that doesn't actually require a rendering |
||||
* context. |
||||
*/ |
||||
struct pipe_screen { |
||||
void (*destroy)( struct pipe_screen * ); |
||||
|
||||
const char *(*get_name)( struct pipe_screen * ); |
||||
|
||||
const char *(*get_vendor)( struct pipe_screen * ); |
||||
|
||||
/**
|
||||
* Query an integer-valued capability/parameter/limit |
||||
* \param param one of PIPE_CAP_x |
||||
*/ |
||||
int (*get_param)( struct pipe_screen *, enum pipe_cap param ); |
||||
|
||||
/**
|
||||
* Query a float-valued capability/parameter/limit |
||||
* \param param one of PIPE_CAP_x |
||||
*/ |
||||
float (*get_paramf)( struct pipe_screen *, enum pipe_capf param ); |
||||
|
||||
/**
|
||||
* Query a per-shader-stage integer-valued capability/parameter/limit |
||||
* \param param one of PIPE_CAP_x |
||||
*/ |
||||
int (*get_shader_param)( struct pipe_screen *, unsigned shader, enum pipe_shader_cap param ); |
||||
|
||||
/**
|
||||
* Query an integer-valued capability/parameter/limit for a codec/profile |
||||
* \param param one of PIPE_VIDEO_CAP_x |
||||
*/ |
||||
int (*get_video_param)( struct pipe_screen *, |
||||
enum pipe_video_profile profile, |
||||
enum pipe_video_entrypoint entrypoint, |
||||
enum pipe_video_cap param ); |
||||
|
||||
/**
|
||||
* Query a compute-specific capability/parameter/limit. |
||||
* \param param one of PIPE_COMPUTE_CAP_x |
||||
* \param ret pointer to a preallocated buffer that will be |
||||
* initialized to the parameter value, or NULL. |
||||
* \return size in bytes of the parameter value that would be |
||||
* returned. |
||||
*/ |
||||
int (*get_compute_param)(struct pipe_screen *, |
||||
enum pipe_compute_cap param, |
||||
void *ret); |
||||
|
||||
/**
|
||||
* Query a timestamp in nanoseconds. The returned value should match |
||||
* PIPE_QUERY_TIMESTAMP. This function returns immediately and doesn't |
||||
* wait for rendering to complete (which cannot be achieved with queries). |
||||
*/ |
||||
uint64_t (*get_timestamp)(struct pipe_screen *); |
||||
|
||||
struct pipe_context * (*context_create)( struct pipe_screen *, |
||||
void *priv ); |
||||
|
||||
/**
|
||||
* Check if the given pipe_format is supported as a texture or |
||||
* drawing surface. |
||||
* \param bindings bitmask of PIPE_BIND_* |
||||
*/ |
||||
boolean (*is_format_supported)( struct pipe_screen *, |
||||
enum pipe_format format, |
||||
enum pipe_texture_target target, |
||||
unsigned sample_count, |
||||
unsigned bindings ); |
||||
|
||||
/**
|
||||
* Check if the given pipe_format is supported as output for this codec/profile. |
||||
* \param profile profile to check, may also be PIPE_VIDEO_PROFILE_UNKNOWN |
||||
*/ |
||||
boolean (*is_video_format_supported)( struct pipe_screen *, |
||||
enum pipe_format format, |
||||
enum pipe_video_profile profile, |
||||
enum pipe_video_entrypoint entrypoint ); |
||||
|
||||
/**
|
||||
* Check if we can actually create the given resource (test the dimension, |
||||
* overall size, etc). Used to implement proxy textures. |
||||
* \return TRUE if size is OK, FALSE if too large. |
||||
*/ |
||||
boolean (*can_create_resource)(struct pipe_screen *screen, |
||||
const struct pipe_resource *templat); |
||||
|
||||
/**
|
||||
* Create a new texture object, using the given template info. |
||||
*/ |
||||
struct pipe_resource * (*resource_create)(struct pipe_screen *, |
||||
const struct pipe_resource *templat); |
||||
|
||||
/**
|
||||
* Create a texture from a winsys_handle. The handle is often created in |
||||
* another process by first creating a pipe texture and then calling |
||||
* resource_get_handle. |
||||
*/ |
||||
struct pipe_resource * (*resource_from_handle)(struct pipe_screen *, |
||||
const struct pipe_resource *templat, |
||||
struct winsys_handle *handle); |
||||
|
||||
/**
|
||||
* Get a winsys_handle from a texture. Some platforms/winsys requires |
||||
* that the texture is created with a special usage flag like |
||||
* DISPLAYTARGET or PRIMARY. |
||||
*/ |
||||
boolean (*resource_get_handle)(struct pipe_screen *, |
||||
struct pipe_resource *tex, |
||||
struct winsys_handle *handle); |
||||
|
||||
|
||||
void (*resource_destroy)(struct pipe_screen *, |
||||
struct pipe_resource *pt); |
||||
|
||||
|
||||
/**
|
||||
* Do any special operations to ensure frontbuffer contents are |
||||
* displayed, eg copy fake frontbuffer. |
||||
* \param winsys_drawable_handle an opaque handle that the calling context |
||||
* gets out-of-band |
||||
* \param subbox an optional sub region to flush |
||||
*/ |
||||
void (*flush_frontbuffer)( struct pipe_screen *screen, |
||||
struct pipe_resource *resource, |
||||
unsigned level, unsigned layer, |
||||
void *winsys_drawable_handle, |
||||
struct pipe_box *subbox ); |
||||
|
||||
/** Set ptr = fence, with reference counting */ |
||||
void (*fence_reference)( struct pipe_screen *screen, |
||||
struct pipe_fence_handle **ptr, |
||||
struct pipe_fence_handle *fence ); |
||||
|
||||
/**
|
||||
* Checks whether the fence has been signalled. |
||||
*/ |
||||
boolean (*fence_signalled)( struct pipe_screen *screen, |
||||
struct pipe_fence_handle *fence ); |
||||
|
||||
/**
|
||||
* Wait for the fence to finish. |
||||
* \param timeout in nanoseconds (may be PIPE_TIMEOUT_INFINITE). |
||||
*/ |
||||
boolean (*fence_finish)( struct pipe_screen *screen, |
||||
struct pipe_fence_handle *fence, |
||||
uint64_t timeout ); |
||||
|
||||
/**
|
||||
* Returns a driver-specific query. |
||||
* |
||||
* If \p info is NULL, the number of available queries is returned. |
||||
* Otherwise, the driver query at the specified \p index is returned |
||||
* in \p info. The function returns non-zero on success. |
||||
*/ |
||||
int (*get_driver_query_info)(struct pipe_screen *screen, |
||||
unsigned index, |
||||
struct pipe_driver_query_info *info); |
||||
|
||||
}; |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* P_SCREEN_H */ |
@ -1,79 +0,0 @@ |
||||
/**************************************************************************
|
||||
* |
||||
* Copyright 2009 Younes Manton. |
||||
* All Rights Reserved. |
||||
* |
||||
* Permission is hereby granted, free of charge, to any person obtaining a |
||||
* copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sub license, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
* |
||||
* The above copyright notice and this permission notice (including the |
||||
* next paragraph) shall be included in all copies or substantial portions |
||||
* of the Software. |
||||
* |
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
||||
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR |
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
* |
||||
**************************************************************************/ |
||||
|
||||
#ifndef PIPE_VIDEO_ENUMS_H |
||||
#define PIPE_VIDEO_ENUMS_H |
||||
|
||||
enum pipe_video_format |
||||
{ |
||||
PIPE_VIDEO_FORMAT_UNKNOWN = 0, |
||||
PIPE_VIDEO_FORMAT_MPEG12, /**< MPEG1, MPEG2 */ |
||||
PIPE_VIDEO_FORMAT_MPEG4, /**< DIVX, XVID */ |
||||
PIPE_VIDEO_FORMAT_VC1, /**< WMV */ |
||||
PIPE_VIDEO_FORMAT_MPEG4_AVC /**< H.264 */ |
||||
}; |
||||
|
||||
enum pipe_video_profile |
||||
{ |
||||
PIPE_VIDEO_PROFILE_UNKNOWN, |
||||
PIPE_VIDEO_PROFILE_MPEG1, |
||||
PIPE_VIDEO_PROFILE_MPEG2_SIMPLE, |
||||
PIPE_VIDEO_PROFILE_MPEG2_MAIN, |
||||
PIPE_VIDEO_PROFILE_MPEG4_SIMPLE, |
||||
PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE, |
||||
PIPE_VIDEO_PROFILE_VC1_SIMPLE, |
||||
PIPE_VIDEO_PROFILE_VC1_MAIN, |
||||
PIPE_VIDEO_PROFILE_VC1_ADVANCED, |
||||
PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE, |
||||
PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN, |
||||
PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH |
||||
}; |
||||
|
||||
/* Video caps, can be different for each codec/profile */ |
||||
enum pipe_video_cap |
||||
{ |
||||
PIPE_VIDEO_CAP_SUPPORTED = 0, |
||||
PIPE_VIDEO_CAP_NPOT_TEXTURES = 1, |
||||
PIPE_VIDEO_CAP_MAX_WIDTH = 2, |
||||
PIPE_VIDEO_CAP_MAX_HEIGHT = 3, |
||||
PIPE_VIDEO_CAP_PREFERED_FORMAT = 4, |
||||
PIPE_VIDEO_CAP_PREFERS_INTERLACED = 5, |
||||
PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE = 6, |
||||
PIPE_VIDEO_CAP_SUPPORTS_INTERLACED = 7, |
||||
PIPE_VIDEO_CAP_MAX_LEVEL = 8 |
||||
}; |
||||
|
||||
enum pipe_video_entrypoint |
||||
{ |
||||
PIPE_VIDEO_ENTRYPOINT_UNKNOWN, |
||||
PIPE_VIDEO_ENTRYPOINT_BITSTREAM, |
||||
PIPE_VIDEO_ENTRYPOINT_IDCT, |
||||
PIPE_VIDEO_ENTRYPOINT_MC, |
||||
PIPE_VIDEO_ENTRYPOINT_ENCODE |
||||
}; |
||||
|
||||
#endif /* PIPE_VIDEO_ENUMS_H */ |
Loading…
Reference in new issue