----- Original Message ----- > --- > src/gallium/drivers/svga/svga_draw.c | 258 > ++++++++++++++++++---------------- > 1 file changed, 135 insertions(+), 123 deletions(-) > > diff --git a/src/gallium/drivers/svga/svga_draw.c > b/src/gallium/drivers/svga/svga_draw.c > index fa0cac4..366a2dc 100644 > --- a/src/gallium/drivers/svga/svga_draw.c > +++ b/src/gallium/drivers/svga/svga_draw.c > @@ -287,6 +287,140 @@ svga_hwtnl_set_index_bias(struct svga_hwtnl *hwtnl, int > index_bias) > * Internal functions: > */ > > +/** > + * For debugging only. > + */ > +static void > +check_draw_params(struct svga_hwtnl *hwtnl, > + const SVGA3dPrimitiveRange *range, > + unsigned min_index, unsigned max_index, > + struct pipe_resource *ib) > +{ > + unsigned i; > + > + for (i = 0; i < hwtnl->cmd.vdecl_count; i++) { > + struct pipe_resource *vb = hwtnl->cmd.vdecl_vb[i]; > + unsigned size = vb ? vb->width0 : 0; > + unsigned offset = hwtnl->cmd.vdecl[i].array.offset; > + unsigned stride = hwtnl->cmd.vdecl[i].array.stride; > + int index_bias = (int) range->indexBias + hwtnl->index_bias; > + unsigned width; > + > + assert(vb); > + assert(size); > + assert(offset < size); > + assert(min_index <= max_index); > + > + switch (hwtnl->cmd.vdecl[i].identity.type) { > + case SVGA3D_DECLTYPE_FLOAT1: > + width = 4; > + break; > + case SVGA3D_DECLTYPE_FLOAT2: > + width = 4 * 2; > + break; > + case SVGA3D_DECLTYPE_FLOAT3: > + width = 4 * 3; > + break; > + case SVGA3D_DECLTYPE_FLOAT4: > + width = 4 * 4; > + break; > + case SVGA3D_DECLTYPE_D3DCOLOR: > + width = 4; > + break; > + case SVGA3D_DECLTYPE_UBYTE4: > + width = 1 * 4; > + break; > + case SVGA3D_DECLTYPE_SHORT2: > + width = 2 * 2; > + break; > + case SVGA3D_DECLTYPE_SHORT4: > + width = 2 * 4; > + break; > + case SVGA3D_DECLTYPE_UBYTE4N: > + width = 1 * 4; > + break; > + case SVGA3D_DECLTYPE_SHORT2N: > + width = 2 * 2; > + break; > + case SVGA3D_DECLTYPE_SHORT4N: > + width = 2 * 4; > + break; > + case SVGA3D_DECLTYPE_USHORT2N: > + width = 2 * 2; > + break; > + case SVGA3D_DECLTYPE_USHORT4N: > + width = 2 * 4; > + break; > + case SVGA3D_DECLTYPE_UDEC3: > + width = 4; > + break; > + case SVGA3D_DECLTYPE_DEC3N: > + width = 4; > + break; > + case SVGA3D_DECLTYPE_FLOAT16_2: > + width = 2 * 2; > + break; > + case SVGA3D_DECLTYPE_FLOAT16_4: > + width = 2 * 4; > + break; > + default: > + assert(0); > + width = 0; > + break; > + } > + > + if (index_bias >= 0) { > + assert(offset + index_bias * stride + width <= size); > + } > + > + /* > + * min_index/max_index are merely conservative guesses, so we can't > + * make buffer overflow detection based on their values. > + */ > + } > + > + assert(range->indexWidth == range->indexArray.stride); > + > + if (ib) { > + unsigned size = ib->width0; > + unsigned offset = range->indexArray.offset; > + unsigned stride = range->indexArray.stride; > + unsigned count; > + > + assert(size); > + assert(offset < size); > + assert(stride); > + > + switch (range->primType) { > + case SVGA3D_PRIMITIVE_POINTLIST: > + count = range->primitiveCount; > + break; > + case SVGA3D_PRIMITIVE_LINELIST: > + count = range->primitiveCount * 2; > + break; > + case SVGA3D_PRIMITIVE_LINESTRIP: > + count = range->primitiveCount + 1; > + break; > + case SVGA3D_PRIMITIVE_TRIANGLELIST: > + count = range->primitiveCount * 3; > + break; > + case SVGA3D_PRIMITIVE_TRIANGLESTRIP: > + count = range->primitiveCount + 2; > + break; > + case SVGA3D_PRIMITIVE_TRIANGLEFAN: > + count = range->primitiveCount + 2; > + break; > + default: > + assert(0); > + count = 0; > + break; > + } > + > + assert(offset + count * stride <= size); > + } > +} > + > + > enum pipe_error > svga_hwtnl_prim(struct svga_hwtnl *hwtnl, > const SVGA3dPrimitiveRange * range, > @@ -296,129 +430,7 @@ svga_hwtnl_prim(struct svga_hwtnl *hwtnl, > enum pipe_error ret = PIPE_OK; > > #ifdef DEBUG > - { > - unsigned i; > - for (i = 0; i < hwtnl->cmd.vdecl_count; i++) { > - struct pipe_resource *vb = hwtnl->cmd.vdecl_vb[i]; > - unsigned size = vb ? vb->width0 : 0; > - unsigned offset = hwtnl->cmd.vdecl[i].array.offset; > - unsigned stride = hwtnl->cmd.vdecl[i].array.stride; > - int index_bias = (int) range->indexBias + hwtnl->index_bias; > - unsigned width; > - > - assert(vb); > - assert(size); > - assert(offset < size); > - assert(min_index <= max_index); > - > - switch (hwtnl->cmd.vdecl[i].identity.type) { > - case SVGA3D_DECLTYPE_FLOAT1: > - width = 4; > - break; > - case SVGA3D_DECLTYPE_FLOAT2: > - width = 4 * 2; > - break; > - case SVGA3D_DECLTYPE_FLOAT3: > - width = 4 * 3; > - break; > - case SVGA3D_DECLTYPE_FLOAT4: > - width = 4 * 4; > - break; > - case SVGA3D_DECLTYPE_D3DCOLOR: > - width = 4; > - break; > - case SVGA3D_DECLTYPE_UBYTE4: > - width = 1 * 4; > - break; > - case SVGA3D_DECLTYPE_SHORT2: > - width = 2 * 2; > - break; > - case SVGA3D_DECLTYPE_SHORT4: > - width = 2 * 4; > - break; > - case SVGA3D_DECLTYPE_UBYTE4N: > - width = 1 * 4; > - break; > - case SVGA3D_DECLTYPE_SHORT2N: > - width = 2 * 2; > - break; > - case SVGA3D_DECLTYPE_SHORT4N: > - width = 2 * 4; > - break; > - case SVGA3D_DECLTYPE_USHORT2N: > - width = 2 * 2; > - break; > - case SVGA3D_DECLTYPE_USHORT4N: > - width = 2 * 4; > - break; > - case SVGA3D_DECLTYPE_UDEC3: > - width = 4; > - break; > - case SVGA3D_DECLTYPE_DEC3N: > - width = 4; > - break; > - case SVGA3D_DECLTYPE_FLOAT16_2: > - width = 2 * 2; > - break; > - case SVGA3D_DECLTYPE_FLOAT16_4: > - width = 2 * 4; > - break; > - default: > - assert(0); > - width = 0; > - break; > - } > - > - if (index_bias >= 0) { > - assert(offset + index_bias * stride + width <= size); > - } > - > - /* > - * min_index/max_index are merely conservative guesses, so we can't > - * make buffer overflow detection based on their values. > - */ > - } > - > - assert(range->indexWidth == range->indexArray.stride); > - > - if (ib) { > - unsigned size = ib->width0; > - unsigned offset = range->indexArray.offset; > - unsigned stride = range->indexArray.stride; > - unsigned count; > - > - assert(size); > - assert(offset < size); > - assert(stride); > - > - switch (range->primType) { > - case SVGA3D_PRIMITIVE_POINTLIST: > - count = range->primitiveCount; > - break; > - case SVGA3D_PRIMITIVE_LINELIST: > - count = range->primitiveCount * 2; > - break; > - case SVGA3D_PRIMITIVE_LINESTRIP: > - count = range->primitiveCount + 1; > - break; > - case SVGA3D_PRIMITIVE_TRIANGLELIST: > - count = range->primitiveCount * 3; > - break; > - case SVGA3D_PRIMITIVE_TRIANGLESTRIP: > - count = range->primitiveCount + 2; > - break; > - case SVGA3D_PRIMITIVE_TRIANGLEFAN: > - count = range->primitiveCount + 2; > - break; > - default: > - assert(0); > - count = 0; > - break; > - } > - > - assert(offset + count * stride <= size); > - } > - } > + check_draw_params(hwtnl, range, min_index, max_index, ib); > #endif > > if (hwtnl->cmd.prim_count + 1 >= QSZ) { > -- > 1.7.10.4 >
Reviewed-by: Charmaine Lee <charmai...@vmware.com> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev