示例#1
0
PUBLIC
Status XvMCClearSubpicture(Display *dpy, XvMCSubpicture *subpicture, short x, short y,
                           unsigned short width, unsigned short height, unsigned int color)
{
    XvMCSubpicturePrivate *subpicture_priv;
    XvMCContextPrivate *context_priv;
    struct pipe_context *pipe;
    struct pipe_sampler_view *dst;
    struct pipe_box dst_box = {x, y, 0, width, height, 1};
    struct pipe_transfer *transfer;
    union util_color uc;
    void *map;

    assert(dpy);

    if (!subpicture)
        return XvMCBadSubpicture;

    /* Convert color to float */
    util_format_read_4f(PIPE_FORMAT_B8G8R8A8_UNORM,
                        uc.f, 1, &color, 4,
                        0, 0, 1, 1);

    subpicture_priv = subpicture->privData;
    context_priv = subpicture_priv->context->privData;
    pipe = context_priv->pipe;
    dst = subpicture_priv->sampler;

    /* TODO: Assert clear rect is within bounds? Or clip? */
    transfer = pipe->get_transfer(pipe, dst->texture, 0, PIPE_TRANSFER_WRITE, &dst_box);
    if (!transfer)
        return XvMCBadSubpicture;

    map = pipe->transfer_map(pipe, transfer);
    if (map) {
        util_fill_rect(map, dst->texture->format, transfer->stride, 0, 0,
                       dst_box.width, dst_box.height, &uc);

        pipe->transfer_unmap(pipe, transfer);
    }

    pipe->transfer_destroy(pipe, transfer);

    return Success;
}
static void
nv30_emit_vtxattr(struct nv30_context *nv30, struct pipe_vertex_buffer *vb,
                  struct pipe_vertex_element *ve, unsigned attr)
{
   const unsigned nc = util_format_get_nr_components(ve->src_format);
   struct nouveau_pushbuf *push = nv30->base.pushbuf;
   struct nv04_resource *res = nv04_resource(vb->buffer);
   const void *data;
   float v[4];

   data = nouveau_resource_map_offset(&nv30->base, res, vb->buffer_offset +
                                      ve->src_offset, NOUVEAU_BO_RD);

   util_format_read_4f(ve->src_format, v, 0, data, 0, 0, 0, 1, 1);

   switch (nc) {
   case 4:
      BEGIN_NV04(push, NV30_3D(VTX_ATTR_4F(attr)), 4);
      PUSH_DATAf(push, v[0]);
      PUSH_DATAf(push, v[1]);
      PUSH_DATAf(push, v[2]);
      PUSH_DATAf(push, v[3]);
      break;
   case 3:
      BEGIN_NV04(push, NV30_3D(VTX_ATTR_3F(attr)), 3);
      PUSH_DATAf(push, v[0]);
      PUSH_DATAf(push, v[1]);
      PUSH_DATAf(push, v[2]);
      break;
   case 2:
      BEGIN_NV04(push, NV30_3D(VTX_ATTR_2F(attr)), 2);
      PUSH_DATAf(push, v[0]);
      PUSH_DATAf(push, v[1]);
      break;
   case 1:
      BEGIN_NV04(push, NV30_3D(VTX_ATTR_1F(attr)), 1);
      PUSH_DATAf(push, v[0]);
      break;
   default:
      assert(0);
      break;
   }
}