summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/svga
diff options
context:
space:
mode:
authorNeha Bhende <bhenden@vmware.com>2020-05-26 21:26:42 +0530
committerMarge Bot <eric+marge@anholt.net>2020-06-05 06:36:54 +0000
commitccb4ea5a43e89fcc93fff98c881639223f1538e5 (patch)
treea0d5d9406586cf7c67b4fa0609337d275ec6cf21 /src/gallium/winsys/svga
parent52ce25be8741e42ddae279f33296ed8e6835ce56 (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.c16
-rw-r--r--src/gallium/winsys/svga/drm/vmw_shader.c53
-rw-r--r--src/gallium/winsys/svga/drm/vmw_shader.h8
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_ */