svga: add new GBS commands

And update some existing commands.

Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
Cc: "10.1" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
Brian Paul 2014-02-08 09:51:14 -08:00
parent d993ada50c
commit 823fbfdca7
2 changed files with 637 additions and 5 deletions

View File

@ -45,6 +45,9 @@
* Can handle null surface. Does a surface_reallocation so you need
* to have allocated the fifo space before converting.
*
*
* param flags mask of SVGA_RELOC_READ / _WRITE
*
* Results:
* id is filled out.
*
@ -280,7 +283,8 @@ SVGA3D_BeginDefineSurface(struct svga_winsys_context *swc,
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->surface_relocation(swc, &cmd->sid, NULL, sid, SVGA_RELOC_WRITE);
swc->surface_relocation(swc, &cmd->sid, NULL, sid,
SVGA_RELOC_WRITE | SVGA_RELOC_INTERNAL);
cmd->surfaceFlags = flags;
cmd->format = format;
@ -365,8 +369,9 @@ SVGA3D_DestroySurface(struct svga_winsys_context *swc,
SVGA_3D_CMD_SURFACE_DESTROY, sizeof *cmd, 1);
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->surface_relocation(swc, &cmd->sid, NULL, sid, SVGA_RELOC_READ);
swc->surface_relocation(swc, &cmd->sid, NULL, sid,
SVGA_RELOC_WRITE | SVGA_RELOC_INTERNAL);
swc->commit(swc);;
return PIPE_OK;
@ -488,6 +493,8 @@ SVGA3D_BufferDMA(struct svga_winsys_context *swc,
SVGA3dCmdSurfaceDMASuffix *pSuffix;
unsigned region_flags;
unsigned surface_flags;
assert(!swc->have_gb_objects);
if (transfer == SVGA3D_WRITE_HOST_VRAM) {
region_flags = SVGA_RELOC_READ;
@ -1349,6 +1356,44 @@ SVGA3D_BeginSetRenderState(struct svga_winsys_context *swc,
}
/*
*----------------------------------------------------------------------
*
* SVGA3D_BeginGBQuery--
*
* GB resource version of SVGA3D_BeginQuery.
*
* Results:
* None.
*
* Side effects:
* Commits space in the FIFO memory.
*
*----------------------------------------------------------------------
*/
static enum pipe_error
SVGA3D_BeginGBQuery(struct svga_winsys_context *swc,
SVGA3dQueryType type) // IN
{
SVGA3dCmdBeginGBQuery *cmd;
cmd = SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_BEGIN_GB_QUERY,
sizeof *cmd,
1);
if(!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->context_relocation(swc, &cmd->cid);
cmd->type = type;
swc->commit(swc);
return PIPE_OK;
}
/*
*----------------------------------------------------------------------
*
@ -1371,6 +1416,9 @@ SVGA3D_BeginQuery(struct svga_winsys_context *swc,
{
SVGA3dCmdBeginQuery *cmd;
if (swc->have_gb_objects)
return SVGA3D_BeginGBQuery(swc, type);
cmd = SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_BEGIN_QUERY,
sizeof *cmd,
@ -1387,6 +1435,48 @@ SVGA3D_BeginQuery(struct svga_winsys_context *swc,
}
/*
*----------------------------------------------------------------------
*
* SVGA3D_EndGBQuery--
*
* GB resource version of SVGA3D_EndQuery.
*
* Results:
* None.
*
* Side effects:
* Commits space in the FIFO memory.
*
*----------------------------------------------------------------------
*/
static enum pipe_error
SVGA3D_EndGBQuery(struct svga_winsys_context *swc,
SVGA3dQueryType type, // IN
struct svga_winsys_buffer *buffer) // IN/OUT
{
SVGA3dCmdEndGBQuery *cmd;
cmd = SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_END_GB_QUERY,
sizeof *cmd,
2);
if(!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->context_relocation(swc, &cmd->cid);
cmd->type = type;
swc->mob_relocation(swc, &cmd->mobid, &cmd->offset, buffer,
0, SVGA_RELOC_READ | SVGA_RELOC_WRITE);
swc->commit(swc);
return PIPE_OK;
}
/*
*----------------------------------------------------------------------
*
@ -1410,6 +1500,9 @@ SVGA3D_EndQuery(struct svga_winsys_context *swc,
{
SVGA3dCmdEndQuery *cmd;
if (swc->have_gb_objects)
return SVGA3D_EndGBQuery(swc, type, buffer);
cmd = SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_END_QUERY,
sizeof *cmd,
@ -1421,7 +1514,49 @@ SVGA3D_EndQuery(struct svga_winsys_context *swc,
cmd->type = type;
swc->region_relocation(swc, &cmd->guestResult, buffer, 0,
SVGA_RELOC_WRITE);
SVGA_RELOC_READ | SVGA_RELOC_WRITE);
swc->commit(swc);
return PIPE_OK;
}
/*
*----------------------------------------------------------------------
*
* SVGA3D_WaitForGBQuery--
*
* GB resource version of SVGA3D_WaitForQuery.
*
* Results:
* None.
*
* Side effects:
* Commits space in the FIFO memory.
*
*----------------------------------------------------------------------
*/
static enum pipe_error
SVGA3D_WaitForGBQuery(struct svga_winsys_context *swc,
SVGA3dQueryType type, // IN
struct svga_winsys_buffer *buffer) // IN/OUT
{
SVGA3dCmdWaitForGBQuery *cmd;
cmd = SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_WAIT_FOR_GB_QUERY,
sizeof *cmd,
2);
if(!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->context_relocation(swc, &cmd->cid);
cmd->type = type;
swc->mob_relocation(swc, &cmd->mobid, &cmd->offset, buffer,
0, SVGA_RELOC_READ | SVGA_RELOC_WRITE);
swc->commit(swc);
@ -1457,6 +1592,9 @@ SVGA3D_WaitForQuery(struct svga_winsys_context *swc,
{
SVGA3dCmdWaitForQuery *cmd;
if (swc->have_gb_objects)
return SVGA3D_WaitForGBQuery(swc, type, buffer);
cmd = SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_WAIT_FOR_QUERY,
sizeof *cmd,
@ -1468,7 +1606,415 @@ SVGA3D_WaitForQuery(struct svga_winsys_context *swc,
cmd->type = type;
swc->region_relocation(swc, &cmd->guestResult, buffer, 0,
SVGA_RELOC_WRITE);
SVGA_RELOC_READ | SVGA_RELOC_WRITE);
swc->commit(swc);
return PIPE_OK;
}
enum pipe_error
SVGA3D_DefineGBShader(struct svga_winsys_context *swc,
struct svga_winsys_gb_shader *gbshader,
SVGA3dShaderType type,
uint32 sizeInBytes)
{
SVGA3dCmdDefineGBShader *cmd;
assert(sizeInBytes % 4 == 0);
assert(type == SVGA3D_SHADERTYPE_VS ||
type == SVGA3D_SHADERTYPE_PS);
cmd = SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_DEFINE_GB_SHADER,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->shader_relocation(swc, &cmd->shid, NULL, NULL, gbshader);
cmd->type = type;
cmd->sizeInBytes = sizeInBytes;
swc->commit(swc);
return PIPE_OK;
}
enum pipe_error
SVGA3D_BindGBShader(struct svga_winsys_context *swc,
struct svga_winsys_gb_shader *gbshader)
{
SVGA3dCmdBindGBShader *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_BIND_GB_SHADER,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->shader_relocation(swc, &cmd->shid, &cmd->mobid,
&cmd->offsetInBytes, gbshader);
swc->commit(swc);
return PIPE_OK;
}
enum pipe_error
SVGA3D_SetGBShader(struct svga_winsys_context *swc,
SVGA3dShaderType type, // IN
struct svga_winsys_gb_shader *gbshader)
{
SVGA3dCmdSetShader *cmd;
cmd = SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_SET_SHADER,
sizeof *cmd,
2); /* two relocations */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->context_relocation(swc, &cmd->cid);
cmd->type = type;
if (gbshader)
swc->shader_relocation(swc, &cmd->shid, NULL, NULL, gbshader);
else
cmd->shid = SVGA_ID_INVALID;
swc->commit(swc);
return PIPE_OK;
}
enum pipe_error
SVGA3D_DestroyGBShader(struct svga_winsys_context *swc,
struct svga_winsys_gb_shader *gbshader)
{
SVGA3dCmdDestroyGBShader *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_DESTROY_GB_SHADER,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->shader_relocation(swc, &cmd->shid, NULL, NULL, gbshader);
swc->commit(swc);
return PIPE_OK;
}
/**
* \param flags mask of SVGA_RELOC_READ / _WRITE
*/
enum pipe_error
SVGA3D_BindGBSurface(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface)
{
SVGA3dCmdBindGBSurface *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_BIND_GB_SURFACE,
sizeof *cmd,
2); /* two relocations */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->surface_relocation(swc, &cmd->sid, &cmd->mobid, surface,
SVGA_RELOC_READ | SVGA_RELOC_INTERNAL);
swc->commit(swc);
return PIPE_OK;
}
enum pipe_error
SVGA3D_DefineGBContext(struct svga_winsys_context *swc)
{
SVGA3dCmdDefineGBContext *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_DEFINE_GB_CONTEXT,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->context_relocation(swc, &cmd->cid);
swc->commit(swc);
return PIPE_OK;
}
enum pipe_error
SVGA3D_DestroyGBContext(struct svga_winsys_context *swc)
{
SVGA3dCmdDestroyGBContext *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_DESTROY_GB_CONTEXT,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->context_relocation(swc, &cmd->cid);
swc->commit(swc);
return PIPE_OK;
}
enum pipe_error
SVGA3D_BindGBContext(struct svga_winsys_context *swc)
{
SVGA3dCmdBindGBContext *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_BIND_GB_CONTEXT,
sizeof *cmd,
2); /* two relocations */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->context_relocation(swc, &cmd->cid);
swc->context_relocation(swc, &cmd->mobid);
cmd->validContents = 0; /* XXX pass as a parameter? */
swc->commit(swc);
return PIPE_OK;
}
enum pipe_error
SVGA3D_InvalidateGBContext(struct svga_winsys_context *swc)
{
SVGA3dCmdInvalidateGBContext *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_INVALIDATE_GB_CONTEXT,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->context_relocation(swc, &cmd->cid);
swc->commit(swc);
return PIPE_OK;
}
/**
* Update an image in a guest-backed surface.
* (Inform the device that the guest-contents have been updated.)
*/
enum pipe_error
SVGA3D_UpdateGBImage(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface,
const SVGA3dBox *box,
unsigned face, unsigned mipLevel)
{
SVGA3dCmdUpdateGBImage *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_UPDATE_GB_IMAGE,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->surface_relocation(swc, &cmd->image.sid, NULL, surface,
SVGA_RELOC_WRITE | SVGA_RELOC_INTERNAL);
cmd->image.face = face;
cmd->image.mipmap = mipLevel;
cmd->box = *box;
swc->commit(swc);
return PIPE_OK;
}
/**
* Update an entire guest-backed surface.
* (Inform the device that the guest-contents have been updated.)
*/
enum pipe_error
SVGA3D_UpdateGBSurface(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface)
{
SVGA3dCmdUpdateGBSurface *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_UPDATE_GB_SURFACE,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->surface_relocation(swc, &cmd->sid, NULL, surface,
SVGA_RELOC_WRITE | SVGA_RELOC_INTERNAL);
swc->commit(swc);
return PIPE_OK;
}
/**
* Readback an image in a guest-backed surface.
* (Request the device to flush the dirty contents into the guest.)
*/
enum pipe_error
SVGA3D_ReadbackGBImage(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface,
unsigned face, unsigned mipLevel)
{
SVGA3dCmdReadbackGBImage *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_READBACK_GB_IMAGE,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->surface_relocation(swc, &cmd->image.sid, NULL, surface,
SVGA_RELOC_READ | SVGA_RELOC_INTERNAL);
cmd->image.face = face;
cmd->image.mipmap = mipLevel;
swc->commit(swc);
return PIPE_OK;
}
/**
* Readback an entire guest-backed surface.
* (Request the device to flush the dirty contents into the guest.)
*/
enum pipe_error
SVGA3D_ReadbackGBSurface(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface)
{
SVGA3dCmdReadbackGBSurface *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_READBACK_GB_SURFACE,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->surface_relocation(swc, &cmd->sid, NULL, surface,
SVGA_RELOC_READ | SVGA_RELOC_INTERNAL);
swc->commit(swc);
return PIPE_OK;
}
enum pipe_error
SVGA3D_ReadbackGBImagePartial(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface,
unsigned face, unsigned mipLevel,
const SVGA3dBox *box,
bool invertBox)
{
SVGA3dCmdReadbackGBImagePartial *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_READBACK_GB_IMAGE_PARTIAL,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->surface_relocation(swc, &cmd->image.sid, NULL, surface,
SVGA_RELOC_READ | SVGA_RELOC_INTERNAL);
cmd->image.face = face;
cmd->image.mipmap = mipLevel;
cmd->box = *box;
cmd->invertBox = invertBox;
swc->commit(swc);
return PIPE_OK;
}
enum pipe_error
SVGA3D_InvalidateGBImagePartial(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface,
unsigned face, unsigned mipLevel,
const SVGA3dBox *box,
bool invertBox)
{
SVGA3dCmdInvalidateGBImagePartial *cmd =
SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_INVALIDATE_GB_IMAGE_PARTIAL,
sizeof *cmd,
1); /* one relocation */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
swc->surface_relocation(swc, &cmd->image.sid, NULL, surface,
SVGA_RELOC_READ | SVGA_RELOC_INTERNAL);
cmd->image.face = face;
cmd->image.mipmap = mipLevel;
cmd->box = *box;
cmd->invertBox = invertBox;
swc->commit(swc);
return PIPE_OK;
}
enum pipe_error
SVGA3D_SetGBShaderConstsInline(struct svga_winsys_context *swc,
unsigned regStart,
unsigned numRegs,
SVGA3dShaderType shaderType,
SVGA3dShaderConstType constType,
const void *values)
{
SVGA3dCmdSetGBShaderConstInline *cmd;
assert(numRegs > 0);
cmd = SVGA3D_FIFOReserve(swc,
SVGA_3D_CMD_SET_GB_SHADERCONSTS_INLINE,
sizeof *cmd + numRegs * sizeof(float[4]),
0); /* no relocations */
if (!cmd)
return PIPE_ERROR_OUT_OF_MEMORY;
cmd->cid = swc->cid;
cmd->regStart = regStart;
cmd->shaderType = shaderType;
cmd->constType = constType;
memcpy(&cmd[1], values, numRegs * sizeof(float[4]));
swc->commit(swc);

View File

@ -46,6 +46,7 @@ struct svga_transfer;
struct svga_winsys_context;
struct svga_winsys_buffer;
struct svga_winsys_surface;
struct svga_winsys_gb_shader;
/*
@ -223,6 +224,91 @@ SVGA3D_SetShader(struct svga_winsys_context *swc,
SVGA3dShaderType type, uint32 shid);
/*
* Guest-backed surface functions
*/
enum pipe_error
SVGA3D_DefineGBShader(struct svga_winsys_context *swc,
struct svga_winsys_gb_shader *gbshader,
SVGA3dShaderType type,
uint32 sizeInBytes);
enum pipe_error
SVGA3D_BindGBShader(struct svga_winsys_context *swc,
struct svga_winsys_gb_shader *gbshader);
enum pipe_error
SVGA3D_SetGBShader(struct svga_winsys_context *swc,
SVGA3dShaderType type,
struct svga_winsys_gb_shader *gbshader);
enum pipe_error
SVGA3D_DestroyGBShader(struct svga_winsys_context *swc,
struct svga_winsys_gb_shader *gbshader);
enum pipe_error
SVGA3D_BindGBSurface(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface);
enum pipe_error
SVGA3D_DefineGBContext(struct svga_winsys_context *swc);
enum pipe_error
SVGA3D_DestroyGBContext(struct svga_winsys_context *swc);
enum pipe_error
SVGA3D_BindGBContext(struct svga_winsys_context *swc);
enum pipe_error
SVGA3D_InvalidateGBContext(struct svga_winsys_context *swc);
enum pipe_error
SVGA3D_UpdateGBImage(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface,
const SVGA3dBox *box,
unsigned face, unsigned mipLevel);
enum pipe_error
SVGA3D_UpdateGBSurface(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface);
enum pipe_error
SVGA3D_ReadbackGBImage(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface,
unsigned face, unsigned mipLevel);
enum pipe_error
SVGA3D_ReadbackGBSurface(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface);
enum pipe_error
SVGA3D_ReadbackGBImagePartial(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface,
unsigned face, unsigned mipLevel,
const SVGA3dBox *box,
bool invertBox);
enum pipe_error
SVGA3D_InvalidateGBImagePartial(struct svga_winsys_context *swc,
struct svga_winsys_surface *surface,
unsigned face, unsigned mipLevel,
const SVGA3dBox *box,
bool invertBox);
enum pipe_error
SVGA3D_SetGBShaderConstsInline(struct svga_winsys_context *swc,
unsigned regStart,
unsigned numRegs,
SVGA3dShaderType shaderType,
SVGA3dShaderConstType constType,
const void *values);
/*
* Queries
*/