diff options
author | Neha Bhende <bhenden@vmware.com> | 2020-05-26 21:26:42 +0530 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-06-05 06:36:54 +0000 |
commit | ccb4ea5a43e89fcc93fff98c881639223f1538e5 (patch) | |
tree | a0d5d9406586cf7c67b4fa0609337d275ec6cf21 /src/gallium/winsys/svga | |
parent | 52ce25be8741e42ddae279f33296ed8e6835ce56 (diff) |
svga: Add GL4.1(compatibility profile) support in svga driver
This patch is a squash commit of a very long in-house patch series.
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
Signed-off-by: Neha Bhende <bhenden@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5317>
Diffstat (limited to 'src/gallium/winsys/svga')
-rw-r--r-- | src/gallium/winsys/svga/drm/vmw_context.c | 16 | ||||
-rw-r--r-- | src/gallium/winsys/svga/drm/vmw_shader.c | 53 | ||||
-rw-r--r-- | src/gallium/winsys/svga/drm/vmw_shader.h | 8 |
3 files changed, 69 insertions, 8 deletions
diff --git a/src/gallium/winsys/svga/drm/vmw_context.c b/src/gallium/winsys/svga/drm/vmw_context.c index 432f9afcd1f..da7506e7797 100644 --- a/src/gallium/winsys/svga/drm/vmw_context.c +++ b/src/gallium/winsys/svga/drm/vmw_context.c @@ -65,6 +65,7 @@ #define VMW_MAX_SURF_MEM_FACTOR 2 + struct vmw_buffer_relocation { struct pb_buffer *buffer; @@ -701,20 +702,19 @@ vmw_svga_winsys_vgpu10_shader_create(struct svga_winsys_context *swc, uint32 shaderId, SVGA3dShaderType shaderType, const uint32 *bytecode, - uint32 bytecodeLen) + uint32 bytecodeLen, + const SVGA3dDXShaderSignatureHeader *sgnInfo, + uint32 sgnLen) { struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); struct vmw_svga_winsys_shader *shader; - struct svga_winsys_gb_shader *gb_shader = - vmw_svga_winsys_shader_create(&vswc->vws->base, shaderType, bytecode, - bytecodeLen); - if (!gb_shader) + shader = vmw_svga_shader_create(&vswc->vws->base, shaderType, bytecode, + bytecodeLen, sgnInfo, sgnLen); + if (!shader) return NULL; - shader = vmw_svga_winsys_shader(gb_shader); shader->shid = shaderId; - - return gb_shader; + return svga_winsys_shader(shader); } /** diff --git a/src/gallium/winsys/svga/drm/vmw_shader.c b/src/gallium/winsys/svga/drm/vmw_shader.c index 56ffdd16f79..dbf63c59234 100644 --- a/src/gallium/winsys/svga/drm/vmw_shader.c +++ b/src/gallium/winsys/svga/drm/vmw_shader.c @@ -28,7 +28,9 @@ #include "util/u_debug.h" #include "util/u_memory.h" +#include "vmw_context.h" #include "vmw_shader.h" +#include "vmw_buffer.h" #include "vmw_screen.h" void @@ -63,3 +65,54 @@ vmw_svga_winsys_shader_reference(struct vmw_svga_winsys_shader **pdst, *pdst = src; } + + +/** + * A helper function to create a shader object and upload the + * shader bytecode and signature if specified to the shader memory. + */ +struct vmw_svga_winsys_shader * +vmw_svga_shader_create(struct svga_winsys_screen *sws, + SVGA3dShaderType type, + const uint32 *bytecode, + uint32 bytecodeLen, + const SVGA3dDXShaderSignatureHeader *sgnInfo, + uint32 sgnLen) +{ + struct vmw_svga_winsys_shader *shader; + void *map; + + shader = CALLOC_STRUCT(vmw_svga_winsys_shader); + if (!shader) + return NULL; + + pipe_reference_init(&shader->refcnt, 1); + p_atomic_set(&shader->validated, 0); + shader->screen = vmw_winsys_screen(sws); + shader->buf = sws->buffer_create(sws, 64, + SVGA_BUFFER_USAGE_SHADER, + bytecodeLen + sgnLen); + if (!shader->buf) { + FREE(shader); + return NULL; + } + + map = sws->buffer_map(sws, shader->buf, PIPE_TRANSFER_WRITE); + if (!map) { + FREE(shader); + return NULL; + } + + /* copy the shader bytecode */ + memcpy(map, bytecode, bytecodeLen); + + /* if shader signature is specified, append it to the bytecode. */ + if (sgnLen) { + assert(sws->have_sm5); + map = (char *)map + bytecodeLen; + memcpy(map, sgnInfo, sgnLen); + } + sws->buffer_unmap(sws, shader->buf); + + return shader; +} diff --git a/src/gallium/winsys/svga/drm/vmw_shader.h b/src/gallium/winsys/svga/drm/vmw_shader.h index ae557bcc8e4..a62a814471d 100644 --- a/src/gallium/winsys/svga/drm/vmw_shader.h +++ b/src/gallium/winsys/svga/drm/vmw_shader.h @@ -65,4 +65,12 @@ void vmw_svga_winsys_shader_reference(struct vmw_svga_winsys_shader **pdst, struct vmw_svga_winsys_shader *src); +struct vmw_svga_winsys_shader * +vmw_svga_shader_create(struct svga_winsys_screen *sws, + SVGA3dShaderType type, + const uint32 *bytecode, + uint32 bytecodeLen, + const SVGA3dDXShaderSignatureHeader *sgnInfo, + uint32 sgnLen); + #endif /* VMW_SHADER_H_ */ |