svga: move translated vertex declaration types into svga_velems_state
Now only translate the formats once in svga_create_vertex_elements_state(). And rename the array and use the proper SVGA3dDeclType type. Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
@@ -200,6 +200,7 @@ struct svga_sampler_state {
|
||||
struct svga_velems_state {
|
||||
unsigned count;
|
||||
struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS];
|
||||
SVGA3dDeclType decl_type[PIPE_MAX_ATTRIBS]; /**< vertex attrib formats */
|
||||
};
|
||||
|
||||
/* Use to calculate differences between state emitted to hardware and
|
||||
@@ -304,8 +305,6 @@ struct svga_hw_draw_state
|
||||
*/
|
||||
struct svga_sw_state
|
||||
{
|
||||
unsigned ve_format[PIPE_MAX_ATTRIBS]; /* NEW_VELEMENT */
|
||||
|
||||
/* which parts we need */
|
||||
boolean need_swvfetch;
|
||||
boolean need_pipeline;
|
||||
|
||||
@@ -68,6 +68,41 @@ static void svga_set_index_buffer(struct pipe_context *pipe,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Given a gallium vertex element format, return the corresponding SVGA3D
|
||||
* format. Return SVGA3D_DECLTYPE_MAX for unsupported gallium formats.
|
||||
*/
|
||||
static SVGA3dDeclType
|
||||
translate_vertex_format(enum pipe_format format)
|
||||
{
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_R32_FLOAT: return SVGA3D_DECLTYPE_FLOAT1;
|
||||
case PIPE_FORMAT_R32G32_FLOAT: return SVGA3D_DECLTYPE_FLOAT2;
|
||||
case PIPE_FORMAT_R32G32B32_FLOAT: return SVGA3D_DECLTYPE_FLOAT3;
|
||||
case PIPE_FORMAT_R32G32B32A32_FLOAT: return SVGA3D_DECLTYPE_FLOAT4;
|
||||
case PIPE_FORMAT_B8G8R8A8_UNORM: return SVGA3D_DECLTYPE_D3DCOLOR;
|
||||
case PIPE_FORMAT_R8G8B8A8_USCALED: return SVGA3D_DECLTYPE_UBYTE4;
|
||||
case PIPE_FORMAT_R16G16_SSCALED: return SVGA3D_DECLTYPE_SHORT2;
|
||||
case PIPE_FORMAT_R16G16B16A16_SSCALED: return SVGA3D_DECLTYPE_SHORT4;
|
||||
case PIPE_FORMAT_R8G8B8A8_UNORM: return SVGA3D_DECLTYPE_UBYTE4N;
|
||||
case PIPE_FORMAT_R16G16_SNORM: return SVGA3D_DECLTYPE_SHORT2N;
|
||||
case PIPE_FORMAT_R16G16B16A16_SNORM: return SVGA3D_DECLTYPE_SHORT4N;
|
||||
case PIPE_FORMAT_R16G16_UNORM: return SVGA3D_DECLTYPE_USHORT2N;
|
||||
case PIPE_FORMAT_R16G16B16A16_UNORM: return SVGA3D_DECLTYPE_USHORT4N;
|
||||
case PIPE_FORMAT_R10G10B10X2_USCALED: return SVGA3D_DECLTYPE_UDEC3;
|
||||
case PIPE_FORMAT_R10G10B10X2_SNORM: return SVGA3D_DECLTYPE_DEC3N;
|
||||
case PIPE_FORMAT_R16G16_FLOAT: return SVGA3D_DECLTYPE_FLOAT16_2;
|
||||
case PIPE_FORMAT_R16G16B16A16_FLOAT: return SVGA3D_DECLTYPE_FLOAT16_4;
|
||||
|
||||
default:
|
||||
/* There are many formats without hardware support. This case
|
||||
* will be hit regularly, meaning we'll need swvfetch.
|
||||
*/
|
||||
return SVGA3D_DECLTYPE_MAX;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
svga_create_vertex_elements_state(struct pipe_context *pipe,
|
||||
unsigned count,
|
||||
@@ -77,8 +112,15 @@ svga_create_vertex_elements_state(struct pipe_context *pipe,
|
||||
assert(count <= PIPE_MAX_ATTRIBS);
|
||||
velems = (struct svga_velems_state *) MALLOC(sizeof(struct svga_velems_state));
|
||||
if (velems) {
|
||||
unsigned i;
|
||||
|
||||
velems->count = count;
|
||||
memcpy(velems->velem, attribs, sizeof(*attribs) * count);
|
||||
|
||||
/* Translate Gallium vertex format to SVGA3dDeclType */
|
||||
for (i = 0; i < count; i++) {
|
||||
velems->decl_type[i] = translate_vertex_format(attribs[i].src_format);
|
||||
}
|
||||
}
|
||||
return velems;
|
||||
}
|
||||
|
||||
@@ -31,41 +31,6 @@
|
||||
#include "svga_hw_reg.h"
|
||||
|
||||
|
||||
/**
|
||||
* Given a gallium vertex element format, return the corresponding SVGA3D
|
||||
* format. Return SVGA3D_DECLTYPE_MAX for unsupported gallium formats.
|
||||
*/
|
||||
static INLINE SVGA3dDeclType
|
||||
svga_translate_vertex_format(enum pipe_format format)
|
||||
{
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_R32_FLOAT: return SVGA3D_DECLTYPE_FLOAT1;
|
||||
case PIPE_FORMAT_R32G32_FLOAT: return SVGA3D_DECLTYPE_FLOAT2;
|
||||
case PIPE_FORMAT_R32G32B32_FLOAT: return SVGA3D_DECLTYPE_FLOAT3;
|
||||
case PIPE_FORMAT_R32G32B32A32_FLOAT: return SVGA3D_DECLTYPE_FLOAT4;
|
||||
case PIPE_FORMAT_B8G8R8A8_UNORM: return SVGA3D_DECLTYPE_D3DCOLOR;
|
||||
case PIPE_FORMAT_R8G8B8A8_USCALED: return SVGA3D_DECLTYPE_UBYTE4;
|
||||
case PIPE_FORMAT_R16G16_SSCALED: return SVGA3D_DECLTYPE_SHORT2;
|
||||
case PIPE_FORMAT_R16G16B16A16_SSCALED: return SVGA3D_DECLTYPE_SHORT4;
|
||||
case PIPE_FORMAT_R8G8B8A8_UNORM: return SVGA3D_DECLTYPE_UBYTE4N;
|
||||
case PIPE_FORMAT_R16G16_SNORM: return SVGA3D_DECLTYPE_SHORT2N;
|
||||
case PIPE_FORMAT_R16G16B16A16_SNORM: return SVGA3D_DECLTYPE_SHORT4N;
|
||||
case PIPE_FORMAT_R16G16_UNORM: return SVGA3D_DECLTYPE_USHORT2N;
|
||||
case PIPE_FORMAT_R16G16B16A16_UNORM: return SVGA3D_DECLTYPE_USHORT4N;
|
||||
case PIPE_FORMAT_R10G10B10X2_USCALED: return SVGA3D_DECLTYPE_UDEC3;
|
||||
case PIPE_FORMAT_R10G10B10X2_SNORM: return SVGA3D_DECLTYPE_DEC3N;
|
||||
case PIPE_FORMAT_R16G16_FLOAT: return SVGA3D_DECLTYPE_FLOAT16_2;
|
||||
case PIPE_FORMAT_R16G16B16A16_FLOAT: return SVGA3D_DECLTYPE_FLOAT16_4;
|
||||
|
||||
default:
|
||||
/* There are many formats without hardware support. This case
|
||||
* will be hit regularly, meaning we'll need swvfetch.
|
||||
*/
|
||||
return SVGA3D_DECLTYPE_MAX;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static enum pipe_error
|
||||
update_need_swvfetch(struct svga_context *svga, unsigned dirty)
|
||||
{
|
||||
@@ -78,8 +43,7 @@ update_need_swvfetch(struct svga_context *svga, unsigned dirty)
|
||||
}
|
||||
|
||||
for (i = 0; i < svga->curr.velems->count; i++) {
|
||||
svga->state.sw.ve_format[i] = svga_translate_vertex_format(svga->curr.velems->velem[i].src_format);
|
||||
if (svga->state.sw.ve_format[i] == SVGA3D_DECLTYPE_MAX) {
|
||||
if (svga->curr.velems->decl_type[i] == SVGA3D_DECLTYPE_MAX) {
|
||||
/* Unsupported format - use software fetch */
|
||||
need_swvfetch = TRUE;
|
||||
break;
|
||||
|
||||
@@ -100,7 +100,7 @@ emit_hw_vs_vdecl(struct svga_context *svga, unsigned dirty)
|
||||
|
||||
/* SVGA_NEW_VELEMENT
|
||||
*/
|
||||
decl.identity.type = svga->state.sw.ve_format[i];
|
||||
decl.identity.type = svga->curr.velems->decl_type[i];
|
||||
decl.identity.method = SVGA3D_DECLMETHOD_DEFAULT;
|
||||
decl.identity.usage = usage;
|
||||
decl.identity.usageIndex = index;
|
||||
|
||||
Reference in New Issue
Block a user