|
@@ -3406,6 +3406,7 @@ typedef struct sg_frame_stats {
|
|
_SG_LOGITEM_XMACRO(GL_FRAMEBUFFER_STATUS_INCOMPLETE_MULTISAMPLE, "framebuffer completeness check failed with GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE (gl)") \
|
|
_SG_LOGITEM_XMACRO(GL_FRAMEBUFFER_STATUS_INCOMPLETE_MULTISAMPLE, "framebuffer completeness check failed with GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE (gl)") \
|
|
_SG_LOGITEM_XMACRO(GL_FRAMEBUFFER_STATUS_UNKNOWN, "framebuffer completeness check failed (unknown reason) (gl)") \
|
|
_SG_LOGITEM_XMACRO(GL_FRAMEBUFFER_STATUS_UNKNOWN, "framebuffer completeness check failed (unknown reason) (gl)") \
|
|
_SG_LOGITEM_XMACRO(D3D11_CREATE_BUFFER_FAILED, "CreateBuffer() failed (d3d11)") \
|
|
_SG_LOGITEM_XMACRO(D3D11_CREATE_BUFFER_FAILED, "CreateBuffer() failed (d3d11)") \
|
|
|
|
+ _SG_LOGITEM_XMACRO(D3D11_CREATE_BUFFER_SRV_FAILED, "CreateShaderResourceView() failed for storage buffer (d3d11)") \
|
|
_SG_LOGITEM_XMACRO(D3D11_CREATE_DEPTH_TEXTURE_UNSUPPORTED_PIXEL_FORMAT, "pixel format not supported for depth-stencil texture (d3d11)") \
|
|
_SG_LOGITEM_XMACRO(D3D11_CREATE_DEPTH_TEXTURE_UNSUPPORTED_PIXEL_FORMAT, "pixel format not supported for depth-stencil texture (d3d11)") \
|
|
_SG_LOGITEM_XMACRO(D3D11_CREATE_DEPTH_TEXTURE_FAILED, "CreateTexture2D() failed for depth-stencil texture (d3d11)") \
|
|
_SG_LOGITEM_XMACRO(D3D11_CREATE_DEPTH_TEXTURE_FAILED, "CreateTexture2D() failed for depth-stencil texture (d3d11)") \
|
|
_SG_LOGITEM_XMACRO(D3D11_CREATE_2D_TEXTURE_UNSUPPORTED_PIXEL_FORMAT, "pixel format not supported for 2d-, cube- or array-texture (d3d11)") \
|
|
_SG_LOGITEM_XMACRO(D3D11_CREATE_2D_TEXTURE_UNSUPPORTED_PIXEL_FORMAT, "pixel format not supported for 2d-, cube- or array-texture (d3d11)") \
|
|
@@ -3497,6 +3498,7 @@ typedef struct sg_frame_stats {
|
|
_SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_DATA, "immutable buffers must be initialized with data (sg_buffer_desc.data.ptr and sg_buffer_desc.data.size)") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_DATA, "immutable buffers must be initialized with data (sg_buffer_desc.data.ptr and sg_buffer_desc.data.size)") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_DATA_SIZE, "immutable buffer data size differs from buffer size") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_DATA_SIZE, "immutable buffer data size differs from buffer size") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_NO_DATA, "dynamic/stream usage buffers cannot be initialized with data") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_NO_DATA, "dynamic/stream usage buffers cannot be initialized with data") \
|
|
|
|
+ _SG_LOGITEM_XMACRO(VALIDATE_BUFFERDESC_STORAGEBUFFER_SIZE_MULTIPLE_4, "size of storage buffers must be a multiple of 4") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDATA_NODATA, "sg_image_data: no data (.ptr and/or .size is zero)") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDATA_NODATA, "sg_image_data: no data (.ptr and/or .size is zero)") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDATA_DATA_SIZE, "sg_image_data: data size doesn't match expected surface size") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDATA_DATA_SIZE, "sg_image_data: data size doesn't match expected surface size") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDESC_CANARY, "sg_image_desc not initialized") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDESC_CANARY, "sg_image_desc not initialized") \
|
|
@@ -3544,11 +3546,10 @@ typedef struct sg_frame_stats {
|
|
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_IMAGE_NOT_REFERENCED_BY_IMAGE_SAMPLER_PAIRS, "shader stage: one or more images are note referenced by (sg_shader_desc.vs|fs.image_sampler_pairs[].image_slot)") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_IMAGE_NOT_REFERENCED_BY_IMAGE_SAMPLER_PAIRS, "shader stage: one or more images are note referenced by (sg_shader_desc.vs|fs.image_sampler_pairs[].image_slot)") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_SAMPLER_NOT_REFERENCED_BY_IMAGE_SAMPLER_PAIRS, "shader stage: one or more samplers are not referenced by image-sampler-pairs (sg_shader_desc.vs|fs.image_sampler_pairs[].sampler_slot)") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_SAMPLER_NOT_REFERENCED_BY_IMAGE_SAMPLER_PAIRS, "shader stage: one or more samplers are not referenced by image-sampler-pairs (sg_shader_desc.vs|fs.image_sampler_pairs[].sampler_slot)") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_NO_CONT_IMAGE_SAMPLER_PAIRS, "shader stage image-sampler-pairs must occupy continuous slots (sg_shader_desc.vs|fs.image_samplers[])") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_NO_CONT_IMAGE_SAMPLER_PAIRS, "shader stage image-sampler-pairs must occupy continuous slots (sg_shader_desc.vs|fs.image_samplers[])") \
|
|
- _SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_ATTR_SEMANTICS, "D3D11 backend requires vertex attribute semantics") \
|
|
|
|
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_ATTR_STRING_TOO_LONG, "vertex attribute name/semantic string too long (max len 16)") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_SHADERDESC_ATTR_STRING_TOO_LONG, "vertex attribute name/semantic string too long (max len 16)") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_CANARY, "sg_pipeline_desc not initialized") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_CANARY, "sg_pipeline_desc not initialized") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_SHADER, "sg_pipeline_desc.shader missing or invalid") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_SHADER, "sg_pipeline_desc.shader missing or invalid") \
|
|
- _SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_NO_ATTRS, "sg_pipeline_desc.layout.attrs is empty or not continuous") \
|
|
|
|
|
|
+ _SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_NO_CONT_ATTRS, "sg_pipeline_desc.layout.attrs is not continuous") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_LAYOUT_STRIDE4, "sg_pipeline_desc.layout.buffers[].stride must be multiple of 4") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_LAYOUT_STRIDE4, "sg_pipeline_desc.layout.buffers[].stride must be multiple of 4") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_ATTR_SEMANTICS, "D3D11 missing vertex attribute semantics in shader") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_PIPELINEDESC_ATTR_SEMANTICS, "D3D11 missing vertex attribute semantics in shader") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_ATTACHMENTSDESC_CANARY, "sg_attachments_desc not initialized") \
|
|
_SG_LOGITEM_XMACRO(VALIDATE_ATTACHMENTSDESC_CANARY, "sg_attachments_desc not initialized") \
|
|
@@ -5299,6 +5300,7 @@ typedef struct {
|
|
_sg_buffer_common_t cmn;
|
|
_sg_buffer_common_t cmn;
|
|
struct {
|
|
struct {
|
|
ID3D11Buffer* buf;
|
|
ID3D11Buffer* buf;
|
|
|
|
+ ID3D11ShaderResourceView* srv;
|
|
} d3d11;
|
|
} d3d11;
|
|
} _sg_d3d11_buffer_t;
|
|
} _sg_d3d11_buffer_t;
|
|
typedef _sg_d3d11_buffer_t _sg_buffer_t;
|
|
typedef _sg_d3d11_buffer_t _sg_buffer_t;
|
|
@@ -9262,6 +9264,10 @@ _SOKOL_PRIVATE void _sg_gl_update_image(_sg_image_t* img, const sg_image_data* d
|
|
// >>d3d11 backend
|
|
// >>d3d11 backend
|
|
#elif defined(SOKOL_D3D11)
|
|
#elif defined(SOKOL_D3D11)
|
|
|
|
|
|
|
|
+#define _SG_D3D11_MAX_SHADERSTAGE_SRVS (32)
|
|
|
|
+#define _SG_D3D11_SHADERSTAGE_IMAGE_SRV_OFFSET (0)
|
|
|
|
+#define _SG_D3D11_SHADERSTAGE_BUFFER_SRV_OFFSET (16)
|
|
|
|
+
|
|
#if defined(__cplusplus)
|
|
#if defined(__cplusplus)
|
|
#define _sg_d3d11_AddRef(self) (self)->AddRef()
|
|
#define _sg_d3d11_AddRef(self) (self)->AddRef()
|
|
#else
|
|
#else
|
|
@@ -9657,6 +9663,34 @@ _SOKOL_PRIVATE D3D11_USAGE _sg_d3d11_usage(sg_usage usg) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+_SOKOL_PRIVATE UINT _sg_d3d11_buffer_bind_flags(sg_buffer_type t) {
|
|
|
|
+ switch (t) {
|
|
|
|
+ case SG_BUFFERTYPE_VERTEXBUFFER:
|
|
|
|
+ return D3D11_BIND_VERTEX_BUFFER;
|
|
|
|
+ case SG_BUFFERTYPE_INDEXBUFFER:
|
|
|
|
+ return D3D11_BIND_INDEX_BUFFER;
|
|
|
|
+ case SG_BUFFERTYPE_STORAGEBUFFER:
|
|
|
|
+ // FIXME: for compute shaders we'd want UNORDERED_ACCESS?
|
|
|
|
+ return D3D11_BIND_SHADER_RESOURCE;
|
|
|
|
+ default:
|
|
|
|
+ SOKOL_UNREACHABLE;
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+_SOKOL_PRIVATE UINT _sg_d3d11_buffer_misc_flags(sg_buffer_type t) {
|
|
|
|
+ switch (t) {
|
|
|
|
+ case SG_BUFFERTYPE_VERTEXBUFFER:
|
|
|
|
+ case SG_BUFFERTYPE_INDEXBUFFER:
|
|
|
|
+ return 0;
|
|
|
|
+ case SG_BUFFERTYPE_STORAGEBUFFER:
|
|
|
|
+ return D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS;
|
|
|
|
+ default:
|
|
|
|
+ SOKOL_UNREACHABLE;
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
_SOKOL_PRIVATE UINT _sg_d3d11_cpu_access_flags(sg_usage usg) {
|
|
_SOKOL_PRIVATE UINT _sg_d3d11_cpu_access_flags(sg_usage usg) {
|
|
switch (usg) {
|
|
switch (usg) {
|
|
case SG_USAGE_IMMUTABLE:
|
|
case SG_USAGE_IMMUTABLE:
|
|
@@ -9965,7 +9999,7 @@ _SOKOL_PRIVATE void _sg_d3d11_init_caps(void) {
|
|
_sg.features.image_clamp_to_border = true;
|
|
_sg.features.image_clamp_to_border = true;
|
|
_sg.features.mrt_independent_blend_state = true;
|
|
_sg.features.mrt_independent_blend_state = true;
|
|
_sg.features.mrt_independent_write_mask = true;
|
|
_sg.features.mrt_independent_write_mask = true;
|
|
- _sg.features.storage_buffer = false;
|
|
|
|
|
|
+ _sg.features.storage_buffer = true;
|
|
|
|
|
|
_sg.limits.max_image_size_2d = 16 * 1024;
|
|
_sg.limits.max_image_size_2d = 16 * 1024;
|
|
_sg.limits.max_image_size_cube = 16 * 1024;
|
|
_sg.limits.max_image_size_cube = 16 * 1024;
|
|
@@ -10024,13 +10058,15 @@ _SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_buffer(_sg_buffer_t* buf, cons
|
|
if (injected) {
|
|
if (injected) {
|
|
buf->d3d11.buf = (ID3D11Buffer*) desc->d3d11_buffer;
|
|
buf->d3d11.buf = (ID3D11Buffer*) desc->d3d11_buffer;
|
|
_sg_d3d11_AddRef(buf->d3d11.buf);
|
|
_sg_d3d11_AddRef(buf->d3d11.buf);
|
|
|
|
+ // FIXME: for storage buffers also need to inject resource view
|
|
} else {
|
|
} else {
|
|
- D3D11_BUFFER_DESC d3d11_desc;
|
|
|
|
- _sg_clear(&d3d11_desc, sizeof(d3d11_desc));
|
|
|
|
- d3d11_desc.ByteWidth = (UINT)buf->cmn.size;
|
|
|
|
- d3d11_desc.Usage = _sg_d3d11_usage(buf->cmn.usage);
|
|
|
|
- d3d11_desc.BindFlags = buf->cmn.type == SG_BUFFERTYPE_VERTEXBUFFER ? D3D11_BIND_VERTEX_BUFFER : D3D11_BIND_INDEX_BUFFER;
|
|
|
|
- d3d11_desc.CPUAccessFlags = _sg_d3d11_cpu_access_flags(buf->cmn.usage);
|
|
|
|
|
|
+ D3D11_BUFFER_DESC d3d11_buf_desc;
|
|
|
|
+ _sg_clear(&d3d11_buf_desc, sizeof(d3d11_buf_desc));
|
|
|
|
+ d3d11_buf_desc.ByteWidth = (UINT)buf->cmn.size;
|
|
|
|
+ d3d11_buf_desc.Usage = _sg_d3d11_usage(buf->cmn.usage);
|
|
|
|
+ d3d11_buf_desc.BindFlags = _sg_d3d11_buffer_bind_flags(buf->cmn.type);
|
|
|
|
+ d3d11_buf_desc.CPUAccessFlags = _sg_d3d11_cpu_access_flags(buf->cmn.usage);
|
|
|
|
+ d3d11_buf_desc.MiscFlags = _sg_d3d11_buffer_misc_flags(buf->cmn.type);
|
|
D3D11_SUBRESOURCE_DATA* init_data_ptr = 0;
|
|
D3D11_SUBRESOURCE_DATA* init_data_ptr = 0;
|
|
D3D11_SUBRESOURCE_DATA init_data;
|
|
D3D11_SUBRESOURCE_DATA init_data;
|
|
_sg_clear(&init_data, sizeof(init_data));
|
|
_sg_clear(&init_data, sizeof(init_data));
|
|
@@ -10039,11 +10075,30 @@ _SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_buffer(_sg_buffer_t* buf, cons
|
|
init_data.pSysMem = desc->data.ptr;
|
|
init_data.pSysMem = desc->data.ptr;
|
|
init_data_ptr = &init_data;
|
|
init_data_ptr = &init_data;
|
|
}
|
|
}
|
|
- HRESULT hr = _sg_d3d11_CreateBuffer(_sg.d3d11.dev, &d3d11_desc, init_data_ptr, &buf->d3d11.buf);
|
|
|
|
|
|
+ HRESULT hr = _sg_d3d11_CreateBuffer(_sg.d3d11.dev, &d3d11_buf_desc, init_data_ptr, &buf->d3d11.buf);
|
|
if (!(SUCCEEDED(hr) && buf->d3d11.buf)) {
|
|
if (!(SUCCEEDED(hr) && buf->d3d11.buf)) {
|
|
_SG_ERROR(D3D11_CREATE_BUFFER_FAILED);
|
|
_SG_ERROR(D3D11_CREATE_BUFFER_FAILED);
|
|
return SG_RESOURCESTATE_FAILED;
|
|
return SG_RESOURCESTATE_FAILED;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // for storage buffers need to create a view object
|
|
|
|
+ if (buf->cmn.type == SG_BUFFERTYPE_STORAGEBUFFER) {
|
|
|
|
+ // FIXME: currently only shader-resource-view, in future also UAV
|
|
|
|
+ // storage buffer size must be multiple of 4
|
|
|
|
+ SOKOL_ASSERT(_sg_multiple_u64(buf->cmn.size, 4));
|
|
|
|
+ D3D11_SHADER_RESOURCE_VIEW_DESC d3d11_srv_desc;
|
|
|
|
+ _sg_clear(&d3d11_srv_desc, sizeof(d3d11_srv_desc));
|
|
|
|
+ d3d11_srv_desc.Format = DXGI_FORMAT_R32_TYPELESS;
|
|
|
|
+ d3d11_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;
|
|
|
|
+ d3d11_srv_desc.BufferEx.FirstElement = 0;
|
|
|
|
+ d3d11_srv_desc.BufferEx.NumElements = buf->cmn.size / 4;
|
|
|
|
+ d3d11_srv_desc.BufferEx.Flags = D3D11_BUFFEREX_SRV_FLAG_RAW;
|
|
|
|
+ hr = _sg_d3d11_CreateShaderResourceView(_sg.d3d11.dev, (ID3D11Resource*)buf->d3d11.buf, &d3d11_srv_desc, &buf->d3d11.srv);
|
|
|
|
+ if (!(SUCCEEDED(hr) && buf->d3d11.srv)) {
|
|
|
|
+ _SG_ERROR(D3D11_CREATE_BUFFER_SRV_FAILED);
|
|
|
|
+ return SG_RESOURCESTATE_FAILED;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return SG_RESOURCESTATE_VALID;
|
|
return SG_RESOURCESTATE_VALID;
|
|
}
|
|
}
|
|
@@ -10053,6 +10108,9 @@ _SOKOL_PRIVATE void _sg_d3d11_discard_buffer(_sg_buffer_t* buf) {
|
|
if (buf->d3d11.buf) {
|
|
if (buf->d3d11.buf) {
|
|
_sg_d3d11_Release(buf->d3d11.buf);
|
|
_sg_d3d11_Release(buf->d3d11.buf);
|
|
}
|
|
}
|
|
|
|
+ if (buf->d3d11.srv) {
|
|
|
|
+ _sg_d3d11_Release(buf->d3d11.srv);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
_SOKOL_PRIVATE void _sg_d3d11_fill_subres_data(const _sg_image_t* img, const sg_image_data* data) {
|
|
_SOKOL_PRIVATE void _sg_d3d11_fill_subres_data(const _sg_image_t* img, const sg_image_data* data) {
|
|
@@ -10509,15 +10567,17 @@ _SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_pipeline(_sg_pipeline_t* pip,
|
|
pip->d3d11.vb_strides[layout_index] = 0;
|
|
pip->d3d11.vb_strides[layout_index] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- hr = _sg_d3d11_CreateInputLayout(_sg.d3d11.dev,
|
|
|
|
- d3d11_comps, // pInputElementDesc
|
|
|
|
- (UINT)attr_index, // NumElements
|
|
|
|
- shd->d3d11.vs_blob, // pShaderByteCodeWithInputSignature
|
|
|
|
- shd->d3d11.vs_blob_length, // BytecodeLength
|
|
|
|
- &pip->d3d11.il);
|
|
|
|
- if (!(SUCCEEDED(hr) && pip->d3d11.il)) {
|
|
|
|
- _SG_ERROR(D3D11_CREATE_INPUT_LAYOUT_FAILED);
|
|
|
|
- return SG_RESOURCESTATE_FAILED;
|
|
|
|
|
|
+ if (attr_index > 0) {
|
|
|
|
+ hr = _sg_d3d11_CreateInputLayout(_sg.d3d11.dev,
|
|
|
|
+ d3d11_comps, // pInputElementDesc
|
|
|
|
+ (UINT)attr_index, // NumElements
|
|
|
|
+ shd->d3d11.vs_blob, // pShaderByteCodeWithInputSignature
|
|
|
|
+ shd->d3d11.vs_blob_length, // BytecodeLength
|
|
|
|
+ &pip->d3d11.il);
|
|
|
|
+ if (!(SUCCEEDED(hr) && pip->d3d11.il)) {
|
|
|
|
+ _SG_ERROR(D3D11_CREATE_INPUT_LAYOUT_FAILED);
|
|
|
|
+ return SG_RESOURCESTATE_FAILED;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// create rasterizer state
|
|
// create rasterizer state
|
|
@@ -10916,7 +10976,7 @@ _SOKOL_PRIVATE void _sg_d3d11_apply_pipeline(_sg_pipeline_t* pip) {
|
|
SOKOL_ASSERT(pip);
|
|
SOKOL_ASSERT(pip);
|
|
SOKOL_ASSERT(pip->shader && (pip->cmn.shader_id.id == pip->shader->slot.id));
|
|
SOKOL_ASSERT(pip->shader && (pip->cmn.shader_id.id == pip->shader->slot.id));
|
|
SOKOL_ASSERT(_sg.d3d11.ctx);
|
|
SOKOL_ASSERT(_sg.d3d11.ctx);
|
|
- SOKOL_ASSERT(pip->d3d11.rs && pip->d3d11.bs && pip->d3d11.dss && pip->d3d11.il);
|
|
|
|
|
|
+ SOKOL_ASSERT(pip->d3d11.rs && pip->d3d11.bs && pip->d3d11.dss);
|
|
|
|
|
|
_sg.d3d11.cur_pipeline = pip;
|
|
_sg.d3d11.cur_pipeline = pip;
|
|
_sg.d3d11.cur_pipeline_id.id = pip->slot.id;
|
|
_sg.d3d11.cur_pipeline_id.id = pip->slot.id;
|
|
@@ -10952,8 +11012,8 @@ _SOKOL_PRIVATE bool _sg_d3d11_apply_bindings(_sg_bindings_t* bnd) {
|
|
ID3D11Buffer* d3d11_ib = bnd->ib ? bnd->ib->d3d11.buf : 0;
|
|
ID3D11Buffer* d3d11_ib = bnd->ib ? bnd->ib->d3d11.buf : 0;
|
|
ID3D11Buffer* d3d11_vbs[SG_MAX_VERTEX_BUFFERS] = {0};
|
|
ID3D11Buffer* d3d11_vbs[SG_MAX_VERTEX_BUFFERS] = {0};
|
|
UINT d3d11_vb_offsets[SG_MAX_VERTEX_BUFFERS] = {0};
|
|
UINT d3d11_vb_offsets[SG_MAX_VERTEX_BUFFERS] = {0};
|
|
- ID3D11ShaderResourceView* d3d11_vs_srvs[SG_MAX_SHADERSTAGE_IMAGES] = {0};
|
|
|
|
- ID3D11ShaderResourceView* d3d11_fs_srvs[SG_MAX_SHADERSTAGE_IMAGES] = {0};
|
|
|
|
|
|
+ ID3D11ShaderResourceView* d3d11_vs_srvs[_SG_D3D11_MAX_SHADERSTAGE_SRVS] = {0};
|
|
|
|
+ ID3D11ShaderResourceView* d3d11_fs_srvs[_SG_D3D11_MAX_SHADERSTAGE_SRVS] = {0};
|
|
ID3D11SamplerState* d3d11_vs_smps[SG_MAX_SHADERSTAGE_SAMPLERS] = {0};
|
|
ID3D11SamplerState* d3d11_vs_smps[SG_MAX_SHADERSTAGE_SAMPLERS] = {0};
|
|
ID3D11SamplerState* d3d11_fs_smps[SG_MAX_SHADERSTAGE_SAMPLERS] = {0};
|
|
ID3D11SamplerState* d3d11_fs_smps[SG_MAX_SHADERSTAGE_SAMPLERS] = {0};
|
|
for (int i = 0; i < bnd->num_vbs; i++) {
|
|
for (int i = 0; i < bnd->num_vbs; i++) {
|
|
@@ -10963,11 +11023,19 @@ _SOKOL_PRIVATE bool _sg_d3d11_apply_bindings(_sg_bindings_t* bnd) {
|
|
}
|
|
}
|
|
for (int i = 0; i < bnd->num_vs_imgs; i++) {
|
|
for (int i = 0; i < bnd->num_vs_imgs; i++) {
|
|
SOKOL_ASSERT(bnd->vs_imgs[i]->d3d11.srv);
|
|
SOKOL_ASSERT(bnd->vs_imgs[i]->d3d11.srv);
|
|
- d3d11_vs_srvs[i] = bnd->vs_imgs[i]->d3d11.srv;
|
|
|
|
|
|
+ d3d11_vs_srvs[_SG_D3D11_SHADERSTAGE_IMAGE_SRV_OFFSET + i] = bnd->vs_imgs[i]->d3d11.srv;
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < bnd->num_vs_sbufs; i++) {
|
|
|
|
+ SOKOL_ASSERT(bnd->vs_sbufs[i]->d3d11.srv);
|
|
|
|
+ d3d11_vs_srvs[_SG_D3D11_SHADERSTAGE_BUFFER_SRV_OFFSET + i] = bnd->vs_sbufs[i]->d3d11.srv;
|
|
}
|
|
}
|
|
for (int i = 0; i < bnd->num_fs_imgs; i++) {
|
|
for (int i = 0; i < bnd->num_fs_imgs; i++) {
|
|
SOKOL_ASSERT(bnd->fs_imgs[i]->d3d11.srv);
|
|
SOKOL_ASSERT(bnd->fs_imgs[i]->d3d11.srv);
|
|
- d3d11_fs_srvs[i] = bnd->fs_imgs[i]->d3d11.srv;
|
|
|
|
|
|
+ d3d11_fs_srvs[_SG_D3D11_SHADERSTAGE_IMAGE_SRV_OFFSET + i] = bnd->fs_imgs[i]->d3d11.srv;
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < bnd->num_fs_sbufs; i++) {
|
|
|
|
+ SOKOL_ASSERT(bnd->fs_sbufs[i]->d3d11.srv);
|
|
|
|
+ d3d11_fs_srvs[_SG_D3D11_SHADERSTAGE_BUFFER_SRV_OFFSET + i] = bnd->fs_sbufs[i]->d3d11.srv;
|
|
}
|
|
}
|
|
for (int i = 0; i < bnd->num_vs_smps; i++) {
|
|
for (int i = 0; i < bnd->num_vs_smps; i++) {
|
|
SOKOL_ASSERT(bnd->vs_smps[i]->d3d11.smp);
|
|
SOKOL_ASSERT(bnd->vs_smps[i]->d3d11.smp);
|
|
@@ -10979,8 +11047,8 @@ _SOKOL_PRIVATE bool _sg_d3d11_apply_bindings(_sg_bindings_t* bnd) {
|
|
}
|
|
}
|
|
_sg_d3d11_IASetVertexBuffers(_sg.d3d11.ctx, 0, SG_MAX_VERTEX_BUFFERS, d3d11_vbs, bnd->pip->d3d11.vb_strides, d3d11_vb_offsets);
|
|
_sg_d3d11_IASetVertexBuffers(_sg.d3d11.ctx, 0, SG_MAX_VERTEX_BUFFERS, d3d11_vbs, bnd->pip->d3d11.vb_strides, d3d11_vb_offsets);
|
|
_sg_d3d11_IASetIndexBuffer(_sg.d3d11.ctx, d3d11_ib, bnd->pip->d3d11.index_format, (UINT)bnd->ib_offset);
|
|
_sg_d3d11_IASetIndexBuffer(_sg.d3d11.ctx, d3d11_ib, bnd->pip->d3d11.index_format, (UINT)bnd->ib_offset);
|
|
- _sg_d3d11_VSSetShaderResources(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_IMAGES, d3d11_vs_srvs);
|
|
|
|
- _sg_d3d11_PSSetShaderResources(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_IMAGES, d3d11_fs_srvs);
|
|
|
|
|
|
+ _sg_d3d11_VSSetShaderResources(_sg.d3d11.ctx, 0, _SG_D3D11_MAX_SHADERSTAGE_SRVS, d3d11_vs_srvs);
|
|
|
|
+ _sg_d3d11_PSSetShaderResources(_sg.d3d11.ctx, 0, _SG_D3D11_MAX_SHADERSTAGE_SRVS, d3d11_fs_srvs);
|
|
_sg_d3d11_VSSetSamplers(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_SAMPLERS, d3d11_vs_smps);
|
|
_sg_d3d11_VSSetSamplers(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_SAMPLERS, d3d11_vs_smps);
|
|
_sg_d3d11_PSSetSamplers(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_SAMPLERS, d3d11_fs_smps);
|
|
_sg_d3d11_PSSetSamplers(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_SAMPLERS, d3d11_fs_smps);
|
|
_sg_stats_add(d3d11.bindings.num_ia_set_vertex_buffers, 1);
|
|
_sg_stats_add(d3d11.bindings.num_ia_set_vertex_buffers, 1);
|
|
@@ -15716,6 +15784,9 @@ _SOKOL_PRIVATE bool _sg_validate_buffer_desc(const sg_buffer_desc* desc) {
|
|
} else {
|
|
} else {
|
|
_SG_VALIDATE(0 == desc->data.ptr, VALIDATE_BUFFERDESC_NO_DATA);
|
|
_SG_VALIDATE(0 == desc->data.ptr, VALIDATE_BUFFERDESC_NO_DATA);
|
|
}
|
|
}
|
|
|
|
+ if (desc->type == SG_BUFFERTYPE_STORAGEBUFFER) {
|
|
|
|
+ _SG_VALIDATE(_sg_multiple_u64(desc->size, 4), VALIDATE_BUFFERDESC_STORAGEBUFFER_SIZE_MULTIPLE_4);
|
|
|
|
+ }
|
|
return _sg_validate_end();
|
|
return _sg_validate_end();
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
@@ -15853,9 +15924,6 @@ _SOKOL_PRIVATE bool _sg_validate_shader_desc(const sg_shader_desc* desc) {
|
|
_sg_validate_begin();
|
|
_sg_validate_begin();
|
|
_SG_VALIDATE(desc->_start_canary == 0, VALIDATE_SHADERDESC_CANARY);
|
|
_SG_VALIDATE(desc->_start_canary == 0, VALIDATE_SHADERDESC_CANARY);
|
|
_SG_VALIDATE(desc->_end_canary == 0, VALIDATE_SHADERDESC_CANARY);
|
|
_SG_VALIDATE(desc->_end_canary == 0, VALIDATE_SHADERDESC_CANARY);
|
|
- #if defined(SOKOL_D3D11)
|
|
|
|
- _SG_VALIDATE(0 != desc->attrs[0].sem_name, VALIDATE_SHADERDESC_ATTR_SEMANTICS);
|
|
|
|
- #endif
|
|
|
|
#if defined(SOKOL_GLCORE33) || defined(SOKOL_GLES3) || defined(SOKOL_WGPU)
|
|
#if defined(SOKOL_GLCORE33) || defined(SOKOL_GLES3) || defined(SOKOL_WGPU)
|
|
// on GL or WebGPU, must provide shader source code
|
|
// on GL or WebGPU, must provide shader source code
|
|
_SG_VALIDATE(0 != desc->vs.source, VALIDATE_SHADERDESC_SOURCE);
|
|
_SG_VALIDATE(0 != desc->vs.source, VALIDATE_SHADERDESC_SOURCE);
|
|
@@ -16041,7 +16109,7 @@ _SOKOL_PRIVATE bool _sg_validate_pipeline_desc(const sg_pipeline_desc* desc) {
|
|
attrs_cont = false;
|
|
attrs_cont = false;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
- _SG_VALIDATE(attrs_cont, VALIDATE_PIPELINEDESC_NO_ATTRS);
|
|
|
|
|
|
+ _SG_VALIDATE(attrs_cont, VALIDATE_PIPELINEDESC_NO_CONT_ATTRS);
|
|
SOKOL_ASSERT(a_state->buffer_index < SG_MAX_VERTEX_BUFFERS);
|
|
SOKOL_ASSERT(a_state->buffer_index < SG_MAX_VERTEX_BUFFERS);
|
|
#if defined(SOKOL_D3D11)
|
|
#if defined(SOKOL_D3D11)
|
|
// on D3D11, semantic names (and semantic indices) must be provided
|
|
// on D3D11, semantic names (and semantic indices) must be provided
|